IP 数据报位于 OSI 七层模型中的网络层,对应与 TCP/IP 四层模型中的网络层(也称网际层)。网络层用来处理网络上流动的数据包(网络传输中最小的数据单元),规定了怎样的路径把数据包传输到目标计算机,并把数据包传送给对方。(与 tcp/ip 协议密切相关的有 IP 协议、ARP 协议、RARP 协议)。IP 协议就在这里,它负责对数据加上 IP 地址和其他的数据,以确定传输的目标,和相邻计算机之间的通信。
其功能包括三方面:
- 处理来自传输层的分组发送请求,收到请求后,将分组装入 IP 数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。
- 处理输入数据报:首先检查其合法性,然后进行寻径。假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
- 处理路径、流控、拥塞等问题。
IP协议:Internetworking Protocol(网间网协议),IP是跨越网络传送数据包,使整个互联网都能收到数据的协议。IP也是分组交换的一种协议,但是它不具备重发机制,因此它是不可靠传输协议。
IPv4:头部由 20bytes 定长和一个可选的变长部分(小于等于 40bytes )组成,其中包括 32 位记录源端IP地址,32 位记录目的端 IP 地址。所有内容长度最大为 216-1=65535bytes。
IP数据报的具体结构和解析如下:
通过 Wireshark 抓取的一个 IPv4 的数据报片段示例如下:
Internet Protocol Version 4, Src: 192.168.43.69, Dst: 220.181.38.148
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
0000 00.. = Differentiated Services Codepoint: Default (0)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 669
Identification: 0x989b (39067)
Flags: 0x40, Don't fragment
0... .... = Reserved bit: Not set
.1.. .... = Don't fragment: Set
..0. .... = More fragments: Not set
...0 0000 0000 0000 = Fragment Offset: 0
Time to Live: 128
Protocol: TCP (6)
Header Checksum: 0x7088 [validation disabled]
[Header checksum status: Unverified]
Source Address: 192.168.43.69
Destination Address: 220.181.38.148
注意:上面描述的首部,不包括选项字段的 IP 头部长度为 20bytes(1byte=8bits)长度,最高位在左边,记为 0bit。最低位在右边,记为 31bits。采用 “大端” byte 序进行传输,也就是对于 4bytes 的 32bits 数据,从高位byte(0bit)开始传输 0~7,8~15,15~23,24~31bits。各字段的含义如下:
- 版本:4bits,0100 值为4代表 IPv4。
- 首部长度:4bits,占4位,指的是包括选项字段在内的 IP 首部长度。首部单位长度为4个 byte,以有多少组 4bytes 字组来表达 header 的长度。从0000~1111,当“首部长度”表示为0001时,首部的长度是1(4bytes)。首部最大长度为15(60bytes)。
- 服务类型(区分服务):8bits,前 3bits 优先级字段(现在已经不用了),后 4bits TOS字段, 最后 1bit 备用位。4bits TOS位分别代表:第一位D(delay)最小时延、T(throughput)最大吞吐量、R(reliability)最高可靠性和C(cost)最小费用,只能设置其中 1bit,如果所有 4bits 均为0,那么就表示是一般服务。在抓包中显示Differentiated Services Field,叫差分服务,或叫区分服务。
- 总长度:16bits,包括首部和数据部分。能表示的最大长度为 65535(216-1)。且这个字段是必须的,当 IP 数据包小于 46bytes 时在以太网帧中数据将会被填充到 46bytes ,这时候如果没有这个字段我们接收到帧后便不能得到正确的 IP 数据包。
- 标识:16bits,它是一个计数器,用来产生数据报文的标识。数据报文在分片时标志会被复制到每一个分片中。
- 标志:3bits,第一位 0bit 保留;中间位DF(Don’t Fragment),DF=0 表示能分片,DF=1 表示不能分片。最低位为MF(More Fragment) ,MF=1 表示后面还在传输数据报的分片, MF=0 表示最后一个报文段。
- (片)偏移:13bits,用于数据包分片和重组。13 位(片)偏移字段,较长的分组在分片后,某片在原来分组中的相对位置。分片偏移以 8bytes 做为计量单位,第一个分片偏移为 0。所以当 Fragment Offset 为0时,表示这个数据报文没有分片,或者第一个分片。
- 生存时间(TTL):8bits,意为Time To Live,表明是数据报在网络中的寿命,单位为秒设置了数据包可以经过的最多路由器数量。
- 协议:8bits,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的 IP 层知道应将数据部分上交给哪个处理过程。网络层以上的高层协议有 TCP,UDP,OSPF,EGP,IGMP,ICMP 等。
- 首部校验和:16bits,校验数据报的首部根据 IP 首部计算的检验和码,它不对首部后面的数据进行计算。采用的是 16bits 二进制反码求和。在上面的 Wireshark 中的 Header Checksum 显示validation disabled,表示这个软件关闭校验和的抓包功能。如果开启该功能,会显示 good 或 bad。
- 源地址:32bits,源主机的 IP 地址。
- 目的地址:32bits,目标主机的 IP 地址。
- 可项字段:最多 40bytes,IP首部的可变部分就是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。选项字段的长度可变,取决于所选择的项目。增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。