IP包头详解

IP协议

Writed by Vindeselly

一、IP包头

版本

4 bit

首部长度

4 bit

服务类型(TOS)

8 bit

总长度(字节数)

16 bit

标识

16 bit

标志

3 bit

片偏移

13 bit

生成时间(TTL)

8 bit

协议

8 bit

首部检验和

16 bit

源IP地址

32 bit

目的IP地址

32 bit

选项(可选)

数据

 

二、各部分详解

2.1版本(Version)

4bit的版本字段表示IP的版本号。如果为0100表示IPv4,如果为0110表示IPv6。

2.2首部长度(header length)

4比特的首部长度字段表示IP首部的总长度,其中包括选项字段(如果有)。该字段的表示的长度单位为32bit(4 bytes),因此首部长度最大为15(1111)*32bit=60bytes。在没有选项时,该字段的值为5,表示普通的IP包头长度20bytes。

2.3服务类型(Differentiated Service Field)

8bit的服务器类型(TOS)字段,其中前3个bit表示优先权(现在已经忽略该字段),随后的4个bit表示服务类型,按顺序分别表示为最小时延、最大吞吐量、最高可靠性、最小费用四种。这个4个bit中最多只能有1个bit置位,如果全是0则表示一般服务。最有1个bit为未用位,必须置0。

2.4总长度(Total Length)

16个bit的总长度字段表示整个IP数据报的长度,以字节为单位。所以IP数据报的最大长度为16个1=65535bytes。

此处的总长度字段与MTU是密切相关的,MTU表示IP数据报的最大传输单元的大小,我们知道一般默认的MTU值为1500,也就是说单个IP数据报的最大长度为1500bytes。常规的无选项的IP包头长度为20bytes,可以通过MTU计算出DATA数据字段的最大长度为1480bytes。不仅如此,MTU还与TCP协议报头中的MSS有关联,MSS表示TCP数据报的最大传输长度,常规的TCP报头长度为20bytes,又因为TCP报头是封装在IP包头上的,所以MSS一般为1460bytes=MTU1500-IP包头20-TCP报头20。(其中关于MSS字段的详细解释请参见《TCP协议文档》)。由于默认MTU为1500bytes,所以网卡发送的数据帧的大小为1518bytes,多了18bytes分别为:目的MAC(6bytes)、源MAC(6bytes)、type(2bytes)、CRC(4bytes)。(具体关于二层数据帧的解释请参见《二层数据帧文档》)

2.5标识(Identification)

16bit的标识字段唯一的标识主机发送的每一份数据报,由主机生成具有唯一性。通常每发送一份报文该值加1。该值在数据包分片时,会复制到每一个片中。所以在重组分片包的时候会观察该值,把该值相同的分片收集到一起重组,后面会继续讨论分片。

2.6标志(Flag)

3bit的标识字段每一位都有特定的含义,该字段主要用来分片和重组。第1个bit为保留位(Reserved Bit),一般置位0。第2个bit为不分片位(Don’t Fragment),该位在置1时表示不分片。第3个bit为更多片位(More Fragment),该位表示后面是否还有更多的分片,置位1时表示后面还有,所以除了最后一片报文,其他分片报文该位全部置1。

2.7片偏移(Fragment Offset)

13比特的片偏移字段表示分片时,每一个分片的数据字段偏移原始数据报开始处的位置。比如原始数据报的数据字段总长为1461bytes,使用TCP传输协议,那么对该数据报进行分片,第一片的offset字段为0,第二片的offset字段就应该为1460。就是这么理解就对了^_^

 

再次简要讨论一下分片:把一份超过MTU的数据报分片以后,这些分片只有在到达目的地才进行重新组装。在一组分片报文传输的过程时中间设备有可能会对该分片再次分片。如果采用TCP传输协议,在传输过程中丢失一个分片报文,那么整个TCP数据报都将被重新传送,不会只发送丢失的分片。其原因是TCP协议有自己的超时和重传机制。(详解请参见《TCP协议文档》)

在一组分片报文中,任何传输层的首部只会出现在第一个分片中。并且由于数据报被分片后IP包头的首部校验和将会重算。在分片时,出最后一片外,其他每一片的数据部分必须是8字节的整数倍。

2.8生成时间(Time To Live)

8bit的生成时间字段表示该IP数据包可以经过的路由器的最大数量。最大为256表示可以穿越256台路由,该字段采用减法的方式赋值,比如在开始时8个bit全部置位1,没经过一台路由器该字段的值减1。如果该字段的值减到了0还没有送达目的地,那么该IP数据包将被丢弃。最初设计这个字段是为了防止IP报文在网络中循环无限传输,占用带宽等问题。

2.9协议(Protocol)

8bit的协议字段表示在IP上层承载的是什么协议。比如:0x01表示ICMP协议、0x06表示TCP协议、0x11表示UDP协议等。

2.10首部校验和(Header Checksum)

16bit的首部校验和字段用来使接收端检验收到的报文是否正确。该字段只对IP首部计算校验和不包含后面的数据字段。原因是IP的上层协议比如ICMP、IGMP、TCP、UDP协议的各自首部中均含有同时覆盖首部和数据的校验和。

计算方法:首先把首部中的该字段全部置0,然后对首部中的每个16bit进行反码求和,得到的值就是该字段的值,填入后。将该数据包发给接收端后,接收端将进行相同的操作,对每个16bit进行反码求和(此时首部校验和字段为非0字段),所以计算后的值若为全1表示正确,否则表示收到的数据包不正确,动作为丢弃。

2.11选项(Option)

一般不使用该字段,该字段的值以32bit为单位,不足时以0补充。

你可能感兴趣的:(IP协议)