2.4 网络层02
2.4.5 IP 协议
1、用户数据在网络层(网际层)中使用IP协议进行封装,然后交付给数据链路层。IP协议提供不可靠无连接的数据报传输服务。
2、使用IP协议封装的数据我们称之为IP数据报。
3、IP数据报的首部:IP数据报的首部由20个字节组成,IP数据报的首部常以32个比特为单位进行描述,下图中的每一行都由32个比特(也就是4个字节)构成,每个小格子称为字段或者域。
IP数据报的首部是由固定的20个字节组成,它包含了必需的控制信息,比如源IP地址、目标IP地址、生存时间(TTL)、协议类型等。这些字段是所有IP数据报必须包含的基本信息,因此被认为是首部的固定部分。
除了固定部分外,IP数据报的首部还可以包含可选的字段,用于支持特定的功能或提供额外的信息。这些可选字段是可变的,并且只有在需要时才会出现在IP数据报中。可选字段的长度是可变的,可以根据需要而增加或减少。
因此,IP数据报的首部由固定部分和可选部分组成,其中固定部分是必需的,而可选部分是可变的并且在需要时才会存在。
-
版本:占4比特,表示IP协议的版本。
-
首部长度:
- 占4比特,表示IP数据报的首部的长度。
- 该字段的取值以4字节为单位(即首部长度=十进制*4 Byte)。
- 最小十进制取值为5(因为固定部分的长度是20字节)。
- 最大十进制取值为15(表示IP数据报首部包含20字节固定部分和做大40字节的可变部分)。
-
区分服务:占8比特,一般不使用。
-
总长度:
- 占16个比特,表示IP数据报的总长度=首部+数据载荷。
- 最大十进制值为216-1= 65535,以1字节为单位。
- 可推算出数据载荷的最大长度为:65535-20=65515 字节。
- 实际上在数据链路层规定了由网络层交付的数据最大长度MTU=1500字节。
-
标识、标志、片偏移:这三个字段共同用于IP数据报的分片(网络层有数据报分片功能),以太网中数据链路层规定MTU=1500字节,如果某个IP数据报总长度超过MTU,需要将源IP数据报分片为多个小的数据报,再将每个小的数据报封装成帧。
-
标识:占16比特,属于同一个IP数据报的各分片IP数据报应该具有相同的标识。IP软件一个计数器,每产生一个数据报,计数器值加1,并将此值赋给标识字段。
-
标志:占3比特,各比特含义如下:
- DF位:1表示不允许分片,0表示允许分片。
- MF位:1表示后面还有分片,0表示这是最后一个分片。
- 保留位:必须为0。
-
片偏移:
- 占13个比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位。
- 片偏移以8个字节单位。
-
数据报分片举例
-
-
生存时间:
- 占8比特
- 最初以秒为单位,最大生存周期为255秒。路由器转发IP数据报时将IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间,若不为0就转发,否则就丢弃。
- 现在以“跳数”为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减1,若不为0就转发,否则就丢弃。
- TTL作用可以防止IP数据报再网络中永久兜圈。
-
协议:
- 占8比特,指明IPv4数据报的数据部分是何种协议数据单元。
- 常用的一些协议和相应的协议字段如下:
-
首部校验和:
- 占16比特,用来检测首部在传输过程中是否出现差错。比CRC检验码简单,称为因特网检验和。
- IP数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志片偏移等)的取值可能发生变化。
-
源IP地址:占32比特,表示发送主机的IP地址。
-
目的IP地址:占32比特,表示目的主机的IP地址。
2.4.6 IP数据报的发送和转发过程
IP数据报的发送和转发过程包含两部分:主机发送IP数据报、路由器转发数据报。
假设在网络中由一台路由器连接了两个局域网,每个局域网的网络地址、子网掩码,以及每台主机的IP地址分配如下图所示:
为什么左边网络的网络地址是:192.168.0.0,右边网络的网络地址是192.168.0.128?(因为子网掩码是255.255.255.128)
同一个网络中的主机是可以直接通信的,这叫做直接交付;
而不同网络中间的主机是不能直接通信的,需要通过路由器进行中转,这属于间接交付。
那源主机是如何判断目的主机和自己是否在同一个网络中呢?
主机C将自己的IP地址与子网掩码进行按位与操作得到主机C的网络地址(网络号):192.168.0.0,然后将目的主机的IP地址与自己的子网掩码进行按位与操作得到目的网络地址:192.168.0.128,发现两个网路并不相等,说明主机C和主机F不在同一个网络中,不能进行直接交付,主机C将数据发送给路由器R,由路由器R再转发给主机F,这样就实现了主机F和主机F之间的数据通信(间接交付)。
但是问题又来了:主机C又是如何知道要将数据发送给路由器R呢?我们需要将路由器的接口地址192.168.0.126作为主机C的默认网关,这样当主机C发现目的地址与自己不在同一网络中时则将数据发送给设置好的默认网关(路由器)。因此我们可以将左边网络中所有主机的默认网关填写为192.168.0.126,将右边网络所有主机的默认网关填写为192.168.0.254。
那么路由器又是如何对数据进行转发的呢?假设主机A需要将数据发送给主机D,因为主机A与主机D不在同一个网络,所以主机A将数据发送给路由器R,路由器会进行如下操作:
- 首先检查IP数据报首部是否出错:若出错,则直接丢弃该IP数据报并通告源主机,若没有出错,则进行转发。
- 然后根据IP数据报的目的地址在路由表中查找匹配的条目:若找到匹配的条目,则转发给条目中指示的下一跳若找不到,则丢弃该IP数据报并通告源主机。