写在最前面:这是我第一次写博客(刚刚上大三),老师建议我们可以把学会的东西写下来并记录下来,以达到学习的目的。所以我来了。第一次写,肯定有许多见解浅显甚至错误的地方,还需要各位大佬们指正,谢谢!
0(看看了解一下),数据的传输过程在以太网中依赖于TCP/IP协议簇和底层协议的配合。计算机网络将网络层次划分成五种不同的层次,由高到低分别为:应用层,传输层,网络层,数据链路层,物理层。在这里我们假设要进行端到端的通信,主要分析传输层,网络层,数据链路层。
1,数据转发过程概述
数据可以在同一网络或者不同网络中间转发,所以数据转发的过程也可以分为本地转发和远程转发。以校园网的拓扑为例。首先我们的PC(personal computer)直接连上的就是局域网(私网),当我们需要访问远端的web服务器(公网)时便需要走网关(普遍意义上的路由器)。假设此时我们的PC1需要访问服务器1的web服务,并且假设两者已经建立了TCP连接。
//这里的公网网段不太严谨(10.0.0.0~10.255.255.255,172.16.0.0~172.31.255.255,192.168.0.0~192.168.255.255这三个网段规定是私网的ip,这里为了方便就将就用了,还请读者见谅)
2,TCP封装(传输层)
从应用层下来的数据首先要执行加密和压缩(这里的加密和压缩是OSI模型中会话层和表示层的功能)后才到达了传输层,要进行传输层的封装(此时是TCP封装,而传输层有两种协议TCP和UDP因此有两种封装方式:TCP封装 和 UDP封装 )。
Web服务是基于传输层的TCP协议封装数据并转发,所以如上图从应用层下来的数据经历加密和压缩后由传输层进行TCP封装,即在数据Data部分加上TCP头部。此时的得到的数据PDU(协议数据单元)我们称之为:数据段(Segment)。此时注意TCP头部的目的端口号80(Destination Port:80)表示数据应该交付给的应用层的http协议下的web服务进行处理。目的端口号的不同,代表要交付的上层的协议也不同,这里列举几个常见的目的端口号(
FTP(数据连接)----- 20 //文件传输协议·TCP
FTP (控制连接) ----- 21
Telnet ----- 23 //远程终端协议·TCP
Smtp ----- 25 //电子邮件传输协议·TCP
DNS ----- 53 //域名系统·TCP/UDP
TFTP ----- 69 //简单文件传输协议·UDP
HTTP ----- 80 //超文本传输协议·TCP
POP3 ----- 110 //邮局协议版本3·TCP
HTTPS ----- 443 //超文本传输安全协议·TCP
)
源端口号(Source Port)为主机随机选择的端口号,与以上的知名端口号不同。TCP报文段首部的其他字段就不一一介绍,感兴趣的读者可自行了解。所以当我们在进行了TCP的封装后,传输层向高层用户屏蔽了下面网络的核心的细节,导致对于应用进程来说,似乎传输层提供了应用进程间的逻辑通信。但是为了了解数据的转发过程,我们还需要继续往下研究。
3,IP封装(网络层)
当PC 1完成了传输层的封装以后,便进入了网络层的数据封装,在进行IP层的封装时,如果IP报文的大小大于网络的最大传输单元MTU的值,可能还会被分片。分装好后的数据PDU我们称之为数据包(Packet)。
如上图在进行IP封装(在数据部分加上IP头部,此时的数据部分对于网络层来说包括TCP Header和Data)的时候首先需要明确源地址和目的地址,源地址Source IP Address:10.0.15.1即PC 1 自己的私网的IP地址,目的地址Destination IP Address:172.16.10.1即为服务器Server 1 的IP地址。
生存时间TTL字段的作用是用来减少网络环路造成的影响,默认TTL的值为255。路由器转发一个数据包时,该值会被减1,如果路由器发现收到的数据包该值减为0。若目的地址为自己的地址则直接交付上层处理,若不是自己的地址则丢弃该数据包。*Tracert就是发送一个TTL=1的报文来跟踪数据的转发
协议字段值标识了传输层所使用的协议,这里该字段的填充值为0X06(Protocol:0X06)表示传输层使用的是TCP协议。这里列举几个常见的协议字段值(
ICMP ----- 0X01 //网际控制报文协议
IGMP ----- 0X02 //网际组管理协议
TCP ----- 0X06 //传输控制协议
UDP ----- 0X11 //用户数据报协议
OSPF ----- 0X59 //开放式最短路径优先(区域间路由协议的一种)
)
剩下的IP报文头部的其他字段值就不一一赘述,感兴趣的读者可自行查看相关文献。
4,以太网封装(数据链路层)
当我们完成了网络层的封装以后,接下来就到了数据链路层的封装,以太网封装。以太网中数据帧的封装格式有两种:IEEE802.3格式和EthernetⅡ帧格式。简单来看他们之间的区别在于帧Length/Type的值取值的范围(IEEE802.3帧:Length/Type<=1500(0X05DC) ; EthernetⅡ帧:Length/Type>=1536(0X0600) )。这里我们只讨论与上文联系的EthernetⅡ帧,这也是目前以太网中应用最多的帧。
好的,现在我们进行数据链路层的EthernetⅡ帧封装,如图
在数据链路层的封装中,IP Header + TCP Header + Data对于帧来说就是数据部分。即在数据部分前面加上EthernetⅡ的帧头,以及在数据部分尾部加上帧尾FCS(帧校验序列)。做完这些事情后,我们将得到的数据称为:数据帧(Frame)。这里稍微讲解一下帧头的3个字段。
D.MAC(Destination.MAC,目的Mac地址)在最前面,表示这个帧我要发送到目的哪个物理网卡的物理地址上,这个地址可以是单播地址(1对1),组播地址(1对多),广播地址(1对所有(同一个局域网段内))。
S.MAC(Source.MAC,源Mac地址)表示本机此时正在使用的那个网卡的物理地址(*一台设备可能有多个网卡,以太网卡,无线网卡等等,具体是用什么方式连接网络,进行数据通讯,那么就封装的是哪个网卡的Mac地址。闲扯一下,虽然网卡的Mac地址在它出厂的时候就已经固化在ROM里面了,只读不写,但是读出来的Mac在操作系统中是可以更改的,更多可以参考苹果的设备)。这个地址只能是单播地址。
Type字段表示数据帧中封装的数据遵循哪个IP层的协议。这里的Type=0X0800表示数据是一个IPv4的数据包。这里列举几个常见的Type字段值(
IPv4协议 ------ 0X0800
IPv6协议 ------ 0X86dd
ARP协议 ------ 0X0806
帧中继ARP ------ 0X0808
RARP协议 ------ 0X8035
Apple Talk地址解析协议 ------ 0X80F3
SNMP协议 ------ 0X814C
PPP协议 ------ 0X880B
MPLS协议(单播) ------ 0X8847
MPLS协议(组播) ------ 0X8848
PPPoE协议(发现阶段) ------ 0X8863
PPPoE协议(会话阶段) ------ 0X8864
)
5,数据在局域网和公网中的转发。
如果你看到了这里,证明你已经清楚的知道,这些数据在转发之前是如何在设备中封装的,解封的过程和封装一样,一层层从最外面给它脱掉“衣服”,每脱掉一层就发送给上层查看,一直到这个过程结束,这里就不啰嗦了。
好的,那么首先是在局域网中的转发:
还记得之前提到的图片嘛,不记得了,没关系,我Ctrl+V让你少滚一下鼠标滑轮。
这里我们继续,PC 1要访问访问Server 1上的Web服务,并且已经按照约定打包封装好了数据帧。那么对于这个数据帧,首先我们知道它的目的IP地址(172.16.10.1/24)不是PC 1自己这个网段(10.0.15.0/24)里面的数据。那么这个数据帧就要经过网关(网关,字面意义上的网络的关口,对于局域网的用户来说所有访问外网的流量,我并不关心它之后由哪些路由器等等网络设备转发出去,我只关心我要出去,就必须要走网关。所以当你在本机的cmd窗口里arp-a试图查看百度的ip地址和Mac地址的映射关系时,不好意思,你找不到。有的只是,网关的ip地址和Mac地址的映射项,以及本局域网内所有你访问过的网络设备的ip地址和Mac地址的映射项等等,例如PC 2)来转发出去。这里的网关就是直连该网段的路由器AR1的一个端口GE0/0/0,它的ip地址是10.0.15.254/24。而封装的数据帧的D.Mac地址就是网关的Mac地址。
数据帧首先从Ehternet0/0/1要走到接入交换机LSW 1。在到了LSW 1上时,交换机会查看自己的MAC地址表(Mac地址和端口的映射关系表),发现,噢原来目的mac地址是网关的mac地址,好的,那我就由我的GE0/0/1接口发送出去,到网关(AR1的G0/0/0)好吧。行,此时交换机打开并检查了数据帧,并对比了它的Mac地址表,然后转发出去。所以在局域网中的二层数据转发类比,交换机(层二设备)只是查看了数据帧后根据Mac地址表转发出去,并没有重新封装解封装。
好的,现在我们的数据帧到了网关(GE0/0/0)。路由器AR1,接收到数据帧后首先会将数据帧打开(路由器是层三的设备,所以会查看到数据帧的IP层),然后对比自己的路由表发现,去往172.16.10.0/24网段的数据应该从自己的GE0/0/2口(10.1.15.1)转发到AR2的GE0/0/0口(10.1.15.2)。注意,这个时候路由器就会进行帧的重新封装和解封装。怎么封装呢,如图:
目的Mac地址就是AR2的GE0/0/0口的物理地址。而源地址就是自己AR1上GE0/0/2口的物理地址。将数据帧重新分装成帧后,转发出去。
到达AR2后也是类似上文所说,查看数据帧打开路由表,然后根据路由表知道了该转发到下一跳的地址后,重新解封装和封装数据帧并转发。最后到了对应网段,转发出去。所以在广域网中三层转发类比,路由器(层三设备)查看了数据包后根据路由表重新对帧进行了封装和解封装(添加一个新的二层帧头帧尾)后,再进行转发。
好了到此为止,数据的转发过程基本上很浅显的讲完了,因为我本人能力有限,很多地方肯定写得还不够好,希望读者能指正,共勉,感谢阅读!