IP协议

概述

IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。

无状态(stateless)是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种服务最大的缺点是无法处理乱序和重复的IP数据报。

虽然IP数据报头部提供了一个标识字段(见后文)用以唯一标识一个IP数据报,但它是被用来处理IP分片和重组的,而不是用来指示接收顺序的。

无连接(connectionless)是指IP通信双方都不长久地维持对方的任何信息。这样,上层协议每次发送数据的时候,都必须明确指定对方的IP地址。

不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力(best effort)。很多种情况都能导致IP数据报发送失败

IPV4

头部结构

  • 4位版本号(version)指定IP协议的版本。

  • 4位头部长度(header length)标识该IP头部有多少个32 bit字(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。

  • 16位总长度(total length)是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65 535(2^16-1)字节。但由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。接下来的3个字段则描述了如何实现分片。

  • 8位生存时间(Time To Live,TTL)是数据报到达目的地之前允许

  • 经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1。当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环

  • 8位协议(protocol)用来区分上层协议。/etc/protocols文件定义了所有上层协议对应的protocol字段的数值。其中,ICMP是1,TCP是6,UDP是17。/etc/protocols文件是RFC 1700的一个子集