【计算机网络】从0开始一个到www.google.com的web请求
前言
此文章内容源于计算机网络自顶向下-陈鸣译。
初心是自认为网络上关于计算机网络概念的介绍,没有文章定义看起来舒适。所以权且把一些内容抄写过来。
个人理解以代码段的形式补充在旁边。
问题情景
一名学生Bob将他的便携机与学校的以太网交换机相连,下载一个Web页面(比如www.google.com主页)。如我们所知,为满足这个看起来简单的请求,背后隐藏了许多细节。
1 准备:DHCP、UDP、IP和以太网
我们假定Bob启动他的便携机,然后将其用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连,如图所示。学校的这台路由器与一个ISP 连接,本例中ISP为comcast.net.在本例中,comcast.net为学校提供了DNS服务;所以,DNS服务器驻留在 Comcast网络中而不是学校网络中。我们将假设DHCP服务器运行在路由器中,就像常见情况那样。当Bob首先将其便携机与网络连接时,没有IP地址他就不能做任何事情(例如下载一个Web网页)。所以,Bob的便携机所采取的一个网络相关的动作是运行DHCP协议,以从本地DHCP服务器获得一个IP地址以及其他信息。
1)Bob 便携机上的操作系统生成一个DHCP请求报文(4.3.3节),并将这个报文放入具有目的端口67(DHCP服务器)和源端口68(DHCP客户)的UDP报文段(3.3节)该UDP报文段则被放置在一个具有广播IP目的地址(255.255.255.255
)和源IP地址0.0.0.0
的IP数据报中(4.3.1节),因为Bob的便携机还没有一个IP地址。
2)包含 DHCP请求报文的IP数据报则被放置在以太网帧中(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
的接口接收到该广播以太网帧,该帧中包含DHCP请求,并且从该以太网帧中抽取出IP数据报。该数据报的广播IP目的地址指示了这个IP数据报应当由在该节点的高层协议处理,因此该数据报的载荷(一个UDP报文段)被分解(3.2节)向上到达UDP,DHCP请求报文从此UDP报文段中抽取出来。此时DHCP服务器有了DHCP请求报文。
5)我们假设运行在路由器中的DHCP服务器能够以CIDR(4.3.3节)块68.85.2.0/24
分配IP地址。所以本例中,在学校内使用的所有IP地址都在Comcast的地址块中。我们假设DHCP服务器分配地址68.85.2.101
给Bob的便携机。DHCP服务器生成包含这个IP地址以及DNS服务器的IP地址(68.87.71.226
)、默认网关路由器的IP地址(68.85.2.1)和子网块(68.85.2.0/24
)(等价为“网络掩码”)的一个DHCP ACK报文(4.3.3节)。该DHCP报文被放入一个UDP报文段中,UDP报文段被放入一个IP数据报中,IP数据报再被放入一个以太网帧中。这个以太网帧的源MAC地址是路由器连到归属网络时接口的MAC地址(00:22:6B:45:1F:1B
),目的MAC地址是Bob便携机的 MAC地址(00:16:D3:23:68:8A
).
6)包含DHCP ACK的以太网帧由路由器发送给交换机。因为交换机是自学习的(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转发表中安装默认网关的地址(4.1节)。Bob便携机将向该默认网关发送目的地址为其子网68.85.2.0/24
以外的所有数据报。此时,Bob便携机已经初始化好它的网络组件,并准备开始处理Web 网页获取。(注意到在第4章给出的四个步骤中仅有最后两个DHCP步骤是实际必要的。)
没有IP地址不能做任何事情,这一节讲述了DHCP协议实现动态分配IP,包含DHCP广播询问请求与响应ACK的过程
2.仍在准备:DNS和ARP
当Bob 将 www.google.com的URL键人其Web浏览器时,他开启了一长串事件,这将导致谷歌主页最终显示在其Web浏览器上。Bob的Web浏览器通过生成一个TCP 套接字(2.7节)开始了该过程,套接字用于向www.google.com 发送HTTP 请求(2.2节)。为了生成该套接字,Bob便携机将需要知道www.google.com的IP地址。我们在2.4节中学过,使用DNS协议提供这种名字到IP地址的转换服务。
8)Bob 便携机上的操作系统因此生成一个DNS查询报文(2.4.3节),将字符串www.google.com 放入DNS报文的问题段中。该DNS报文则放置在一个具有53号(DNS服务器)目的端口的UDP报文段中。该UDP报文段则被放入具有IP目的地址68.87.71.226
(在第1页第5步中DHCP ACK返回的DNS服务器地址)和源IP地址68.85.2.101
的IP数据报中。
9)Bob便携机则将包含DNS请求报文的数据报放入一个以太网帧中。该帧将发送(在链路层寻址)到 Bob学校网络中的网关路由器。然而,即使Bob便携机经过上述第5步中的DHCP ACK报文知道了学校网关路由器的IP地址(68.85.2.1
),但仍不知道该网关路由器的MAC地址。为了获得该网关路由器的MAC地址,Bob便携机将需要使用ARP协议(6.4.1节)。
10) Bob 便携机生成一个具有目的IP地址68.85.2.1
(默认网关)的ARP 查询报文,将该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回答放在一个以太网帧中,其目的地址为00:16:D3:23:68:8A
(Bob 便携机),并向交换机发送该帧,再由交换机将帧交付给Bob便携机。
12)Bob 便携机接收包含ARP回答报文的帧,并从ARP回答报文中抽取网关路由器的MAC地址(00:22:6B:45:1F:1B
).
13)Bob 便携机现在(最终!)能够使包含DNS查询的以太网帧寻址到网关路由器的MAC地址。注意到在该帧中的IP数据报具有IP目的地址68.87.71.226
(DNS服务器),而该帧具有目的地址00:22:6B:45:1F:1B
(网关路由器)。Bob便携机向交换机发送该帧,交换机将该帧交付给网关路由器。
这一部分讲述了,键入URL获得主页前提是浏览器先生成TCP套接字,而套接字的生成就需要知道所要访问主机名www.google.com的IP地址,就需要DNS查询,而这些的前提是能够发送报文到网关路由器上,而这个就需要通过ARP协议获得网关路由器的MAC地址。
注意到DNS查询报文和响应报文都是放在UDP报文段中。
3 仍在准备:域内路由选择到DNS服务器
14)网关路由器接收该帧并抽取包含DNS查询的IP数据报。路由器查找该数据报的目的地址(68.87.71.226
),并根据其转发表决定该数据报应当发送到图6-32的Comcast网络中最左边的路由器。IP数据报放置在链路层帧中,该链路适合将学校路由器连接到最左边Comcast路由器,并且该帧经这条链路发送。
15)在Comcast网络中最左边的路由器接收到该帧,抽取IP数据报,检查该数据报的目的地址(68.87.71.226
),并根据其转发表确定出接口,经过该接口朝着DNS服务器转发数据报,而转发表已根据 Comcast的域内协议(如RIP、OSPF或IS-IS,5.3节)以及因特网的域间协议BGP (5.4节)所填写。
16)最终包含DNS查询的IP数据报到达了DNS服务器。DNS服务器抽取出 DNS查询报文,在它的DNS数据库中查找名字 www.google.com(2.4节),找到包含对应www.google.com 的IP地址(64.233.169.105
)的DNS源记录。(假设它当前缓存在DNS服务器中。)前面讲过这种缓存数据源于google.com的权威DNS服务器(2.4.2节)。该DNS 服务器形成了一个包含这种主机名到IP地址映射的DNS回答报文,将该DNS回答报文放入UDP报文段中,该报文段放入寻址到 Bob便携机(68.85.2.101
)的IP数据报中。该数据报将通过Comcast 网络反向转发到学校的路由器,并从这里经过以太网交换机到Bob 便携机。
17)Bob便携机从DNS报文抽取出服务器www.google.com的IP地址。最终,在大量工作后,Bob 便携机此时准备接触www.google.com 服务器!
这一部分介绍了DNS查询报文和回答报文的查询与回复过程。
4 Web 客户-服务器交互:TCP和HTTP
18)既然 Bob便携机有了www.google.com的IP地址,它能够生成TCP套接字(2.7节),该套接字将用于向www.google.com 发送 HTTP GET 报文(2.2.3节)。当Bob生成TCP套接字时,在Bob便携机中的TCP必须首先与www.google.com中的TCP执行三次握手(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)在学校网络、Comcast 网络和谷歌网络中的路由器朝着www.google.com 转发包含TCP SYN的数据报,使用每台路由器中的转发表,如前面步骤14~16那样。前面讲过支配分组经Comcast和谷歌网络之间域间链路转发的路由器转发表项,是由BGP协议决定的(第5章)。
20)最终,包含TCP SYN的数据报到达www.googole.com.从数据报抽取出TCP SYN报文并分解到与端口80相联系的欢迎套接字。对于谷歌HTTP服务器和Bob便携机之间的TCP连接生成一个连接套接字(2.7节)。产生一个TCP SYNACK(3.5.6节)报文段,将其放入向 Bob便携机寻址的一个数据报中,最后放入链路层帧中,该链路适合将www.google.com 连接到其第一跳路由器。
21)包含 TCP SYNACK 报文段的数据报通过谷歌、Comcast和学校网络,最终到达Bob便携机的以太网卡。数据报在操作系统中分解到步骤18生成的TCP套接字,从而进入连接状态。
22)借助于Bob便携机上的套接字,现在(终于!)准备向 www.google.com 发送字节了,Bob的浏览器生成包含要获取的URL的HTTP GET报文(2.2.3节)。HTTP GET报文则写入套接字,其中GET报文成为一个TCP报文段的载荷。该TCP报文段放置进一个数据报中,并交付到www.google.com,如前面步骤18~20所述。
23)在www.google.com的HTTP服务器从TCP套接字读取HTTP GET报文,生成一个HTTP 响应报文(2.2节),将请求的Web页内容放入HTTP响应体中,并将报文发送进TCP套接字中。
24)包含HTTP回答报文的数据报通过谷歌、Comcast和学校网络转发,到达Bob 便携机。Bob的Web浏览器程序从套接字读取HTTP响应,从HTTP响应体中抽取Web网页的html,并最终(终于!)显示了Web网页。
这一部分介绍了最终的TCP链接的建立过程和套接字所起到的传递数据的作用。