从插上网线到web页面请求,究竟发生了哪些过程?计算机网络篇

一.说在前头

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

最近学了计算机网络,正好总结一下。本篇博客的大部分是跟计算机网络协议相关的,大概是一个沿着协议栈往下的过程。我们可以看到,一个最简单的请求,也包含了许多复杂的过程。而这些过程对用户来说,是完全不可见的,也就是说,制作这些协议的前辈们,为了方便用户的使用,把许多复杂的东西已经封装好了,因此我们这些小白,只用动动鼠标,就可以轻松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等级体系,等等),但是上述的步骤已经可以运行了。由此二十多个步骤可以看到,计算机网络真的非常复杂,但是作为用户完全不需要知道这些细节,也就是说对我们来说,上述的步骤都是“透明的”,向研制这些协议的先辈致敬。

 

原文地址:https://www.cnblogs.com/yuxiuyan

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340