IP 数据报
IP 数据报
1.IP 数据报的格式
- 一个 IP 数据报由首部和数据两部分组成。(数据报也可以说是数据包)
- 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
- 在首部的固定部分的后面是一些可选字段,其长度是可变的。
2.IP 数据报首部的固定部分中的各字段
从图中可看到,数据报首部可分为固定部分和可变部分,固定部分为了五行,每行32位即4个字节。
-
版本——占 4 位(第一行四个字节中0~3位),指 IP 协议的版本该 IP 协议的版本号为 4 (即 IPv4);
-
首部长度——占 4 位(第一行四个字节中4~7位),表示首部总的长度(固定+可变部分);可表示的最大数值是 15 个单位(一个单位为 4 字节)因此 IP 的首部长度的最大值是 60 字节。
-
区分服务——占 8 位(第一行四个字节中8~15位),区分服务。即该段设置了数据报的优先程度,若要想实现数据报优先传输还需要在路由器端配置相应的区分服务设置。只有在使用区分服务(DiffServ)时,这个字段才起作用。在一般的情况下都不使用这个字段 。
-
总长度——占 16 位(第一行四个字节中16~31位),指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节。总长度必须不超过最大传送单元 MTU。
-
标识(identification)——占 16 位(第二行四个字节中1~15位),它是一个计数器,用来产生数据报的标识,即每产生一个数据报贴上一个标识。
-
标志(flag)——占 3 位(第二行四个字节中16~18位),目前只有前两位有意义。
标志字段的最低位是 MF (More Fragment)。MF = 1 表示后面“还有分片”。MF = 0 表示最后一个分片。
标志字段中间的一位是 DF (Don't Fragment) 。只有当 DF = 0 时才允许分片。即标志表示该数据报是否分片了?是第几个分片?
-
片偏移——占12 位(第二行四个字节19~31位)指出:较长的分组在分片后某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
IP 数据报分片举例
以太网传输的数据报数据部分一般都是1500个字节。如果有个数据报数据部分为3800字节(数据报总长度超过路由器的对大传送单元MTU) 就需要分为若干个数据报片发送。
如图中分为三个数据报片发送,在每个数据报片的首部都要写上原数据报首部的信息,包括目标IP 地址等,并编上号。数据报片的数据部分第一个字节表示偏移,每个数据报片的偏移 = 该报片数据部分的第一个字节号 / 8,如图所示。
-
生存时间——占 8 位(第三行四个字节中0~7位)记为 TTL (Time To Live)数据报在网络中可通过的路由器数的最大值。即计算机发出数据时会附带一个TTL值,该值在数据报每经过一个路由器就自减1,等到某路由器接收到该数据报发现其TTL值变为0时不在中转该数据报,而是将其丢弃并向最初发送者返回一个ICMP报文。TTL的设置可以防止数据报无限循环传输。
TTL简单举例
在命令行窗口尝试与本计算机的默认网关地址通信:ping 172.26.104.1,发现TTL值为255,因为访问的是本计算机的网关在同一网段上,不用经过其他路由器中转便可直接访问(Linux默认TTL值为255);
于是我尝试与美国的某个IP地址通信:ping 207.226.141.205,会得到IP 地址为63.218.56.150的路由器发来的回复:“TTL传输中过期”。说明在通信数据报在传输到该路由器上时TTL值已为0,随后该路由器将通信数据报自行销毁并给最初发出数据者(即本计算机)一个回复。
此外,还可以通过指定TTL的值,观察哪个路由器给计算机回复TTL过期信息,以此来跟踪通信数据报传输过程中途经的路由器:
ping 207.226.141.205 -i 1
指定通过 “-i 1“ 指定TTL值为1,即数据报中转到第一个路由器中就销毁了。
可以看到本计算机向IP地址:207.226.141.205,发出的包含通信请求的数据报经过的第一个路由器IP地址为本计算机的网关:172.26.104.1;第二个路由器的IP地址为10.0.2.37 。
- 协议——占 8 位(第三行四个字节8~15位)字段指出此数据报携带的数据使用何种协议。
协议字段里一般使用协议号来标识相关协议,比如其中一部分为:
- 首部校验和——占 16 位(第三行四个字节16~31位)字段只检验数据报的首部不检验数据部分,目的是验证数据报的首部有无错误。
检验过程
好比寄快递,发件方在快递单上写上收件人、地址、电话,然后根据这些信息得到一个校验和并写在快递单上;快递员收到这个快递之后检查对应的信息是否出错,出错了就不发了,并不在乎快递内的东西是否出错。也就是说该字段仅检查数据报的首部有无错误不关心数据部分。
- 第四行的四个字节表示:源地址;
- 第五行的四个字节表示:目的地址;
3.IP 数据报首部的可变部分
- IP 首部的可变部分就是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。
- 选项字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的项目。
- 增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。
- 实际上这些选项很少被使用。
4.抓包验证
这里所说的“抓包”指的是计算机通信的数据报,也可以叫做数据包。
- 首先回顾一下数据报的格式:
- 使用抓包软件Wireshark抓包如下:
选中某一数据包之后,下面的四栏选项显示的是数据包的具体内容,从上往下分别是:数据帧信息、数据链路层信息、网络层信息、运输层信息。
- 打开数据链路层信息栏:
可以发现数据链路层添加的内容:目标MAC地址、源MAC地址、协议类型:在数据链路层指明了网络层使用的协议是IPv4。
- 打开网络层信息栏:
其中:
Version:4表示版本字段,值4表示网络层使用IPv4协议与数据链路层指定的协议类型一致;
Header Length表示首部长度字段,值为20表示数据包首部为20个字节;
Differentiated Services Field表示区分服务字段,它的值0x00表示该数据包默认没有区分服务;
Total Length表示总长度字段,它的值1500表示整个数据包的总长度为1500字节;
Identification表示标识字段,表示该数据包的编号为61121,查看相邻的数据包可发现其标识为61122:
验证了计算机发送数据包时会按顺序给数据包加上连续的标识。
Flags表示标志字段,看看出该数据包并没有分片;
Flagment offset表示片偏移字段,由于数据包没有分片,所以片偏移为0;
Time to live即TTL表示生存时间字段;
Protocol表示协议字段,TCP(6)表示使用该数据包使用TCP协议传输,6为TCP协议的协议号;
Header checksum表示首部检验和字段,validation disabled表示首部检验和验证失败;
Source表示源地址字段;
Destination表示目标地址字段。