这一部分开始把前面那堆枯燥乏味的理论联系到实际数据传输的过程了,阅读这部分建议结合OSI模型以及TCP/IP模型中的“相关概念”部分一起看,实际通信过程结合理论分析,有助于真正掌握通信的过程和概念。

数据总体通讯过程

Snipaste_2019-12-10_16-36-13

TCPIP ENCAPSULATION

Data_Flow_of_the_Internet_Protocol_Suite

TCPIP模型回顾

Snipaste_2020-06-11_14-12-42

TCP/IP模型是当今IP网络的基础(由OSI七层参考模型发展而来,也称为DoD模型)。分层参考模型的设计是非常经典的理念:

  • 层次化的模型设计将网络的通信过程划分为更小、更简单的部件,因此有助于各个部件的独立开发、设计和故障排除;
  • 层与层之间相互独立,又互相依赖,每一层都有该层的功能、以及定义的协议标准。层与层之间相互配合,共同完成数据通信的过程;
  • 通过组件的标准化,允许多个供应商进行开发;
  • 通过定义在模型的每一层实现什么功能,鼓励产业的标准化;
  • 允许各种类型的网络硬件和软件相互通信。

Snipaste_2020-06-11_14-14-20

路由器的通信过程

路由器(Router)是一种负责寻径的网络设备,连接不同网段,负责不同网段之间的数据转发,例如192.168.1.0/24和192.168.2.0/24之间通信,由于他们分别属于192.168.1.0和192.168.2.0这两个不同的网段,所以他们之间的通信需要三层设备也就是路由器来连同,它在互连网络中从多条路径中寻找通讯量最少的一条网络路径提供给用户通信。

Router 的责任是记录相应路由信息应该从哪个接口发出,并形成一张路由表,当收到数据时,根据网络层报头的目的地址去查询路由表中是否有相对应的条目,如果有就从该路由条目的出接口发出数据,如果没有就将数据丢弃。

LAN内交换机的通信原则和过程

交换机(Switch)对数据的处理过程:

switch

  • 交换机如果刚刚加电启动,它的MAC地址缓存为空,此时假设PC1要发送数据给PC3,假设这里是PC1要ping PC3的IP地址而且在同一网段,根据TCP/IP模型我们知道,由于在同一网段所以只需要二层交换机即可通信,封装数据时,下四层每一层需要封装本层的报头,三层网络层封装的时候需要源目的IP地址,二层数据链路层封装的时候需要原目的MAC地址,这里PC1只知道PC3的IP地址和自己的IP地址,所以三层需要封装的参数已经知道了,但在开始通信的时候,二层封装的目的MAC地址还不知道,所以需要获得MAC地址才能完成二层数据链路层的封装,PC1会使用ARP协议去获取目的MAC地址用来完成二层封装,PC1获取PC3 MAC地址的过程,请结合ARP的部分学习。

  • 假设PC1已经知道了PC3的MAC地址,而Switch的MAC地址表项为空,PC1将源IP、MAC地址为自身,目标IP、MAC地址为PC3相应地址的数据封装好发送给Switch,Switch从接口G0/1接收到PC1发过来的数据后,首先对数据进行解封装,将物理层0101的比特流还原成数据帧后对二层进行解封装,知道了该数据帧的源、目的MAC地址,将这个数据帧的源MAC地址,既PC1的MAC地址(AAAAAAAAAA)和对应的端口G0/1添加到自己的MAC地址表中方便以后再进行数据传输时使用,然后从自己的MAC地址表中去查找这个数据帧目的地PC3(CCCCCCCCCC)的MAC地址,但是此时由于MAC地址表项为空所以找不到对应的MAC地址,这时Switch将这个数据封装上初始的源、目的MAC地址作为二层帧头,从除了收到这个数据的G0/1以外的其他接口(G0/2、G0/3、G0/0)泛洪出去;

  • PC2和PC4都接收到了这个数据帧,这两台设备将比特流还原成帧后对数据帧进行解封装,查看该数据帧的目的MAC地址,发现目的MAC地址与自己的网卡MAC地址不相同,PC2和PC4丢弃这个数据帧;

  • 在上一步中PC3也同时收到了这个数据帧,PC3对数据进行解封装后,检查目的MAC地址的时候发现,与本机相同,PC3接收这个数据包,并回发数据包对PC1进行确认,PC3封装一个源地址为自己MAC地址,目的地址是A的MAC地址,源IP为自己IP,目的IP为PC1的IP地址的数据发送给Switch;

  • Switch接收到这个数据,它首先添加PC3的MAC和对应的接口G0/3到自己的MAC地址表中,然后查询源MA地址表时候发现PC1的MAC地址在MAC地址表项中可以查到,此MAC地址对应端口为G0/1,Switch将这个数据帧发给接口G0/1的PC1;

  • PC1收到PC3发回的确认,通信成功;

  • 通过这种形式,Switch学习到的MAC地址以及所在接口。如下:

微信截图_20191124185137

通过不停的通信,最终Switch能够获得所有端口对应的MAC地址,但需注意,MAC地址表项的老化时间为300秒,如果超过老化时间,表项会被删除,Switch需重新泛洪以获取目的MAC地址对应的表项。思科交换机查看MAC地址表的命令为:show mac-address

通信示例分析

Snipaste_2020-06-11_14-28-29

网络上各设备的接口、IP和MAC地址如图所示,PC1要访问WebServer上的网页服务(HTTP、80端口),用这个例子分析数据在TCP/IP每层经历的过程。在阐述过程中,我们重点放在利用TCP/IP参考模型理解通信过程,因此可能会忽略部分技术细节,例如DNS、TCP三次握手等,这些技术细节这里暂不做讨论。事实上,整个过程的宏观层面如下:

53a14dfd2e01a

PC封装过程

应用层:

53a14e23b3ca6

PC的用户在WEB浏览器中访问Server的WEB服务(这里我们暂且不去关注底层的HTTP交互、DNS交互等细节。重点看通信过程),PC的这次操作将触发HTTP应用为用户构造一个应用数据。当然这个数据最终要传递到Server并最终“递交”到Server的HTTP应用来处理,但是HTTP不关心数据怎么传、怎么寻址、怎么做差错校验等等,那么这些事情就交由专门的Layer也就是专门的层来完成,所以HTTP应用数据还的经过一番“折腾”才能从PC传出去到达Server,现在开始。应用层中的相关程序生成一个应用层的数据,也就是图中的DATA部分,然后交给下一层,传输层。

传输层:

53a14e35e03e1

微信图片编辑_20200113145310

上层的DATA到达传输层后,首先查看数据类型,由于这是一个要发送给web服务器的HTTP数据,而HTTP是一种尽力而为的协议,本身没有纠错功能,所以选择能保证数据传输完整性的TCP协议去封装,而TCP报头中需要的两个重要参数就是源、目的端口地址。HTTP固定的端口是80,所以目的端口号为80,客户端使用的源端口号一般为系统中未使用的且大于1023的数字,在这我们假设设备使用1025作为源端口号。封装完TCP报头,形成了数据段(segment)后,交给下一层,网络层。

网络层:

53a14e4be283e

微信图片编辑_20200328175537

上层数据到达网络层后,要加上网络层的IPV4报头,等以后如果IPV6普及了会加IPV6报头,以便该数据能够在IP网络中被网络设备转发(路由)。IPV4报头封装所需的三个重要的参数就是源IP地址、目的IP地址和协议号。由于上层用的是TCP协议,TCP协议对应的协议号为6,所以在Protocol部分为6;源IP地址为自身的IP地址192.168.1.1,目的IP地址为WebServer的IP地址192.168.2.1。封装好三层报头将数据段封装为数据包后,交给下一层,数据链路层。

数据链路层:

53a14e5955e8b

1920px-Ethernet_Type_II_Frame_format.svg

上层数据到数据链路层后,需要封装以太网2的报头,使得之前的IP数据包能够在链路上被传输,因为TCP/IP在二层采用的是这种封装格式,以太网2报头中三个需要获知的重要参数为源MAC地址、目的MAC地址和以类型,源MAC地址为PC自身的MAC地址,目的MAC地址呢?PC知道,数据的目的地是192.168.2.1这个IP,而本机IP是192.168.1.1/24,显然,目的地与自己并不在同一个网段,因此需要借助自己的网关,让网关来帮助自己将数据包转发出去。那么首先我得把数据转发到网关吧?因此目的MAC地址填写的就是网关192.168.1.254对应的MAC地址。但是初始情况下,PC可能并没有192.168.1.254的MAC,所以,它会发送一个ARP广播去请求192.168.1.254的MAC,R1的GE0/0/0口会收到这个ARP请求并且回送ARP响应。如此一来PC就知道了网关的MAC,它将网关MAC 0018-0011-0001填写在以太网数据帧头部的目的MAC中。另外,以太网数据帧头的类型字段写上0x0800这个值,表示我这个数据帧头后面封装的是一个IP包。由于三层采用的封装为IPV4,所以EtherType中类型字段的值为0x0800,表示我这个数据帧头后面封装的是一个IP包。数据链路层封装好本层报头以后,将数据传给下一层,物理层。

物理层:

53a14e6820ab9

物理层收到上层的数据帧后,将数据帧转换为物理层能识别的电磁信号,也就是bit流,从物理上来说,最终数据帧在物理层变成了一堆的0101,然后通过物理介质传输给网关,路由器R1。

R1处理过程

物理层第一次:

R1收到物理介质传输的数据后,在物理层将电磁信号还原成数据帧,然后交给数据链路层。

数据链路层第一次:

53a14e73c02b5

R1收到物理层发来的数据帧,先查看数据帧的CRC Checksum部分,看数据帧在传输过程中是否有损坏:

微信图片编辑_20200611145704

确定数据帧无损坏以后,开始对二层进行解封装,看看数据帧中目的MAC地址和收到这个数据帧的GE0/0/0口的MAC是否相同,如果相同说明这个数据是发给自己的,然后讲数据交给上层继处理。在这个例子中,两者相同,于是查看数据帧头部的Ether Type字段,发现类型为0X0800,表示上层网络层用的是IPV4协议封装,这个字段是用来告诉上层,这个数据的三层用的是IPV4封装方式,以便上层解封装的时候使用正确的方式解封装,提高数据处理效率。接着它将以太网帧头剥去或者说解封装完,然后交给上层IP协议继续处理。

网络层:

53a14e7e58f26

网络层收到数据后,继续对IP报头进行解封装,校验一下在传输过程中IP报头部分是否损坏:

微信图片编辑_20200611150749

如果没有损坏就继续看目标IP地址部分,发现目的IP地址不是本机,网关R1根据目的IP地址,按照最长匹配原则查询是否有对应路由条目,查询后发现应将该数据从GE0/0/1端口发出。于是它不在继续拆IP报头看里面的其他字段也不会剥离IP头部了,而是把原封不动包含IP报头的IP数据包交给下层以太网协议去处理。

数据链路层第二次:

53a14e8bef0b7

数据链路层收到上层发来的数据后,因为该数据是要从GE0/0/1口发送给R2的GE0/0/0口,所以以太网2封装的源MAC地址是R1的GE0/0/1口的MAC地址,目的MAC地址是R2的GE0/0/0接口的MAC地址,如果ARP缓存中没有R2的GE0/0/0接口MAC地址(在初始情况下是这样),则需要用ARP协议进行获取,如果有该ARP缓存则直接使用;由于上层采用IPV4封装,所以EtherType依旧是0X0800。然后发送给物理层转换成电磁信号发送给R2。

R2处理过程:

数据链路层第一次:

53a14e978d982

R2的物理层将收到的电磁信号恢复成数据帧后交给数据链路层,数据链路层对二层报头进行解封装,发现目的MAC地址和自己的F0/0接口的MAC地址相同,所以这个数据是发给自己的,于是将该数据交给上层的网络层继续处理。

网络层第一次:

53a14ea4e02bc

网络层收到下层的数据后继续解封装,发现目的IP地址不是自己的,然后根据目的IP地址,按照最长匹配原则查询是否有对应路由条目,查询后发现应将该数据从GE0/0/1端口发出。在网络层将三层按原报头重新打包好然后发给数据链路层。

数据链路层第二次:

53a14eb0487d8

数据链路层收到上层发来的数据后,因为该数据是要从GE0/0/1口发送给WebServer,所以以太网2封装的源MAC地址是R2的GE0/0/1口的MAC地址,目的MAC地址是WebServer的MAC地址(ARP方式获得MAC地址),由于上层采用IPV4封装,所以EtherType依旧是0X0800。然后发送给数据链路层转换成电磁信号发送给WebServer。物理层将数据帧转换为物理层能识别的电磁信号然后通过物理介质传输给最终目的设备,WebServer,数据传输结束。

https://community.cisco.com/t5/networking-blogs/what-happens-when-router-receives-packet/ba-p/3105996

Server处理过程

Server首先是将101010这些比特流还原成帧,然后做校验看看帧头是否损坏,如果没有,则查看数据帧的目的MAC,结果发现就是自己的MAC,于是查看类型字段,发现是0x0800,于是知道这里头装的是一个IP包,于是将帧头剥去,将内层的IP数据包交给上层协议IP去处理。IP收到这个数据包之后,首先依然是查看IP包头是否损坏,如果没有,则查看目的IP地址,发现目的IP地址是192.168.2.1正是自己的网卡IP,于是它知道,这个IP包是发给自己的,因此继续查看IP包头中的协议字段,发现协议字段填写的是6这个值,原来这个IP包头后面封装的是一个TCP的数据,因此将IP包头剥去,将里头的TCP数据交给上层的TCP协议去处理。而TCP在处理这个数据的时候,查看TCP头部的目的端口号,发现目的端口号是80,而本地的TCP80端口是开放的,开放给HTTP应用了,接着它将TCP头部剥去,交给HTTP应用,好了终于从PC发送出来的HTTP应用数据,到达了目的地 –Server的HTTP应用的手中。

思考题

Snipaste_2020-05-13_10-49-06

两台路由器,R1的G0/0接口IP地址为192.168.12.1,R2的G0/1接口IP地址为192.12.2,R1和R2之间能够相互ping通,当R1ping一个不存在的IP地址时,比如192.168.12.3,请问链路上是否有ping包?

答案:没有,因为要封装ping包也就是ICMP,需要源目的IP以及源目地MAC地址,在ping12.3这个不存在的地址时,源目地IP地址已经有了,源MAC地址为自身的MAC地址所以也是有的,但目的MAC地址是靠ARP获得的,但当R1发出ARP请求以后,是获取不到MAC地址的,因为这个IP地址没有设备,也就没法告诉R1它的MAC地址,所以ping包无法封装,所以网络上没有ping包。

引用文章

利用TCP/IP模型理解数据通信过程