一.说在前头

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

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

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

二.准备: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等级体系,等等),但是上述的步骤已经可以运行了。由此二十多个步骤可以看到,计算机网络真的非常复杂,但是作为用户完全不需要知道这些细节,也就是说对我们来说,上述的步骤都是“透明的”,向研制这些协议的先辈致敬。

从插上网线到web页面请求,究竟发生了哪些过程?(计算机网络篇)的更多相关文章

  1. QT使用WOL实现远程一键开机(局域网,需要目标电脑的主板支持,并且插上网线,用udpSocket.writeDatagram一句话就可以)

    功能:让关机的电脑一键开机,需要目标电脑的主板支持,并且插上网线: 效果:相当于手动按了一下目标电脑的开关机按钮. 没啥技术含量,简单开说... 1.获取目标机MAC地址 QByteArray sMa ...

  2. Linux下如何通过命令检查网卡是否插上网线

    How To:Linux下如何通过命令检查网卡是否插上网线   主要工具为ethtool来检查,主要关注的字段为"Link detected",注意如下的输出,其中em4实际物理上 ...

  3. How To:Linux下如何通过命令检查网卡是否插上网线

    主要工具为ethtool来检查,主要关注的字段为"Link detected",注意如下的输出,其中em4实际物理上并未插上网线,而em1是插上网线的: # ethtool em4 ...

  4. web页面请求历程

    web页面请求历程 1)准备DHCP,UDP,IP和以太网 客户端要访问www.google.com的网站. 首先客户端要与网络相接,没有IP地址地址就不能做什么事情,所以客户端采取的一个网络相关的动 ...

  5. Web页面解析过程(浅)

    web页面流程 域名解析DNS 域名解析:把域名指向网络空间IP,让人们通过简单的域名访问Web网站的服务. DNS:域名系统 DNS服务器:记录着域名及其对应的IP地址 解析域名: ​ 浏览器中输入 ...

  6. win7插着网线开机卡死,拔下网线开机正常

    公司的部分win7电脑插着网线开机,进到桌面后网络图标转圈圈卡住.控制面板,启动项,任务管理器等都打不开.把网线拔下后再开机,电脑正常进入系统,后再插上网线就能正常上网了.被这个问题困扰了很久,百度也 ...

  7. web页面和小程序页面实现瀑布流效果

    小程序实现瀑布流效果,和web页面差不多,都要经过以下步骤: 1).加载图片,获取图片的宽高度: 2).根据页面需要显示几列计算每列的宽度: 3).根据图片真实宽度和每列的宽度比,计算出图片需要显示的 ...

  8. 将请求挂载至WEB页面

    有两种方式 1.使用标准的方式,在某个菜单下面直接加入标准功能  提交请求(FEM_FWK_SUBMIT_REQ),然后即可在页面上提交请求. 2.将指定请求定义成功能,在WEB页面使用功能直接提交指 ...

  9. 临时存存储页面上的数据---Web存储

    HTML5 Web存储的两种方法使用 localStorage和sessionStorage 参考: http://www.cnblogs.com/taoweiji/archive/2012/12/0 ...

随机推荐

  1. Yum -userguide

    Introduction Yum(Yellow dog Updater, Modified) is an automatic updater and package installer/remover ...

  2. Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

    (一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...

  3. XML文档结构

    <?xml version="1.0" encoding="UTF-8"?> <books> <bool id="bk1 ...

  4. setTimeout 和 setInteval 的区别。

    学习前端的可能都知道js有2个定时器setTimeOut和setinteval.用的时候可能不是很在意,但是2者还是有区别的 setTimeout方法是定时程序,也就是在什么时间以后干什么.干完就完了 ...

  5. 人生第一次hash

    人生的第一次hash交给了模板题. 讲道理,还没有别人快排要快,就比暴力快那么一点... 难道我写的hash就那么菜么? 我想了想,光是处理字符串就O(n*len).. 这是hash的正确写法吗?我都 ...

  6. JS - A*寻路

    算法核心 A*估值算法 寻路估值算法有非常多:常用的有广度优先算法,深度优先算法,哈夫曼树等等,游戏中用的比较多的如:A*估值 算法描述 对起点与终点进行横纵坐标的运算 代码实现 start: 起点坐 ...

  7. oracle调用array参数存储过程

    declare -- Non-scalar parameters require additional processing files tyt_gas2014_search; ,); temp1 t ...

  8. Maven的下载,安装,配置,测试,初识

    1:Maven官网:http://maven.apache.org/ Maven远程仓库:http://search.maven.org/ 2:Maven是一个采用纯Java编写的开源项目管理工具,M ...

  9. 解决oracle用户锁定

        故障现象: SQL> connect scott/scottERROR:ORA-01017: invalid username/password; logon deniedSQL> ...

  10. UserManager

    刚刚学习servlet,打算学做一个小项目把前边学到的知识做一个总结. 由于只是实现了一些简单的功能,所以美工就凑合着看吧(美工其实也不太会). 首先项目整体架构如图 项目准备工作: 要用到mysql ...