1. 现在我们已经讨论了本章中的链路层,以及前面几章中的网络层、传输层和应用层,我们的协议栈之旅就到此结束了!在本书的开头(第1.1节),我们写道“本书的大部分内容都与计算机网络协议有关”,在前五章中,我们肯定已经看到事实的确如此!在进入本书第二部分的主题章节之前,我们想通过对我们到目前为止所了解的协议进行一个完整的整体视图来结束我们的协议栈之旅。那么,采取这种“大局”观点的一种方法就是确定许多(许多!)。即使是满足最简单的请求(下载网页)所涉及的协议。图6.32说明了我们的设定:学生Bob将一台笔记本电脑连接到学校的以太网交换机,并下载一个网页(比如www.google.com的主页)。正如我们现在所知道的,为了满足这个看似简单的要求,有很多事情在“幕后”进行。本章末尾的Wireshark实验室更详细地检查了包含多个类似场景中涉及的数据包的跟踪文件。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12377925/1638191086299-b699353d-1071-4973-8da6-4b99db2e974e.png#clientId=u9f8fecd1-99ab-4&from=paste&height=583&id=u0c57ae33&margin=%5Bobject%20Object%5D&name=image.png&originHeight=583&originWidth=903&originalType=binary&ratio=1&size=122089&status=done&style=none&taskId=u2985fbf6-a7bd-4c71-970c-ad3bcfc746d&width=903)<br />**Figure 6.32 ♦ A day in the life of a Web page request: Network setting and actions**<br />**图6.32♦网页请求生命周期中的一天:网络设置和操作**

6.7.1 起步阶段:DHCP、UDP、IP和以太网 Getting Started: DHCP, UDP, IP, and Ethernet

假设Bob启动他的笔记本电脑,然后将其连接到连接到学校以太网交换机的以太网电缆,而以太网交换机又连接到学校的路由器,如图6.32所示。学校的路由器连接到ISP(在本例中为comcast.net)。在本例中,comcast.net为学校提供DNS服务;因此,DNS服务器驻留在Comcast网络中,而不是学校网络中。我们假设DHCP服务器在路由器内运行,这是经常发生的情况。
当Bob第一次将他的笔记本电脑连接到网络时,如果没有IP地址,他不能做任何事情(例如,下载网页)。因此,Bob的笔记本电脑采取的第一个与网络相关的操作是运行DHCP协议,以从本地DHCP服务器获取IP地址和其他信息:

  1. Bob笔记本电脑上的操作系统创建一条DHCP请求报文(DHCP request message)(第4.3.3节),并将此报文放入目的端口67(DHCP服务器)和源端口68(DHCP客户端)的UDP段(UDP segment)(第3.3节)中。由于Bob的笔记本电脑还没有IP地址,因此UDP数据段随后被放置在IP数据报(IP datagram)(第4.3.1节)中,目的地址为广播IP(255.255.255.255),源IP地址为0.0.0.0。
  2. 然后,将包含DHCP请求报文的IP数据报放入以太网帧(Ethernet frame)中(第6.4.2节)。以太网帧的目的MAC地址为FF:FF:FF:FF:FF:FF,因此帧将广播到连接到交换机的所有设备(希望包括DHCP服务器);帧的源MAC地址是Bob的笔记本电脑的MAC地址,00:16:D3:23:68:8A。
  3. 包含DHCP请求的广播以太网帧是Bob的笔记本电脑发送到以太网交换机的第一个帧。交换机在所有传出端口(包括连接到路由器的端口)上广播传入帧。
  4. 路由器在其MAC地址为00:22:6B:45:1F:1B的接口上收到包含DHCP请求的广播以太网帧,并从该以太网帧中提取IP数据报。数据报的广播IP目的地址指示该IP数据报应由该节点的上层协议处理,因此数据报的有效载荷(UDP段)被多路分解(demultiplexed)(第3.2节)至UDP,并且从UDP段提取DHCP请求报文。DHCP服务器现在具有DHCP请求报文。
  5. 让我们假设在路由器内运行的DHCP服务器可以在CIDR(第4.3.3节)块68.85.2.0/24中分配IP地址。在本例中,学校内使用的所有IP地址都在康卡斯特的地址块内。假设DHCP服务器将地址68.85.2.101分配给Bob的笔记本电脑。DHCP服务器创建包含此IP地址的DHCP ACK报文(DHCP ACK message)(第4.3.3节),以及DNS服务器的IP地址(68.87.71.226)、默认网关路由器的IP地址(68.85.2.1)和子网块(68.85.2.0/24)(相当于“网络掩码(network mask)”)。DHCP报文放在UDP数据段中,UDP数据段放在IP数据报中,IP数据报放在以太网帧中。以太网帧具有路由器到家庭网络接口的源MAC地址(00:22:6B:45:1F:1B)和Bob笔记本电脑的目的MAC地址(00:16:D3:23:68:8A)。
  6. 路由器将包含DHCP ACK的以太网帧发送(单播)到交换机。因为交换机是自学习的(self-learning)(第6.4.3节),并且之前从Bob的笔记本电脑收到了以太网帧(包含DHCP请求),所以交换机知道只将地址为00:16:D3:23:68:8A的帧转发到通向Bob笔记本电脑的输出端口。
  7. Bob的笔记本电脑接收包含DHCP ACK的以太网帧,从以太网帧中提取IP数据报,从IP数据报中提取UDP数据段,并从UDP数据段中提取DHCP ACK报文。然后,Bob的DHCP客户端记录其IP地址及其DNS服务器的IP地址。它还将默认网关的地址安装到其IP转发表(IP forwarding table)中(4.1节)。Bob的笔记本电脑会将目的地址在其子网68.85.2.0/24之外的所有数据报发送到默认网关。此时,Bob的笔记本电脑已经初始化了其网络组件,并准备开始处理Web页面提取。(请注意,实际上只有第4章中介绍的四个DHCP步骤中的最后两个是必需的。)

    6.7.2 仍在起步阶段:DNS和ARP Still Getting Started: DNS and ARP

    当Bob在他的Web浏览器中输入www.google.com的URL时,他开始了一个漫长的事件链,最终导致Google的主页在他的Web浏览器上显示。Bob的Web浏览器首先创建一个TCP套接字(TCP socket)(第2.7节),该套接字将用于向www.google.com发送HTTP请求(HTTP request)(第2.2节)。为了创建套接字,Bob的笔记本电脑需要知道www.google.com的IP地址。我们在第2.5节中了解到,DNS协议(DNS protocol)用于提供这种名称到IP地址转换服务。

  8. 因此,Bob笔记本电脑上的操作系统会创建一条DNS查询报文(DNS query message)(第2.5.3节),将字符串“www.google.com”放入DNS报文的问题部分。然后,此DNS报文被放入目的端口为53(DNS服务器)的UDP段中。然后,UDP数据段被放置在IP目的地址为68.87.71.226(在步骤5的DHCP ACK中返回的DNS服务器地址)、源IP地址为68.85.2.101的IP数据报中。

  9. 然后,Bob的笔记本电脑将包含DNS查询报文的数据报放入以太网帧。此帧将被发送(在链路层寻址)到Bob学校网络中的网关路由器。但是,即使Bob的笔记本电脑通过上述步骤5中的DHCP ACK报文知道学校网关路由器(68.85.2.1)的IP地址,它也不知道网关路由器的MAC地址。为了获取网关路由器的MAC地址,Bob的笔记本电脑需要使用ARP协议(ARP protocol)(第6.4.1节)。
  10. Bob的笔记本电脑创建目标IP地址为68.85.2.1(默认网关)的ARP查询报文(ARP query message),将ARP报文放入具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,然后将该以太网帧发送到交换机,交换机将该帧传送到所有连接的设备,包括网关路由器。
  11. 网关路由器在通往学校网络的接口上收到包含ARP查询报文的帧,并发现ARP报文中的目标IP地址68.85.2.1与其接口的IP地址匹配。因此,网关路由器准备ARP应答,表明其MAC地址00:22:6B:45:1F:1B对应于IP地址68.85.2.1。它将ARP应答报文(ARP reply message)放入目的地址为00:16:D3:23:68:8A(Bob的笔记本电脑)的以太网帧中,然后将该帧发送到交换机,交换机将该帧传输到Bob的笔记本电脑。
  12. Bob的笔记本电脑收到包含ARP应答报文的帧,并从ARP应答报文中提取网关路由器的MAC地址(00:22:6B:45:1F:1B)。
  13. 鲍勃的笔记本电脑现在可以(终于!)将包含DNS查询的以太网帧发送到网关路由器的MAC地址。请注意,此帧中的IP数据报的IP目的地址为68.87.71.226(DNS服务器),而帧的目的地址为00:22:6B:45:1F:1B(网关路由器)。Bob的笔记本电脑将该帧发送到交换机,交换机将该帧传送到网关路由器。

    6.7.3 仍在起步阶段:到DNS服务器的域内路由 Still Getting Started: Intra-Domain Routing to the DNS Server

  14. 网关路由器(gateway router)接收该帧并提取包含DNS查询的IP数据报。路由器查找该数据报的目的地址(68.87.71.226),并根据其转发表确定该数据报应发送到图6.32中Comcast网络中最左边的路由器。IP数据报放在链路层帧中,该帧适用于连接学校路由器和最左边的Comcast路由器的链路,然后通过此链路发送该帧。

  15. 康卡斯特网络中最左边的路由器接收帧,提取IP数据报,检查数据报的目的地址(68.87.71.226),并从其转发表中确定将数据报转发到DNS服务器的传出接口,该转发表已由康卡斯特的域内协议(intra-domain protocol)(如RIP、OSPF或IS-IS,第5.3节)以及互联网的域间协议BGP(Internet’s inter-domain protocol, BGP)(第5.4节)填写。
  16. 最终,包含DNS查询的IP数据报到达DNS服务器。DNS服务器提取DNS查询报文,在其DNS数据库中查找名称www.google.com(第2.5节),并找到包含www.google.com的IP地址(64.233.169.105)的DNS资源记录(DNS resource record)。(假设它当前缓存在DNS服务器中)。回想一下,这些缓存数据来自google.com的权威DNS服务器(authoritative DNS server)(第2.5.2节)。DNS服务器形成包含此主机名到IP地址映射的DNS应答报文(DNS reply message),并将DNS应答报文放入UDP数据段中,并将该数据段放入发往Bob的笔记本电脑(68.85.2.101)的IP数据报中。该数据报将通过Comcast网络转发回学校的路由器,并从那里通过以太网交换机转发到Bob的笔记本电脑。
  17. Bob的笔记本电脑从DNS报文中提取服务器www.google.com的IP地址。最后,经过大量工作,Bob的笔记本电脑现在可以联系www.google.com服务器了!

    6.7.4 Web客户端-服务器交互:TCP和HTTP Web Client-Server Interaction: TCP and HTTP

  18. 现在Bob的笔记本电脑有www.google.com的IP地址,它可以创建TCP套接字(TCP socket)(第2.7节),该套接字将用于将HTTP GET消息(第2.2.3节)发送到www.google.com。当Bob创建TCP套接字时,Bob笔记本电脑中的TCP必须首先与www.google.com中的TCP执行三次握手(three-way handshake)(3.5.6节)。因此,Bob的笔记本电脑首先使用目的端口80(用于HTTP)创建TCP SYN数据段,将TCP数据段放入目的IP地址为64.233.169.105(www.google.com)的IP数据报中,将数据报放入目的MAC地址为00:22:6B:45:1F:1B(网关路由器)的帧中,然后将帧发送到交换机。

  19. 按照上述步骤14-16,学校网络、康卡斯特网络和谷歌网络中的路由器使用每个路由器中的转发表将包含TCP SYN的数据报转发到www.google.com。回想一下,管理Comcast和Google网络之间域间链路上数据包转发的路由器转发表条目由BGP协议(BGP protocol)确定(第5章)。
  20. 最终,包含TCP SYN的数据报到达www.google.com。从数据报中提取TCP SYN消息,并将其多路分解到与端口80相关联的欢迎套接字(welcome socket)。为Google HTTP服务器和Bob的笔记本电脑之间的TCP连接创建了一个连接套接字(connection socket)(第2.7节)。生成TCP SYNACK(第3.5.6节)数据段,将其放入发往Bob笔记本电脑的数据报中,最后放入适用于连接www.google.com及其第一跳路由器的链路的链路层帧中。
  21. 包含TCP SYNACK数据段的数据报通过Google、Comcast和学校网络转发,最终到达Bob笔记本电脑中的以太网控制器。数据报在操作系统内被多路分解到在步骤18中创建的TCP套接字,该TCP套接字进入连接状态。
  22. 现在用鲍勃笔记本电脑上的套接字(终于!)准备向www.google.com发送字节时,Bob的浏览器创建包含要获取的URL的HTTP GET报文(第2.2.3节)。然后,HTTP GET报文被写入套接字,GET报文成为TCP数据段的有效负载。TCP数据段被放置在数据报中,并按照上面的步骤18-20发送和交付到www.google.com。
  23. www.google.com上的HTTP服务器从TCP套接字读取HTTP GET报文,创建HTTP响应报文(HTTP response message)(第2.2节),将请求的网页内容放在HTTP响应报文的正文中,然后将报文发送到TCP套接字。
  24. 包含HTTP响应报文的数据报通过Google、Comcast和学校网络转发,并到达Bob的笔记本电脑。Bob的Web浏览器程序从套接字读取HTTP响应,从HTTP响应的正文中提取Web页面的html,最后(最后!)显示网页!

我们上面的场景已经覆盖了大量的网络基础!如果您已经理解了上面的大部分或全部示例,那么自从您第一次阅读第1.1节(我们在其中写到“本书的大部分内容都与计算机网络协议有关”)以来,您已经涵盖了很多内容,您可能想知道协议到底是什么!尽管上面的示例看起来很详细,但我们省略了许多可能的附加协议(例如,在学校网关路由器中运行的NAT、对学校网络的无线访问、用于访问学校网络或加密数据段或数据报的安全协议、网络管理协议),以及在公共Internet中可能遇到的注意事项(Web缓存、DNS层次结构)。在本书的第二部分中,我们将介绍其中的许多主题以及更多内容。
最后,我们注意到上面的示例是对我们在本书第一部分中研究过的许多协议的集成和整体,但也是非常“细节”的观点。这个例子更多地关注“如何”而不是“为什么”。要对网络协议的总体设计有一个更广泛、更具反思性的观点,您可能需要重新阅读第4.5节中的“Internet体系结构原则”以及其中的参考资料。