目录
网络层的TCP协议具备决策能力,提供一整套确保可靠性和高效性的策略,如拥塞控制、确认应答机制等。传输层的IP协议 具备执行能力,能以较大概率将数据从主机A传送给主机B。
因此,IP的报头格式和TCP的报头格式必然存在差异,但是也有类似的地方。
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是面向字节流的,只考虑字节,区分边界的任务交给应用层来做。
因此,在解包的时候要同时使用4位头部长度 和 16位总长度。先通过4位首部长度去除报头,数据长度 = 16位总长度 - 4位头部长度,然后通过得到的数据长度取出第一个报文的有效载荷。
5、8位生存时间(TTL)
代表了数据报到达目的地的最大报文跳数。一般是64. 每次经过一个路由,TTL--,一直减到0还没到达, 那么就丢弃了。
因为可能存在这么一种情况,一个数据包刚准备跳转到下一跳,结果对方路由器就关了,导致这个报文一直在路由器间循环跳转,如果每次都这样,网络里就会存在大量的数据包。但是如果规定了跳转的最大次数,就可以减少网络中遗留的报文。
6、8位协议
表示上层使用的协议。发送方使用TCP协议,接收方也只能用TCP协议,对端网络层收到的时候,要交付给传输层对应的协议
7、16位首部校验和
鉴别报文比特位是否被修改。因为在传输的过程中,报文会受到噪声干扰,报文的比特位可能会被修改,16位校验和检验首部是否被修改。
8、16位分片标识、3位标志、13位片偏移
网络层再继续向下传递的时候,对报文大小就有限制了,mtu(max transform unit)是最大传送单元,代表了每次所能传输报文的大小(含IP报头)。当我们的报文大小(含IP报头)超过了1500 个字节的时候,将一个报文分成多部份来传递,这就是分片。
关于这三个字段,初步的定义是:
-
16位分片标识:如果不分片,每个报文的标识符是不一样的;如果分片了,属于同一个报文的标识符是一样的。
-
13位片偏移:分片以后,各个部分在原始报文的哪个位置,即在原始报文中的偏移量。
-
3位标识:1位保留、1位标识禁止分片、1位标识更多报文
这三个字段在分片中如何使用的,可以参考:报文分片