融会贯通:一次Web请求的完整旅程
场景
学习完应用层、运输层、网络层和链路层之后,我们把它们串起来,看看一个最常见的动作背后发生了什么:学生Bob把笔记本电脑用网线接入校园网的以太网交换机,然后在浏览器中输入www.example.com。
校园网是子网198.51.100.0/24,网关路由器的地址为198.51.100.1,它同时运行着DHCP服务器。校园网通过一个ISP接入互联网,ISP中有一台DNS服务器203.0.113.53;Web服务器www.example.com的地址为192.0.2.80,位于另一个网络中。
第一步:DHCP,获得IP地址
刚接入网络时,Bob的笔记本电脑还没有IP地址,什么事也做不了。操作系统生成一个DHCP请求报文,放进源端口为68、目的端口为67的UDP报文段,再放进源地址为0.0.0.0、目的地址为255.255.255.255的IP数据报,最后放进目的MAC地址为FF:FF:FF:FF:FF:FF的以太网帧。交换机把这个广播帧泛洪到所有端口,运行在网关路由器上的DHCP服务器收到它,并回复一个DHCP ACK,其中包含分配给Bob的IP地址、子网掩码、默认网关地址和DNS服务器地址。交换机在转发第一个帧时已经学到了Bob所在的端口,所以回复只会转发给Bob。(完整的DHCP交互包括发现、提供、请求、确认四个报文,这里只画出了一来一回。)
第二步:DNS与ARP,找到Web服务器
浏览器要与www.example.com建立TCP连接,首先需要它的IP地址,因此操作系统构造一个DNS查询,放进目的端口为53的UDP报文段和发往DNS服务器的IP数据报。DNS服务器不在Bob的子网中,这个数据报必须先交给默认网关,可Bob只知道网关的IP地址,不知道它的MAC地址。于是Bob先广播一个ARP查询,网关用ARP响应告诉Bob自己的MAC地址。
现在,DNS查询被封装在以网关MAC地址为目的地址的帧中发出。网关路由器根据转发表把数据报转发给ISP,转发表是由域内选路协议(例如OSPF)和域间选路协议BGP计算出来的。DNS服务器查到www.example.com对应的IP地址192.0.2.80,把DNS回答沿原路发回给Bob。
跟随一次Web请求穿过每一层
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
第三步:TCP与HTTP,取回网页
有了Web服务器的IP地址,浏览器创建一个TCP套接字,向192.0.2.80的80端口发起三次握手:SYN报文段沿着路由器一跳一跳地到达服务器,服务器回复SYNACK,Bob再回复ACK,连接建立。随后浏览器在这条连接上发送HTTP GET请求,服务器把网页放在HTTP响应中发回,浏览器最终把网页显示在屏幕上。
在整个过程中,每一段链路上的帧都不同:每台路由器都会拆掉收到的帧,查转发表,再为下一段链路构造新的帧,所以源、目的MAC地址逐段改变,IP首部中的TTL也逐跳减1;而源、目的IP地址和端口号从头到尾保持不变(假设途中没有NAT)。交换机则对主机透明,它只看以太网首部,不改变帧的内容。
| 设备 | 处理到哪一层 | 读取的内容 | 改变的内容 |
|---|---|---|---|
| 交换机 | 链路层 | 目的MAC地址(并从源MAC地址学习) | 无 |
| 路由器 | 网络层 | 目的IP地址 | 新的帧(MAC地址、CRC),TTL和首部校验和 |
| 端系统 | 应用层 | 每一层的首部 | 无,逐层去掉首部后交给应用 |
一层层地封装与解封装请求
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
小结
一次简单的网页访问,用到了DHCP、ARP、DNS、UDP、TCP、HTTP、IP、OSPF/BGP、以太网等许多协议。每一层只完成自己的任务,并通过封装把上层交来的数据交给下层:应用层关心报文的内容,运输层把报文交付给正确的进程,网络层把数据报从源主机送到目的主机,链路层负责把帧送过每一段链路。正是这种分层设计,让各种不同的网络能够组成统一的互联网。
为“一次Web请求”中的报文排序
Bob接入笔记本电脑并打开www.example.com时,会交换下面十个报文,但它们的顺序被打乱了:
- A. Bob向192.0.2.80:80发送TCP SYN
- B. Bob广播ARP查询,询问198.51.100.1
- C. Bob广播DHCP请求
- D. Bob向203.0.113.53发送DNS查询
- E. 服务器发送HTTP响应
- F. 网关上的DHCP服务器回复DHCP ACK
- G. Bob发送HTTP GET
- H. 网关发送ARP响应
- I. DNS服务器回复
- J. 服务器发送SYNACK
- 把它们按发生的先后排序。
- 说出每个报文所属的协议及其承载方式(UDP或TCP及端口号,或者直接放在以太网帧中)。哪些报文必须广播?为什么?
- Bob已经从DHCP得知了DNS服务器的IP地址,为什么在发送DNS查询之前还要使用ARP?
一次点击究竟要传多少字节?
假设TCP和IP首部各20字节,以太网首部14字节、CRC 4字节、前同步码8字节、帧间隙12字节,MSS为1460字节。
- Bob的HTTP GET有400字节。TCP报文段、IP数据报和以太网帧各有多大?它占用多少字节的线路时间?其中请求本身占多大比例?
- 响应是一个100 KB(102,400字节)的网页。需要多少个TCP报文段?穿过服务器那条100 Mbps以太网链路的有多少字节?需要多长时间(忽略ACK和等待)?
- 如果路径上的其他链路也是以太网,这些数字中哪些会改变?