IP协议是什么

安全咨询 0 261

IP协议

IP协议格式如下:

QQ截图20230509205010.png


4位版本号(version):指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。

4位首部长度(header length):表示IP报头的长度,以4字节为单位。

8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量比较重要。

16位总长度(total length):IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离。

16位标识(id):唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的。

3位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。

13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。

8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。

8位协议:表示上层协议的类型。

16位首部检验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。

32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。

选项字段:不定长,最多40字节。

IP报头在内核当中本质就是一个位段类型,给数据封装IP报头时,实际上就是用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,至此便完成了IP报头的封装。


IP如何将报头与有效载荷进行分离?


IP分离报头与有效载荷的方法与TCP是一模一样的,当IP从底层获取到一个报文后,虽然IP不知道报头的具体长度,但IP报文的前20个字节是IP的基本报头,并且这20字节当中涵盖4位首部长度。


因此IP是这样分离报头与有效载荷的:


当IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度,此时便获得了IP报头的大小s i z e sizesize。

如果s i z e sizesize的值大于20字节,则需要继续从报文当中读取s i z e − 20 size-20size−20字节的数据,这部分数据就是IP报头当中的选项字段。

读取完IP的基本报头和选项字段后,剩下的就是有效载荷了。

IP就是通过这种“定长报头+自描述字段”的方式进行报头和有效载荷的分离的。但需要注意的是,IP报头当中的4位首部长度描述的基本单位与TCP报头当中的4位首部长度一样,都是以4字节为单位进行描述的,这也恰好是报文的宽度。


4位二进制的取值范围是0000 ~ 1111,因此IP报头的最大长度为15 × 4 = 60 15\times 4=6015×4=60字节,因为基本报头的长度是20字节,所以IP报头中选项字段的长度最多是40字节。如果IP报头当中不携带选项字段,那么IP报头的长度就是20字节,此时报头当中的4位首部长度字段所填的值就是20 ÷ 4 = 5 20\div 4=520÷4=5,即0101。






也许您对下面的内容还感兴趣:

留言0

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。