最后更新:2020-03-21 14:36:30 手机定位技术交流文章

作者|小林编码
来源|小林编码
图纸|远景中国
据信,许多小伙伴会遇到这样的问题“在键入网址时,请到网站上展示面试过程中发生的事情”
也不说,这个问题确实是相当经常被问到的,前几天坐在我旁边负责电话面试的考生,也问过这个问题
这一次,小林,我带你去探索网络中数据包的心理过程。
的每个阶段都有一个包的“精神旅程”。让我们看看它说了什么。
接下来,以下图中较简单的网络拓扑模型为例,探究在此期间发生的情况。

简单网络模型

孤独的小弟弟-http
浏览器的第一项工作是解析URL
。首先,浏览器的第一项工作是解析网址,为网络服务器生成请求信息
让我们看看长网址中的每个元素代表什么,如下图所示:

网址解析
,所以图中的长网址实际上是请求服务器中的文件资源
如果上图中的蓝色网址元素被省略,应该请求哪个文件?
当没有路径名时,它意味着访问根目录下预先设置的默认文件,即/index.html或/default.html,因此不会有混淆。
生成HTTP请求信息
解析该URL后,浏览器确定Web服务器和文件名,然后基于该信息生成HTTP请求消息

HTTP消息格式
一个孤独的HTTP数据包说:“我是这样一个小数据包,没有亲人或朋友,直接发送到广阔的网络,谁会认识我?谁能载我一程?谁能保护我?我的目的地在哪里?”充满了各种各样的怀疑,它没有停滞不前,仍然在前进!

真实地址查询-域名系统
需要委托操作系统在通过浏览器解析网址并生成一个HTTP消息后将消息发送到网络服务器
但是在发送之前,还有另外一项工作要做,那就是查询服务器域名的IP地址,因为当委托操作系统发送消息时,必须提供通信对象的IP地址。
例如,当我们打电话时,我们必须知道对方的电话号码,但是因为电话号码很难记住,我们通常在地址簿中保留电话号码+对方的名字。
,因此,有一个服务器专门保存域名和网络服务器的ip之间的对应关系,它就是DNS服务器
域名的层次
域名在
域名系统中用句点分隔,如www.server.com,其中句点代表不同层次之间的边界
在域名中,位置越低,级别越高毕竟,域名是外国人发明的,所以思维与中国人相反。例如,一个城市所在的国家喜欢从小到大(如XX省XX市XX区XX街),而中国喜欢从大到小(如XX省XX市XX区XX街)
根域在顶层,它的下一层是com顶层域,下面是server.com
因此,域名的分级关系类似于树结构:
根域名服务器
顶级域名服务器(com)
权威域名服务器(server.com)

域名树结构
根域名服务器信息存储在互联网中的所有域名服务器中
,以便任何域名服务器都能找到并访问根域域名服务器
因此,只要客户端可以找到任何一台域名服务器,它就可以通过它找到根域域名服务器,然后通过它找到位于较低级别的目标域名服务器。域名解析工作流
客户端将首先发出一个域名解析请求,询问www.server.com的IP是什么,并将其发送到本地域名解析服务器(即在客户端的TCP/IP设置中输入的域名解析服务器地址)收到客户端的请求后,如果缓存中的表可以找到www.server.com,
本地域名服务器将直接返回IP地址如果没有,本地域名系统会询问它的根域名服务器:“老板,你能告诉我网址吗?”根域名服务器是最高级别,它不直接用于域名解析,但它可以指示路径。
根域名系统,在收到本地域名系统的请求后,发现帖子是。“www.server.com的域名由。com区域”。我会给你的地址。com顶级域名服务器。请问一下在收到顶级域名服务器的地址后,
本地域名系统发起了一个请求,并问道:“第二,你能告诉我www.server.com的IP地址吗?
顶级域名服务器说:“我会给你负责www.server.com地区的权威域名服务器的地址,你应该能问出来。”。"
本地域名系统然后转向权威的域名系统服务器,问道:“第三,什么是对应的域名?”该服务器是域名解析结果的原始来源为什么称之为权威?这是我的域名。我做决定。
权威域名服务器将在查询后通知本地域名对应的IP地址X.X.X.X
本地DNS将IP地址返回给客户端,客户端将与目标建立连接
到目前为止,我们已经完成了域名解析过程现在总结一下,我画了一幅整个过程的图。

域名解析的工作流程
域名解析的过程非常有趣。整个过程类似于在我们的日常生活中找个人问路的过程,只是方向并没有带路。
数据包说:“域名系统大哥太强大了,他已经找到了目的地!我还是很困惑。我想发出去。下一步我需要帮助谁?”

指南助手-协议栈
通过域名解析系统获取IP后,可以将超文本传输协议传输到操作系统中的协议栈
协议栈分为几个部分,分别承担不同的任务。上下级关系有一定的规律。上半部分将把工作委托给下半部分,下半部分将接收委托的工作并执行它。

应用程序(浏览器)通过调用Socket库委托协议栈工作协议栈的上半部分有两个模块,TCP和UDP,负责发送和接收数据。它们接受应用层的委托来执行发送和接收数据的操作。
协议栈的下半部分使用IP协议来控制发送和接收网络数据包的操作。在互联网上上传数据时,数据执行者被分割成多个网络数据包,向另一方发送网络数据包的操作由IP负责
此外,IP还包括ICMP和ARP协议
ICMP用于通知网络数据包传输错误和各种控制信息
ARP用于根据IP地址查询相应的以太网MAC地址
IP下的网卡驱动程序负责控制网卡硬件,而最低的网卡负责实际收发操作,即在网线中发送和接收信号
包看着指南说:“我需要这么多老板的帮助,那我就先去找TCP老板!“

可靠传输——TCP
http是基于TCP协议传输的,所以让我们先了解TCP协议
TCP包头格式
让我们来看看TCP包头的格式:

TCP包头格式
首先,源端口号和目标端口号是不可缺少的。如果没有这两个端口号,数据将不知道发送哪个应用程序。
有下一个包的序列号,这是为了解决乱序包的问题。
还应该有一个确认号来确认发送者是否收到了它。如果没有收到,它应该被再次发送,直到它被交付。这是为了解决没有丢包的问题。
后面是一些状态位例如,SYN发起一个连接,ACK是一个应答,RST是一个重新连接,FIN是一个结束连接,等等。TCP是面向连接的,所以双方都需要保持连接的状态。这些带有状态位的数据包的传输将导致双方的状态发生变化。
也有重要的窗口大小传输控制协议应该做流量控制。每个通信方应该声明一个窗口(缓存大小)来标识其当前的处理能力。不要送得太快来支持我,或者送得太慢来饿死我。除了流量控制,传输控制协议还将进行拥塞控制。对于真正的交通堵塞,它无能为力。它唯一能做的就是控制自己,也就是控制传输速度。不能改变世界,只能改变你自己在
传输控制协议传输数据之前,必须通过三次握手建立连接。在HTTP传输数据之前,
首先要求TCP建立连接。建立一个TCP连接通常被称为三次握手。
,所谓的“连接”,只不过是双方计算机中维护的一台状态机。在连接建立的过程中,双方状态变化的时序图是这样的。

TCP三次握手
开始时,客户端和服务器都是关闭的首先,服务器主动监听端口,并处于监听状态
,则客户端主动发起连接SYN,然后处于SYN-SENT状态
服务器接收发起的连接,返回同步,并确认客户端的同步,然后处于同步-RCVD状态
客户端在接收到服务器发送的同步和确认后发送确认,由于发送和接收成功,因此处于建立状态。
服务器在收到确认确认后处于已建立状态,因为它也发送和接收
所以三方握手的目的是确保双方都有发送和接收的能力
如何查看传输控制协议的连接状态?
TCP的连接状态可以通过Linux中的netstat -napt命令来查看。

传输控制协议连接状态检查
传输控制协议分割数据
如果传输控制协议请求消息的长度超过传输控制协议的长度,传输控制协议将需要将传输控制协议数据分割成数据段,而不是一次发送所有数据

MTU和ms
MTU:网络数据包的最大长度,在以太网中通常为1500字节
MSS:网络数据包在删除了IP和TCP报头后可以容纳的最大TCP数据长度
数据将以MSS长度为单位进行分割,每一片分割后的数据将放入一个单独的网络数据包中。换句话说,TCP报头信息被添加到每个拆分的数据中,然后数据被发送到IP模块。

分组拆分
传输控制协议消息生成
传输控制协议将有两个端口,一个是浏览器监听端口(通常随机生成),另一个是网络服务器监听端口(HTTP默认端口号为80,HTTPS默认端口号为443)
在双方建立连接后,TCP消息的数据部分是存储HTTP头+数据。在组装好TCP消息后,需要将其移交给下面的网络层进行处理
至今,网络数据包消息如下

TCP层消息
此时,我遇到了TCP包,兴奋地说:“太好了,我遇到了可靠的TCP传输,它给我添加了TCP报头,我不再孤单,我感到安全了!有老板可以保护我可靠的交付!但是我应该去哪里呢?”

远程位置-IP
tcp模块在执行连接、发送和接收、断开连接等阶段的操作时,需要委托IP模块将数据封装到网络数据包中并发送给通信对象
IP包头格式
让我们先看一下IP包头的格式:

IP包头格式
要求在IP协议中有一个源地址和一个目的地址:
源地址IP,它是客户端输出的IP地址;
目标地址,即通过域名解析获得的网络服务器的IP
因为HTTP是通过TCP传输的,所以IP报头中的协议号应该填写为06(十六进制),表示协议是TCP
假设客户端有多个网卡,将有多个IP地址。应该选择哪个IP作为IP报头的源地址?
当有多个网卡时,在填写源地址时,有必要确定应填写哪个地址这种判断相当于判断应该使用哪个网卡在多个网卡之间发送数据包。
需要根据路由表规则判断哪个网卡是源IP。在Linux操作系统中,我们可以使用route -n命令来查看当前系统的路由表

路由表
例如,根据上面的路由表,我们假设网络服务器的目的地址是192.168.10.200

路由规则判断
首先对第一个条目的子网掩码执行与运算,结果是192.168.10.0,但第一个条目的目的地是192.168.3.0,这是不一致的,因此匹配失败
然后与第二个条目的子网掩码组合,结果是192.168.10.0,它与第二个条目的目标192.168.10.0成功匹配。因此,eth1网卡的IP地址被用作IP报头的源地址。
然后假设网络服务器的目标地址是10.100.20.100,那么仍然根据上述路由表规则进行判断,判断后的结果与第三个条目相匹配第三个条目
是特殊的,它的目标地址和子网掩码是0.0.0.0,这意味着默认网关。如果所有其他条目都不匹配,则该行将自动匹配。然后将数据包发送到路由器,网关是路由器的IP地址
IP报文生成
至此,网络数据包报文如下

IP层消息
此时,添加了IP报头的数据包说:“IP老板给我带路了,感谢IP层给我添加了IP报头,所以我有能力远程定位!不要害怕在浩瀚的互联网中被迷惑!但目的地如此遥远,我下一步该去哪里?”

两点传输-在MAC
生成IP报头之后,下一个网络数据包需要在IP报头之前添加一个MAC报头
MAC报头格式
MAC报头是以太网使用的报头,包含诸如接收方和发送方的媒体访问控制地址等信息

MAC报头格式
要求在MAC报头中的发送方MAC地址和接收方目的MAC地址用于两点之间的传输
通常用于TCP/IP通信。媒体访问控制报头仅使用
0800: IP协议
0806: ARP协议
MAC发送方和接收方如何确认?
发送方的媒体访问控制地址相对容易获得。当网卡被生产出来时,媒体访问控制地址被写入只读存储器,只要该值被读出并写入媒体访问控制报头
接收机的媒体访问控制地址有点复杂。只需告诉以太网另一方的MAC地址,以太网将帮助我们发送数据包。显然,另一方的MAC地址应该填写在这里
,所以首先我们必须找出应该将数据包发送给谁。这只是通过查找路由表。在路由表中找到匹配的条目,并将数据包发送到网关列中的IP地址既然
知道把它发送给谁,我怎样才能得到另一方的MAC地址?
不知道对方的媒体访问控制地址?我不知道,就喊吧
现在需要ARP协议来帮助我们找到路由器的MAC地址

ARP广播
ARP协议将以以太网广播的形式向所有以太网设备发出呼叫:“这是谁的IP地址?请告诉我你的MAC地址。”
然后有人会回答:“这个IP地址是我的,我的MAC地址是XXXX。”
如果另一方与自己在同一个子网中,可以通过上述操作获得另一方的媒体访问控制地址然后,我们将这个MAC地址写入MAC报头,MAC报头就完成了
好像每次都被广播,是不是很麻烦?
请放心,后续操作系统会将查询结果放入一个名为ARP cache的内存空间供以后使用,但缓存时间只有几分钟
,也就是说,
在发布合同时首先查询ARP缓存。如果对方的媒体访问控制地址已保存在地址解析协议缓存中,则不必发送地址解析协议查询并直接使用地址解析协议缓存中的地址。
,并且当对方的媒体访问控制地址不在地址解析协议缓存中时,发送一个地址解析协议广播查询
查看arp缓存内容在Linux系统中,我们可以使用arp -a命令来查看ARP缓存内容

ARP缓存内容
MAC报文生成
至此,网络数据包报文如下

MAC层消息
此时,带有MAC报头的数据包非常感激地说:“谢谢MAC老板,我知道我下一步要去哪里了!我现在有很多头兄弟,相信我能到达最终目的地!”有了许多头兄弟的数据包,我终于准备出去了。退出

-网卡
IP生成的网络数据包只是存储在内存中的一串二进制数字信息,不能直接发送给另一方因此,我们需要将数字信息转换成电信号,以便在网络电缆上传输,也就是说,这是真正的数据传输过程
负责这个操作的是网卡,要控制网卡还需要依靠网卡驱动程序
网卡驱动程序从IP模块获得数据包后,会将其复制到网卡的缓存区,然后在开头添加一个报头和一个起始帧分隔符,最后添加一个帧检查序列来检测错误。

物理层数据包
起始帧分隔符是位于标记
末尾的FCS(帧检查序列),用于指示数据包的起始位置,以检查数据包传输过程中是否有任何损坏。最后,网卡将数据包转换成电信号,并通过网络电缆发送出去
唉,送个包真不容易。它经历了许多困难。为此,一个拥有许多头脑的数据终于踏上了寻找目的地的旅程!

告别-交换机
让我们看看数据包是如何通过交换机的交换机旨在将网络数据包转发到目的地。交换机运行在媒体访问控制层,也称为第2层网络设备
交换机的分组接收操作
首先,电信号到达网络电缆接口,交换机中的模块接收它。接下来,开关中的模块将电信号转换成数字信号
然后在数据包末尾由FCS检查错误,如果没有问题,将其放入缓冲区。这部分操作与计算机的网卡基本相同,但交换机的工作方式与网卡不同。
计算机的网卡本身有媒体访问控制地址,通过检查接收数据包的接收方的媒体访问控制地址来判断是否发送给自己,如果没有发送给自己,则丢弃;相比之下,交换机的端口并不检查接收器的媒体访问控制地址,而是直接接收所有数据包并将其放入缓冲区。因此,与网卡不同,交换机端口没有MAC地址在
将数据包存储在缓冲区后,有必要检查数据包接收方的媒体访问控制地址是否已经记录在媒体访问控制地址表中。
交换机的MAC地址表主要包含两条信息:
一条是设备的MAC地址,
另一条是设备连接到交换机的哪个端口例如,如果接收到的数据包的接收方的媒体访问控制地址是00-02-B3-1C-9C-F9,则它与图中表格的第三行相匹配。根据端口列中的信息,可以看出该地址位于端口3,然后可以通过交换电路将数据包发送到相应的端口。
因此,交换机根据媒体访问控制地址表查找媒体访问控制地址,然后将信号发送到相应的端口
当媒体访问控制地址表找不到指定的媒体访问控制地址时会发生什么?在
地址表中找不到指定的媒体访问控制地址这可能是因为具有该地址的设备没有向交换机发送数据包,或者该设备已有一段时间没有工作,导致该地址从地址表中删除。
在这种情况下,交换机无法确定将数据包转发到哪个端口,只能将数据包转发到除源端口之外的所有端口,而不管设备连接到哪个端口来接收数据包。
不会造成任何问题,因为以太网被设计为向整个网络发送数据包,然后只有相应的接收者接收数据包,而其他设备会忽略这些数据包。
有些人会说,“如果它发送额外的数据包,会不会造成网络拥塞?”
实际上不需要太担心,因为目标设备将在发送数据包后做出响应。一旦返回响应数据包,交换机就可以将其地址写入到MAC地址表中,并且下次不需要将数据包发送到所有端口。
局域网每秒可以传输数千个数据包,再多一两个数据包也不是什么大事。
此外,如果接收方的媒体访问控制地址是广播地址,交换机会将数据包发送到除源端口之外的所有端口。以下两个
数据包属于广播地址:
MAC地址:FF:FF:FF:FF:FF:FF:FF
IP地址255.255.255.255
数据包通过交换机转发到路由器,准备离开本地子网这时,当包裹离开交易所时,它说:“谢谢你,交易所的兄弟,把它送到出口门。我要出城了!”

出口门-路由器
和交换机之间的差异通过交换机后,
网络数据包现在到达路由器,并在此转发到下一个路由器或目标设备这一步
转发的原理与交换机相似,也是查表判断的分组转发的目标。
,但路由器和交换机在具体操作过程中有所不同
因为路由器是基于IP设计的,通常称为三层网络设备,路由器的每个端口都有一个MAC地址和IP地址;
交换机是基于以太网设计的,俗称第2层网络设备,交换机的端口没有MAC地址
路由器的基本原理
路由器的端口有MAC地址,所以它可以是以太网的发送者和接收者。同时,它也有一个IP地址,在这个意义上,它和计算机的网卡是一样的。
转发数据包时,首先路由器端口将接收发送给自身的以太网数据包,然后路由表将查询转发目标,然后相应的端口将作为发送方将以太网数据包发送出去
路由器
的分组接收操作首先,电信号到达网络电缆的接口部分,路由器中的模块将电信号转换成数字信号,然后在分组结束时通过FCS进行错误检查
如果没有问题,请检查接收方在媒体访问控制报头中的媒体访问控制地址,看它是否是发送给自己的数据包。如果是,将其放入接收缓冲区,否则,丢弃数据包。
一般来说,路由器的所有端口都有媒体访问控制地址,只接收与自己地址匹配的数据包,而丢弃不直接匹配的数据包。
查询路由表,以确定在输出端口
完成数据包接收操作后,路由器将删除数据包开头的MAC报头
MAC报头用于将数据包传送到路由器,其中接收的MAC地址是路由器端口的MAC地址因此,当数据包到达路由器时,MAC报头任务完成,MAC报头被丢弃
接下来,路由器将根据媒体访问控制报头后面的IP报头中的内容转发数据包
转发操作分为几个阶段,第一阶段是查询路由表以确定转发目标例如,

路由器转发
的具体工作流程基于上图
假设地址为10.10.1.101的计算机将向地址为192.168.1.100的服务器发送数据包,该数据包将首先到达图中的路由器。
判断转发目的地的第一步是根据数据包接收方的IP地址查询路由表中的目的地址栏,找到匹配的记录
路由匹配与前一个相同,每个条目的子网掩码与192.168.1.100 IP相同&匹配操作后,得到的结果与对应条目的目标地址匹配,如果匹配,将作为候选转发目标,如果不匹配,将继续与下一个条目进行路由匹配。
是第二个条目的子网掩码255.255.255.0和192.168.1.100。使用操作后,结果为192.168.1.0,与第二个条目的目标地址192.168.1.0匹配,第二个条目记录将作为转发目标。当
找不到匹配路由时,将选择默认路由,路由表中子网掩码为0.0.0.0的记录表示“默认路由”
路由器的发送操作
将进入数据包发送操作
首先,我们需要根据路由表中的网关列判断对方的地址
如果网关是一个IP地址,那么这个IP地址就是我们要转发到的目的地址。我们还没有到达目的地,我们仍然需要路由器来转发它。
如果网关为空,则在IP报头中的接收者的IP地址是要转发到的目的地址,并且在IP报头中的目的地址最终被找到,表明目的地已经到达当
知道对方的地址后,需要通过ARP协议根据该地址查询MAC地址,并将查询结果作为接收方的MAC地址。
路由器也有一个地址解析协议缓存,因此它将首先在地址解析协议缓存中查询,如果找不到,将发送一个地址解析协议查询请求。
后面是发送方MAC地址字段,其中填写了输出端口的MAC地址还有一个以太网类型字段,填写0080(十六进制)表示IP协议
网络数据包完成后,将转换成电信号,通过端口发送出去。这一步的工作过程与计算机的工作过程相同。
发出的网络数据包将通过交换机到达下一台路由器。由于接收方的媒体访问控制地址是下一个路由器的地址,交换机将根据这个地址把数据包发送到下一个路由器。
接下来,下一台路由器会将数据包转发到下一台路由器。经过层层转发,网络数据包将到达最终目的地。
我不知道您是否发现了,在网络数据包传输的过程中,源IP和目的IP总是相同的,MAC地址总是会改变,因为MAC地址是以太网中两个设备之间进行数据包传输所必需的。在许多路由器朋友的帮助下,
数据包已经在网络世界中传播了很多,最终到达了目的地的大门!在城门口值班的路由器发现小弟弟的包原来是给城里人的,所以它把包送到了城里,在城市交换机的帮助下,它最终被转发到了目的地。包裹中充满了深深的情感:“谢谢所有伟大英雄们一路上的帮助!“

互相剥了皮-服务器和客户端
数据包到达服务器,服务器一定很高兴啊,是所谓的有朋自远方来,不亦乐乎?
服务器欣喜若狂,开始剥离数据包!就像你收到了快递,你能不激动吗?在

蒙皮模型
数据包到达服务器后,服务器将首先剥离数据包的媒体访问控制报头,查看它是否与服务器自己的媒体访问控制地址匹配,如果匹配,则收集数据包
然后继续打开数据包的IP头,发现IP地址是一致的。根据IP报头中的协议项,他知道自己的上层是TCP协议
因此,TCP报头被撕开,序列号在里面。有必要看看这个序列包是否是我想要的。如果是这样,它被放入缓存,然后返回一个确认。否则,它将被丢弃。TCP报头还包含端口号,HTTP服务器正在侦听该端口号
然后,服务器自然知道HTTP进程想要这个包,并将其发送到HTTP进程
服务器的HTTP进程看到原始请求是访问一个页面,所以它将该页面封装在一个HTTP响应消息中。
HTTP响应消息还需要TCP、IP和MAC报头,但这次源地址是服务器IP地址,目的地址是客户端IP地址
穿上头部衣服后,它从网卡中出来,由交换机转发到城外的路由器。路由器将响应数据包发送到下一个路由器,像这样跳来跳去。
最终跳到了路由器的客户端的门把上。路由器打开IP报头,发现它正在寻找城市中的人,因此它将数据包发送到城市中的交换机,然后由交换机转发给客户端。
客户端在收到服务器的响应包后也非常高兴。客户能够打开快递。
因此,客户端开始剥离接收到的数据包的外壳,并将HTTP响应消息留给浏览器来呈现页面。一个特殊的数据包以这种方式传递和显示。在
结束时,客户端必须离开,并向服务器发送四次传输控制协议,这样双方之间的连接就断开了。

下的“我”代表“幽灵包角色”(括号内的内容)代表我的咒骂,连续三个封地!虽然起初我很孤独,不知所措,但我没有停滞不前。我仍然充满信心和勇气开始旅程。(你当然有勇气,你是应用层的数据,背后有兄弟在背后撑腰,我呸!)
我很高兴认识各种有权势的大佬,传输可靠的TCP,具有远程定位功能的IP,指示下一站位置的MAC等。(你当然会,因为它们都是由电脑安排的,我呸!)
这些老板在我面前增加了一个标题,这样我就可以在交换机和路由器的转发下到达目的地了!(啊,你不容易,不要吐出来,放你走!)
一路上的经历,让我意识到合作在网络世界的重要性,是他们维护了网络世界的秩序,谢谢他们!(呸,你应该感谢许多计算机科学家!)
参考文献:
[1]家庭根。网络是如何连接的?人民邮电出版社。
[2]刘超。有趣的网络协议。极客时代。
本文由 在线网速测试 整理编辑,转载请注明出处。