CS168:HTTP、缓存与 HTTPS
HTTP 是客户端与服务器之间的请求—响应协议。浏览器请求一个资源,服务器返回状态码、响应头和内容。GET 常用于读取资源,POST 常用于提交数据;Host、Content-Type 等头部则补充请求或内容的元信息。
连接和缓存
早期 HTTP/1.0 常为每次请求建立新 TCP 连接;持久连接让多个请求复用同一连接,减少重复握手。HTTP/2 仍运行在 TCP 上;HTTP/3 使用 QUIC(基于 UDP),不能简单概括成“所有 HTTP 都在 TCP 上”。
浏览器可以缓存资源,代理缓存和内容分发网络(CDN)则能让多个用户复用靠近他们的内容副本。缓存是否可用、保留多久,主要由 Cache-Control 等响应头约束;缓存不是任意中间设备都能擅自长期保存内容。
Anycast 允许多个地点宣告相同的 IP 前缀,路由系统通常把用户带到拓扑上较近的服务节点。它适合无连接查询或可在不同节点间独立处理的服务;如果一个有状态连接被路由到另一台没有该连接状态的服务器,连接就可能中断。
图中客户端原本经 R1、R2 连到 S1;链路变化后,路由改经 R3 到 S2。由于 S2 没有原 T ...
CS168:DNS 如何查找域名
DNS(Domain Name System)把域名映射到 IP 地址,也保存邮件服务器等其他记录。它不是一台存放全世界域名的中央服务器,而是一套分层、分布式的名称系统。
一次递归查询
浏览器需要解析 www.berkeley.edu 时,设备上的存根解析器(stub resolver)通常把问题交给递归解析器。若答案不在缓存里,递归解析器会逐级查询:
根服务器指出 .edu 顶级域的名称服务器。
.edu 服务器指出 berkeley.edu 的权威名称服务器。
权威服务器返回该域名对应的记录。
这像寄信时逐级查找地址:根目录只告诉你下一层由谁管理,不必知道每个具体住址。递归解析器拿到结果后返回给客户端,并可按记录的 TTL 缓存一段时间,减少后续查询。
记录与传输
DNS 记录包含名称、类型、值和缓存时长等信息。常见的 A 记录指向 IPv4 地址,AAAA 记录指向 IPv6 地址,MX 记录描述邮件服务器。
常规 DNS 查询通常使用 UDP 53 端口;响应过大、区域传送或其他需要可靠字节流的情形会使用 TCP。UDP 查询丢失时,解析器可以重试;并非所有 DNS 通信都 ...
CS168:TCP 拥塞控制
流量控制和拥塞控制解决的是不同问题:前者根据接收方通告窗口保护接收端;后者通过拥塞窗口(cwnd)限制网络中的在途数据,避免路由器队列持续堆积。
怎样发现拥塞
端到端拥塞控制通常从丢包或时延变化推断网络状况。丢包信号直观,但不一定都由拥塞造成;时延会随着队列变长而上升,不过更难区分网络中的其他变化。路由器也可以显式提供拥塞信号,帮助发送端更早调整速率。
AIMD 与慢启动
拥塞避免阶段常用 AIMD(Additive Increase, Multiplicative Decrease):网络正常时逐步增加 cwnd;检测到拥塞时按比例减小。多个发送端共享瓶颈时,这种“缓慢试探、遇堵退让”的做法能在利用带宽和稳定性之间折中。
下图把两个发送端的速率画在坐标轴上:若瓶颈容量归一化为 1,x + y = 1 是容量边界;超过边界会拥塞,远低于边界则有带宽未被利用。
TCP 慢启动则从较小窗口开始,在收到确认后较快增加发送量;达到慢启动阈值或检测到拥塞后,进入更谨慎的增长阶段。它不是先无限制发送再猜带宽,而是逐渐探测可用容量。
收到多个重复 ACK 时,发送端可能推断某段数据丢失并快速重传。 ...
CS168:TCP 如何提供可靠传输
IP 尽力转发数据报,但可能丢包、重复或乱序。TCP 在两台端系统之间提供可靠、有序的字节流;丢包恢复和顺序整理由通信端完成,而不是由每台中间路由器保存连接状态。
序号、确认与重传
TCP 给字节流中的数据编号。接收方用确认号(ACK)表示“下一个期望收到的字节序号”;这种累计确认也意味着此前的字节都已连续到达。发送方会缓存尚未确认的数据,并根据往返时间设置重传计时器,超时后重发。
若接收方发现中间有缺口,后续数据仍可先缓存。重复 ACK 让发送方知道仍缺少某段数据,达到条件时可以提前重传,而不必总等计时器超时。
下图用累计确认说明了这个过程:在示例中,确认号停在 2,发送方收到多个重复 ACK 后重传缺失的数据段。
窗口与速率限制
一次只发送一个数据段会让长距离链路闲置,所以 TCP 使用滑动窗口,在等待确认期间继续发送数据。窗口至少受两项限制:接收方通告窗口(避免压垮接收端)和拥塞窗口(避免给网络造成过多负载)。实际可发送的数据量受两者中较小者约束。
带宽时延积(BDP)可以估计“让链路保持忙碌”所需的在途数据量:
1BDP = 链路带宽 × 往返时延
发送窗口太小会浪费链路容量 ...
CS168:ARP、DHCP 与 NAT
设备连上局域网后,要先获得网络配置,再找到下一跳的链路层地址。以新加入校园 Wi-Fi 的笔记本为例:DHCP 帮它取得 IP 配置;要发送第一个数据包时,ARP 帮它查出默认网关的 MAC 地址。
DHCP:取得网络配置
DHCP 通常通过 DORA 流程分配租约:客户端广播 Discover,服务器回复 Offer,客户端 Request 选择一份配置,服务器用 Acknowledge 确认。配置通常包括 IP 地址、子网掩码、默认网关和 DNS 解析器。IPv4 DHCP 使用 UDP,服务器监听端口 67,客户端使用端口 68。
IPv6 有邻居发现(Neighbor Discovery)和 SLAAC(无状态地址自动配置)等机制。路由器可以通告网络前缀,主机据此生成本地 IPv6 地址;IPv6 的邻居解析也由 ICMPv6 邻居发现完成,而不是使用 IPv4 的 ARP。
ARP:找到同一链路上的 MAC 地址
发送主机先判断目的 IP 是否在本地子网。如果在,就查询目的主机的 MAC;如果不在,就查询默认网关的 MAC,把以太网帧交给网关,再由路由器继续转发。
以太网广播 ...
CS168:以太网、交换机与生成树
同一个局域网里的设备需要共享链路。以太网帧使用 MAC 地址标识本地链路上的发送方和接收方;常见 MAC 地址长 48 位,例如 f8:ff:c2:2b:36:16。MAC 地址和 IP 地址用途不同:IP 负责跨网络寻址,MAC 地址负责当前链路上的帧交付。
以太网帧会携带源 MAC、目的 MAC 和上层协议类型等字段,帧尾的校验字段用于检测传输错误。
交换机怎样学会转发
学习型交换机不需要预先知道每台主机的位置。收到帧时,它会记录“源 MAC 地址是从哪个端口进来的”。以后若要转发给这个地址,就把帧送到对应端口。
如果目的 MAC 尚未出现在转发表中,交换机通常会把帧从其他端口泛洪出去;广播帧则发送给同一广播域内的设备。设备收到单播帧后,会检查目标 MAC 是否属于自己,不匹配就忽略。
像校园楼里的走廊一样,多个交换机之间保留冗余通路能应对链路故障;但若这些连接形成环路,未知单播和广播帧可能不断绕圈复制,造成广播风暴。
STP 如何避免二层环路
生成树协议(Spanning Tree Protocol,STP)让交换机在物理上保留冗余链路、逻辑上阻塞其中一部分,使转发拓扑没有环路 ...
CS168:IP 寻址、路由器与 BGP
路由器收到 IP 数据包后,要根据目的 IP 决定下一跳。这个工作可以分成两层:控制平面通过路由协议学习和计算路径;数据平面查转发表,尽快把包送到对应端口。可以把它想成物流中心:控制平面规划目的地对应的分拣路线,数据平面负责处理每一件包裹。
IP 前缀与最长匹配
IPv4 地址有 32 位,常写成四组十进制数,例如 192.168.1.25。CIDR 用斜杠标出网络前缀长度:192.168.1.0/24 表示前 24 位是网络部分,剩余 8 位用于该网络中的地址。对应的子网掩码是 255.255.255.0。
路由表中的前缀可能重叠。若表里有 10.0.0.0/8 和 10.1.2.0/24,发往 10.1.2.7 的包应选更具体的 /24 路由。这叫最长前缀匹配(Longest Prefix Match)。它让路由器可以用一条较短的汇总路由覆盖许多地址,同时为少数网络提供更具体的路径。
IPv6 将地址扩展为 128 位,以十六进制分组表示,例如 2001:db8::1。连续的零分组可以压缩成 ::,但一个地址中最多只能使用一次。
从域内路由到域间路由
互联网由许多自治系统(Auto ...
CS168:链路状态路由协议
路由器要把分组送往目的地,首先得知道网络里有哪些路由器、它们之间如何连接,以及经过每条链路的代价。链路状态路由(Link-State Routing)的做法是:让路由器收集全网拓扑信息,再各自计算到目的地的最短路径。
从邻居到全网拓扑
每台路由器先发现直接相连的邻居,并确定到邻居的链路代价。常见的做法是通过 Hello 消息确认邻居关系。
之后,路由器生成链路状态通告(Link-State Advertisement,LSA),描述自己连接了哪些邻居以及相应的链路代价,并把通告泛洪给网络中的其他路由器。这样,每台路由器都能逐步建立一份全网拓扑数据库。
泛洪需要处理重复和过期信息。LSA 通常带有序列号和生存时间:序列号帮助路由器识别更新版本,生存时间则让旧信息最终失效。拓扑变化时可以发布新通告,此外也会定期刷新信息。
这里的“一致”不是指所有路由器在同一瞬间看到完全相同的内容。拓扑更新需要时间传播;网络稳定并且通告成功扩散后,各路由器的数据库才会收敛到相同的拓扑视图。
用 Dijkstra 计算路径
有了拓扑数据库后,每台路由器都可以把自己作为起点,运行 Dijkstra 等最短路径算 ...
吉林大学常用网站
1.
CS168-Intro
Computer Networks
互联网设计原理与链路基础(Internet Design Principles & Links)
1. Internet Architecture(互联网体系结构)
互联网设计目标:
支持大规模网络连接
保持可扩展性
支持不同网络互联
在故障情况下保持通信能力
互联网核心设计原则:
去中心化控制(Decentralized Control)
尽力而为服务(Best-Effort Service)
绕过故障(Route Around Trouble)
简单网络核心(Dumb Infrastructure)
端到端原则(End-to-End Principle)
分层(Layering)
窄腰模型(Narrow Waist)
2. Decentralized Control(去中心化控制)
互联网没有中央控制中心。
每个网络设备:
独立运行
根据自身信息进行决策
不依赖单个控制节点
优点:
可扩展
高可靠
支持不同组织加入网络
SDN(Software-Defined Networking)
将网络控制逻辑集中到软件控制器。
优 ...
