一.说在前头

好久没有更新博客了,汗颜,最近忙于各种实验与报告,但是还是要抽时间总结一下学的东西。欢迎转载,但是要注明出处哦(=^ ^=)。

最近学了计算机网络,正好总结一下。本篇博客的大部分是跟计算机网络协议相关的,大概是一个沿着协议栈往下的过程。我们可以看到,一个最简单的请求,也包含了许多复杂的过程。而这些过程对用户来说,是完全不可见的,也就是说,制作这些协议的前辈们,为了方便用户的使用,把许多复杂的东西已经封装好了,因此我们这些小白,只用动动鼠标,就可以轻松surfing the Internet了!

这次的总结基于这样的场景:一名学生,就称呼他为“小明”吧(:-P,小明再次登场,哈哈~),小明带着他的笔记本电脑和学校寝室的网线接口(其实是一个以太网交换机)连接,加载一个web页面(比如说www.baidu.com的主页,额,某度给广告费么)。正如前面所讲,为了满足这个简单的请求,背后隐藏了许多的细节。

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

 

二.准备:DHCP、UDP、IP、以太网

 

我们假定小明启动他的笔记本,然后将其用一根网线(以太网电缆)链接到学校的网口(以太网交换机),交换机与学校的路由器相连,如上图所示。学校的这台路由器与一个ISP连接,本例中ISP为unicom.net。在本例中,unicom.net为学校提供了DNS服务;所以,DNS服务器驻留在unicom网络中而不是学校的网络中。我们还假设DHCP服务器运行在路由器中,因为我们在生活中的常见情景就是这样。

当小明首先将笔记本与网络连接时,没有IP地址,他就不能做任何事情。所以,第一要务就是,运行DHCP协议,以便从DHCP服务器获得一个IP地址以及其他相关信息。

 

1.  小明笔记本上的操作系统生成一个DHCP请求报文,并将这个报文放入具有目的端口67(DHCP服务器)和源端口68(DHCP客户)的UDP报文段,该UDP报文段则被放置在一个具有广播IP目的地地址(255.255.255.255)和源IP地址(0.0.0.0)的IP数据报因为小明的笔记本还没有一个具体的IP地址。

 

2.  包含DHCP请求报文的IP数据报则被放置在以太网帧。这个以太网帧具有目的MAC地址FF:FF:FF:FF:FF:FF,使该帧将广播到与交换机连接的所有设备(如果顺利的话,也包含了DHCP服务器);这个帧的源MAC地址是小明笔记本的MAC地址00:16:D3:23:68:8A。

 

3.  包含DHCP请求的广播以太网帧是第一个从小明笔记本发送到以太网交换机的帧。这个交换机在所有的出端口广播收到的帧,也包括了连接到路由器的端口。

 

4  .路由器在它的具有MAC地址00:226B:45:1F:1B的接口收到了这个广播的以太网帧,帧中包含了DHCP请求,并且路由器可以从帧中抽取出IP数据报。该数据报的广播IP目的地址指示了这个IP数据报应当由在该节点的高层协议处理,因此数据报的载荷(一个UDP报文段)被分解了,向上到达了UDP,UHCP请求报文从UDP报文段中抽取出来。此时DHCP服务器有了DHCP请求报文。

 

5.  我们假设运行在路由器中的DHCP服务器能够以CIDR块68.85.2.0/24分配IP地址。所以在这个例子中,在学校内使用的所有IP地址都在unicom的地址块中。我们假设DHCP服务器分配地址68.85.2.101给小明的笔记本。DHCP服务器生成包含这个IP地址以及DNS服务器的IP地址(68.87.71.226)、默认网关路由器的IP地址(68.85.2.1)和子网块(68.85.2.0/24)(等价于“子网掩码”)的一个DHCP ACK报文。报文被放入一个UDP报文段中,UDP报文段被放入一个IP数据报中,IP数据报被放入一个以太网帧中。这个以太网帧的源MAC地址是路由器连到归属网络时接口的MAC地址(00:22:6B:45:1F:1B),目的MAC地址是小明笔记本的MAC地址(00:16:D3:23:68:8A)。

 

6.  包含DHCP ACK报文的以太网帧由路由器发送给交换机。因为交换机是自学习的,并且先前从小明笔记本收到(包含DHCP请求的)以太网帧,所以该交换机知道寻址到00:16:D3:23:68:8A的帧仅从小明笔记本的输出端口转发。

 

7.  小明笔记本接收到包含DHCP ACK的以太网帧,并且从帧中提取IP数据报,又从数据报提取UDP报文段,从报文段中提取DHCP ACK报文。小明的DHCP客户端则记录下它的IP地址和它的DNS服务器的IP地址。它还在其IP转发表中安装默认网关的地址。小明笔记本将向该默认网关发送目的地址为其子网68.85.2.0/24以外的所有数据报。此时,笔记本已经初始化所有的网络组件,并且准备开始处理web页面的获取。

 

三.仍在准备:DNS和ARP

 

当小明将www.baidu.com的URL键入其web浏览器时,他就开启了一长串事件,这将导致某度主页最终显示在他的web浏览器上。小明的web浏览器通过生成一个TCP套接字开始了该过程,套接字用于向www.baidu.com发送HTTP请求。为了生成该套接字,小明的笔记本将需要知道www.baidu.com的IP地址。使用DNS服务提供这种域名到IP的相互转换。

 

8.  小明的笔记本上的操作系统因此生成一个DNS查询报文,将字符串www.baidu.com放入DNS报文的问题段中。这个DNS报文则放置在一个具有53号(DNS服务器)目的端口的UDP报文段中。该UDP报文段则被放入具有IP目的地址68.87.71.226(在第5步中DHCP ACK返回的DNS服务器地址)和源IP地址68.85.2.101的IP数据报中。

 

9.  小明笔记本将包含DNS请求报文的数据报放入一个以太网帧。帧将发送(在链路层寻址)到小明学校网络的网关路由器。然而,即使小明的笔记本经过上面的第5步中的DHCP ACP报文知道了学校网关路由器的IP地址,但是仍然不知道这个网关的MAC地址。为了获得网关的MAC地址,小明笔记本将需要使用ARP协议

 

10.  笔记本生成一个具有目的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(小明的笔记本),并向交换机发送该帧,再由交换机将帧交付给笔记本电脑。

 

12  .笔记本电脑接收包含ARP回答报文的帧,并从ARP回答报文中抽取网关路由器的MAC地址(00:22:6B:45:1F:1B)。

 

13.  小明的笔记本电脑现在终于能够使包含DNS查询的以太网帧寻址到网关路由器的MAC地址。注意到在该帧中的IP数据报具有IP目的地址68.87.71.226(DNS服务器),而该帧具有MAC目的地址00:22:6B:45:1F:1B(网关路由器)。笔记本电脑向交换机发送该帧,交换机将帧交付给网关路由器。

 

四.还在准备:域内路由选择到DNS服务器

 

14.  网关路由器接收该帧并抽取包含DNS查询的IP数据报。路由器查找该数据报的目的地址(68.87.71.226),并根据路由器自己的转发表决定该数据报应当发送到图示unicom网络中最左边的路由器。IP数据报放置在链路层帧中,该链路适合将学校路由器连接到最左边的unicom路由器,并且该帧经这条链路发送。

 

15.  在unicom网络中最左边的路由器接收到该帧,抽取IP数据报,检查数据报的目的地址(68.87.71.226),并根据转发表确定出接口,经过该接口朝着DNS服务器转发数据报,而转发表已根据unicom的域内协议(如RIP、OSPF、IS-IS等)以及因特网的域间协议BGP所填写。

 

16.  最终包含DNS查询的IP数据报到达了DNS服务器。DNS服务器抽取出DNS查询报文,在它的DNS数据库中查找名字www.baidu.com。找到包含对应www.baidu.com的IP地址(64.233.169.105)的DNS源记录。(假设它当前缓存在这个DNS服务器中。)这种缓存数据源于baidu.com的权威DNS服务器。该DNS服务器形成了一个包含这种主机名的IP地址的映射的DNS回答报文,将该回答报文放入UDP报文段中,报文段放入寻址到小明笔记本电脑(68.85.2.101)的IP数据报,数据报通过unicom网络反向转发到学校的路由器,并从这里经过以太网交换机到小明的笔记本电脑。

 

17.  笔记本电脑从DNS报文抽取出服务器www.baidu.com的IP地址。最终,在上面的大量工作之后,这台可怜的笔记本电脑准备接触www.baidu.com的服务器!

 

五.web交互:TCP与HTTP

 

18.  既然笔记本电脑已经有了www.baidu.com的服务器IP地址,它能够生成TCP套接字,这个套接字将用于向www.baidu.com发送HTTP GET报文。当小明生成TCP套接字时,在笔记本电脑中的TCP必须首先与www.baidu.com中的TCP执行三次握手协议。笔记本因此首先生成一个具有目的端口80的TCP SYN报文段,该TCP报文段放置在具有目的IP地址为64.233.169.105(www.baidu.com)的IP数据报,数据报则放置在MAC地址为00:22:6B:45:1F:1B(默认网关路由器)的帧中,并向交换机发送该帧。

 

19.  在学校网络、unicom网络和某度网络中的路由器朝着www.baidu.com转发包含TCP SYN的数据报,使用每台路由器的转发表,如上面的步骤14-16那样。前面也说过支配分组经unicom和某度网络之间的链路转发的路由器转发表项,是由BGP协议决定的。

 

20.  最终,包含TCP SYN的数据报到达www.baidu.com。从数据报抽取出TCP SYN报文并分解到与端口80相联系的套接字。对于某度HTTP服务器和小明的笔记本电脑之间的TCP连接生成一个连接套接字。产生一个TCP SYNACK报文段,将其放入向笔记本电脑寻址的一个IP数据报中,最后放入链路层帧,该链路适合将www.baidu.com连接到其第一跳路由器。

 

21.  包含TCP SYNACK报文段的数据通过某度、unicom和学校网络,最终到达笔记本电脑的以太网卡。数据报在操作系统中分解到步骤18生成的TCP套接字,从而进入连接状态。

 

22.  借助笔记本电脑上的套接字,现在准备向www.baidu.com发送字节了,小明的浏览器生成包含要获取的URL的HTTP GET报文。报文则写入套接字,其中GET报文成为一个TCP报文段的有效载荷。TCP报文段放入数据报,再放入以太网帧。交付给www.baidu.com,如同步骤18-20那样。

 

23.  在www.baidu.com的HTTP服务器从TCP套接字读取HTTP GET报文,生成一个HTTP响应报文,将请求的web页面内容放入HTTP响应体中,并将报文段发送到套接字中。

 

24.  包含HTTP响应报文的数据报通过某度、unicom、学校网络转发,最后到达小明的笔记本电脑。小明的浏览器从套接字中读取HTTP响应,从响应中抽取web页面的html等,经过浏览器引擎显示出web页面!大功告成!\(^o^)/YES!\(^o^)/YES!

 

六.写在后头

上面的一个场景已经涉及到了计算机网络中的很多协议,如果你还想进了解关于其中的web技术的话,转到我的另一篇博客:从地址栏输入url到显示页面都发生了什么?。在这个场景里,还忽略了一些可能的附加的协议(举几个栗子,运行在学校网关路由器中的网络地址转换NAT,到学校网络的无线网络接入,接入学校网络或者对报文段和数据报加密的安全协议网络管理协议,等等),还有一些人们在公共互联网中的考虑(CDN,负载均衡,web缓存DNS等级体系,等等),但是上述的步骤已经可以运行了。由此二十多个步骤可以看到,计算机网络真的非常复杂,但是作为用户完全不需要知道这些细节,也就是说对我们来说,上述的步骤都是“透明的”,向研制这些协议的先辈致敬。

 

http://www.cnblogs.com/yuxiuyan/p/6903242.html