linux网络编程之通信协议格式

好文参考:《网路传输的三张表:MAC地址表,ARP缓存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html

(1)数据包封装

          传输层及其一下的机制由内核决定,主要负责通讯的具体细节;应用层由用户进程提供,主要负责对通讯数据的含义进行解释。应用层数据通过协议栈发送到网络上,为了保证数据能够被接收,需要在每层协议之前加一个数据首部作为标识,我们称之为封装,具体格式如下

                 

(2)以太网帧格式

            1) 在链路层中,传输的数据我们称为帧,具体的帧格式如下图所示:

   

         其中:图中的目的地址和原地址指的是网卡的硬件地址(MAC地址,即网卡编号,唯一),CRC为校验位

          2)ARP数据报格式:获取下一跳(下一个路由节点)的MAC,实现数据传递。

              1>在网路传输的过程中,只有知道目标的MAC地址(未知)和发送数据起点的MAC地址(已知),才能进行正常的数据传输。如果得知目标的MAC地址,通过ARP发送数据请求和数据应答即可得到目标的MAC地址,ARP数据报的格式如下:

              

              2> 具体的实现流程:

                 在数据过程中,首先需要获得目标的MAC地址,这就需要使用ARP协议了。在每台主机中都有一个ARP缓存表,其中记录了主机IP和MAC地址的对应关系。如果AB之间想要通信,A首先会检查自己的ARP缓存表中是否有B的IP地址和对应MAC地址的对应关系。如果有,则会将B的IP地址和对应的MAC地址填到ARP数据报中;如果没有,则A会发一个ARP请求给B,此时交换机接收到这个数据帧(广播帧),将数据以非接口的形式广播出去。此时B收到这个数据帧,会检查是否和自己的IP相同,如果不同,则忽略信息,如果相同,则会将A的IP和MAC地址的对应关系记录在自己的ARP缓存表中,同时将给A发送一个ARP应答数据(拆包和组包),其中包括B的MAC地址。A收到B的应答数据后,会将B的IP地址和MAC地址填入到自己的ARP缓存地址中。

                在网路传输中,交换机在收到数据帧之后,会将数据帧中的MAC地址和端口号记录在MAC表中,然后在表中寻找有没有数据帧目标的MAC地址信息。如果有,则直接将数据从表中的接口传递给下一个MAC地址(单播);如果没有,则将数据以非接口的形式发送出去(称为广播)(现在的路由器一般都包含了交换机在内)。 

               通过路由节点的不断拆包和组包,直到找到封装在网络层IP协议中的目的地址.数据包在不断传递的过程中,最长的生命周期,我们称之为TTL

            3>IP段格式:数据前面的那段我们称为IP首部(固定部分+可变部分)

          

         其中:4位版本号:IPV4/IPV6     4位首部长度:数据首部的最大字节数(最小为5,最大为15,以4字节为单位)

                      16位总长度:数据报的最大长度为2^16-1=65535字节(首部和数据之和长度)

                      13位片偏移:用于传输较大的数据,切片时记录片的编号(片偏移以8字节为偏移单位)

                      8位生存时间:为起始主机到目标主机之间最多可存在255个路由节点(最多有255跳)

                      32位源IP地址:发送数据端的IP              32位目的IP地址:接收数据端的IP

               4>UDP数据报格式

             

       由于在一个主机中,不同的应用对应于不用的进程,也就是所谓的端口号。因此通过指定两个端口号,就可以指定两个应用进行通信,从而不会导致数据传输错乱。

          5>TCP数据报格式

               

          和UDP相比,TCP数据报格式相对来说比较复杂,除了相对的端口号,还有序号和确认序号,用来重构数据使用。

猜你喜欢

转载自blog.csdn.net/xx18030637774/article/details/82492568