IP报头格式(字段解析)

                   目录

1、4位版本号

2、4位头部长度

3、8位服务类型(主要关注TOS)

4、16位总长度

5、8位生存时间(TTL)

 6、8位协议

7、16位首部校验和

8、16位分片标识、3位标志、13位片偏移


网络层的TCP协议具备决策能力,提供一整套确保可靠性和高效性的策略,如拥塞控制、确认应答机制等。传输层的IP协议 具备执行能力,能以较大概率将数据从主机A传送给主机B。

因此,IP的报头格式和TCP的报头格式必然存在差异,但是也有类似的地方。

IP报头格式(字段解析)_第1张图片

1、4位版本号

指定IP协议的版本,对于IPv4而言,这里要填的就是4

2、4位头部长度

这里的4位头部长度和 TCP报头中的 4位首部长度是一样的,4位头部长度 = 前20个字节 + 选项所占字节,单位是 4字节。(搭配16位总长度用于解包)

3、8位服务类型(主要关注TOS)

8个比特位 = 3位优先权字段(已经弃用) + 4位TOS字段 + 1位保留字段。这里的8位服务类型不是给对方主机网络协议栈看的,而是给路上的路由看的。

其中4位 TOS分别表示: 最小延时最大吞吐量最高可靠性最小成本。这四个相互冲突,每个报文只能选择其中一种,这个要根据使用场景决定。应用层的 ssh/telnet 协议 看重最小延时,而ftp协议看重 网络吞吐量。

4、16位总长度

16位总长度 = 4位头部长度 + 数据长度。IP不是面向字节流的,收到的是一个个数据包,存在粘包问题,需要自己区分边界!TCP是面向字节流的,只考虑字节,区分边界的任务交给应用层来做。

IP报头格式(字段解析)_第2张图片

因此,在解包的时候要同时使用4位头部长度 和 16位总长度。先通过4位首部长度去除报头,数据长度 = 16位总长度 -  4位头部长度,然后通过得到的数据长度取出第一个报文的有效载荷。

5、8位生存时间(TTL)

代表了数据报到达目的地的最大报文跳数。一般是64. 每次经过一个路由,TTL--,一直减到0还没到达, 那么就丢弃了。

因为可能存在这么一种情况,一个数据包刚准备跳转到下一跳,结果对方路由器就关了,导致这个报文一直在路由器间循环跳转,如果每次都这样,网络里就会存在大量的数据包。但是如果规定了跳转的最大次数,就可以减少网络中遗留的报文。

IP报头格式(字段解析)_第3张图片

 6、8位协议

表示上层使用的协议。发送方使用TCP协议,接收方也只能用TCP协议,对端网络层收到的时候,要交付给传输层对应的协议

7、16位首部校验和

鉴别报文比特位是否被修改。因为在传输的过程中,报文会受到噪声干扰,报文的比特位可能会被修改,16位校验和检验首部是否被修改。

8、16位分片标识、3位标志、13位片偏移

网络层再继续向下传递的时候,对报文大小就有限制了,mtu(max transform unit)是最大传送单元,代表了每次所能传输报文的大小(含IP报头)。当我们的报文大小(含IP报头)超过了1500 个字节的时候,将一个报文分成多部份来传递,这就是分片。

关于这三个字段,初步的定义是:

  • 16位分片标识:如果不分片,每个报文的标识符是不一样的;如果分片了,属于同一个报文的标识符是一样的。

  • 13位片偏移:分片以后,各个部分在原始报文的哪个位置,即在原始报文中的偏移量。

  • 3位标识:1位保留、1位标识禁止分片、1位标识更多报文

这三个字段在分片中如何使用的,可以参考:报文分片

你可能感兴趣的:(Linux,网络基础,tcp/ip,网络,服务器)