
固定部分:每个 IP 数据报首部都必须包含的内容
- 某些 
IP数据报的首部除了包含 20 20 20 字节的固定部分外,还包含一些可选的字段来增加IP数据报的功能 
IP 数据报的首部常以 
    
     
      
       
        32
       
      
      
       32
      
     
    32 个比特为单位进行描述
- 图中的每一行都由 32 32 32 个比特(也就是 4 4 4 字节)构成
 
每个小格子称为字段或者域
每个字段或某些字段的组合用来表达 IP 协议的相关功能
1、版本字段(4 bit)
版本字段
- 占 
     
      
       
        
         4
        
       
       
        4
       
      
     4 比特,表示 
IP协议的版本。
通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为 4 4 4(即IPv4)。 

2、首部长度字段(4 bit)
首部长度字段
- 占 
     
      
       
        
         4
        
       
       
        4
       
      
     4 比特,表示 
lP数据报首部的长度。该字段的取值以 4 4 4 字节为单位。 - 最小十进制取值为 
     
      
       
        
         5
        
       
       
        5
       
      
     5(
     
      
       
        
         0101
        
       
       
        0101
       
      
     0101) ,表示 
IP数据报首部只有20字节固定部分; - 最大十进制取值为 
     
      
       
        
         15
        
       
       
        15
       
      
     15(
     
      
       
        
         1111
        
       
       
        1111
       
      
     1111),表示 
IP数据报首部包含 20 20 20 字节固定部分和最大 40 40 40 字节可变部分。 

2、可选字段(1~40 B)
可选字段
- 长度从 1 1 1 个字节到 40 40 40 个字节不等。用来支持排错、测量及安全等措施
 - 可选字段增加了 
IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。 - 这就增加了每一个路由器处理 
IP数据报的开销。实际上可选字段很少被使用。 

3、填充字段(全 0)
填充字段
- 确保首部长度为 4 4 4 字节的整数倍。使用全 0 0 0 进行填充。
 
IP 数据报的首部长度一定是 
    
     
      
       
        4
       
      
      
       4
      
     
    4 字节的整数倍。
- 由于首部中的可选字段的长度从 1 1 1 个字节到 40 40 40 个字节不等。
 - 那么,当 20 20 20 字节的固定部分 + 1 1 1 到 40 40 40 字节长度不等的可变部分
 - 会造成首部长度不是 4 4 4 字节的整数倍时,就用取值为全 0 0 0 的填充字段填充相应的字节
 - 以确保 
IP数据报的首部长度时 4 4 4 字节的整数倍 

4、区分服务(8 bit)
区分服务
- 占 8 8 8 比特,用来获得更好的服务。
 - 该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。
 - 
     
      
       
        
         1998
        
       
       
        1998
       
      
     1998 年,因特网工程任务组 
IETF把这个字段改名为区分服务。 - 利用该字段的不同数值可提供不同等级的服务质量。
 - 只有在使用区分服务时,该字段才起作用。一般情况下都不使用该字段。
 

5、总长度(16 bit)
总长度
- 占 
     
      
       
        
         16
        
       
       
        16
       
      
     16 比特,表示 
lP数据报的总长度(首部 + 数据载荷)。 - 最大取值为十进制的 65535 65535 65535 ( 2 16 − 1 2^{16}-1 216−1),以字节为单位。
 

首部长度字段和总长度字段的区别与联系

假设首部中的首部长度字段的二进制取值为 
    
     
      
       
        0101
       
      
      
       0101
      
     
    0101
- 则可以计算出 
IP数据报的首部长度: ( 0101 ) 2 × 4 = 5 × 4 = 20 (0101)_2 \times 4 = 5 \times 4 =20 (0101)2×4=5×4=20(字节) 
假设首部中的总长度字段的二进制取值为 
    
     
      
       
        0000001111111100
       
      
      
       0000001111111100
      
     
    0000001111111100
- 则可以计算出 
IP数据报的总长度: ( 0000001111111100 ) 2 = 1020 (0000001111111100)_2 = 1020 (0000001111111100)2=1020(字节) 
进而可以算出数据载荷的长度
- 数据载荷长度 = 总长度 - 首部长度 = 1000 1000 1000(字节)
 

6、标识(16 bit)、标志(3 bit)、片偏移(13 bit)
标识、标志、片偏移
- 它们共同用于 
IP数据报的分片 

这是网络层的 IP 数据报,它将在数据链路层封装成帧。
每一种数据链路层协议都规定了帧的数据载荷的最大长度
- 最大传输单元 
MTU 

需要将原 IP 数据报分片为更小的 IP 数据报,在将各分片 IP 数据报封装成帧
标识字段
- 占 16 16 16 比特,属于同一个数据报的各分片数据报应该具有相同的标识。
 IP软件维持一个计数器,每产生一个数据报,计数器值加 1 1 1 ,并将此值赋给标识字段。
标志
占 3 3 3 比特,各比特含义如下:
DF 位:
- 1 1 1 表示不允许分片;
 - 0 0 0 表示允许分片
 
MF 位:
-  
1 1 1 表示 “后面还有分片”;
 -  
0 0 0 表示 “这是最后一个分片”
 
保留位:
- 必须为 0 0 0
 
片偏移
- 占 13 13 13 比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位。
 - 以 8 8 8 个字节为单位
 

7、对 IP 数据报分片
对 IPv4 数据报进行分片
如下所示:该 IP 数据报的总长度:
    
     
      
       
        3820
       
      
      
       3820
      
     
    3820 个字节

假设使用以太网传送该 IP 数据报。
- 以太网的最大传送单元 
MTU为 1500 1500 1500 字节 
也就是以太网的数据载荷部分最大为 1500 1500 1500 字节(上层的固定首部 + 数据载荷 = 下层的数据载荷)
- 无法封装 
     
      
       
        
         3820
        
       
       
        3820
       
      
     3820 字节长的 
IP数据报 
因此,需要把该 IP 数据报分片成几个更小的 IP 数据报
- 每个长度不能大于 1500 1500 1500 个字节
 
然后再将每个分片 IP 数据报封装成一个以太网帧进行传输
我们对原 IP 数据报的数据载荷分成三个更小的分片
前两个分片分别为: 1400 1400 1400 个字节
第三个分片为: 1000 1000 1000 个字节
说明:分片的总长度不能超过 
    
     
      
       
        1420
       
      
      
       1420
      
     
    1420 字节
分片结束后,给每个分片重新添加一个首部,使之称为 IP 数据报

思考:给各分片添加的首部是否完全相同呢?

其中分片 
    
     
      
       
        1
       
      
      
       1
      
     
    1 的 IP 数据报数据载荷部分的第一个字节,就是原 IP 数据报数据载荷部分的第一个字节
- 因此片偏移字段的取值为 0 / 8 0/8 0/8(除以 8 8 8 的原因是片偏移字段以 8 8 8 字节为单位)
 
现在假定分片 
    
     
      
       
        2
       
      
      
       2
      
     
    2 的数据报经过某个网络时还需要再进行分片

8、生存时间 TTL (8 bit)
生存时间 TTL
-  
占 8 8 8 比特,最初以秒为单位,最大生存周期为 255 255 255( 2 8 − 1 2^8-1 28−1) 秒;
- 路由器转发 
IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间, - 若不为 0 0 0 就转发,否则就丢弃。
 
 - 路由器转发 
 -  
现在以 “
跳数” 为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减 1 1 1,- 若不为 0 0 0 就转发,否则就丢弃。
 
 

9、生存时间 TTL 的作用
生存时间 TTL 的作用
- 防止 
IP数据报在网络中永久兜圈 
如下所示

为了简单起见,只给出了路由表中的由人工配置的静态路由条目
例如:R2 的路由表的目的网络 N2 条目

假设我们在人工配置这条静态路由条目时,错将下一跳 R3 配置成了 R1
- 这将导致将去往网络 
N2的IP数据报错误地转发给路由器R1 

假设 N1 要发给 N2 IP 数据报

若没有其他措施,IP 数据报将在路由环路中永久兜圈
10、协议字段 (8 bit)
协议字段
- 占 
     
      
       
        
         8
        
       
       
        8
       
      
     8 比特,指明 
IPv4数据报的数据部分是何种协议数据单元。 - 常用的一些协议和相应的协议字段值如下。
 

例如:
11、首部检验和字段(16 bit)
首部检验和字段
-  
占 16 16 16 比特,用来检测首部在传输过程中是否出现差错。
 -  
比
CRC检验码简单,称为因特网检验和。 
IP 数据报每经过一个路由器,路由器都要重新计算首部检验和,
- 因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化。
 
由于 IP 层本身并不提供可靠传输的服务,并且计算首部校验和是一项耗时的操作
- 因此在 
IPv6中,路由器不再计算首部校验和,从而更快转发IP数据报。 

12、源 IP 地址(32 bit)和目的 IP 地址(32 bit)
源 IP 地址和目的 IP 地址
- 各占 
     
      
       
        
         32
        
       
       
        32
       
      
     32 比特,用来填写发送该 
IP数据报的源主机的IP地址和接收该IP数据报的目的主机的IP地址。 

13、习题 ! ! \color{red}!! !!




在 IP 分组头中,目的 IP 地址字段前还有 
    
     
      
       
        16
       
      
      
       16
      
     
    16 个字节的内容
在以太网帧中,数据载荷前还有 14 14 14 个字节的内容
因此,在以太网帧中,从第 
    
     
      
       
        31
       
      
      
       31
      
     
    31 个字节开始的 
    
     
      
       
        4
       
      
      
       4
      
     
    4 个字节,实际上就是 IP 地址的内容

题目所给的以太网数据帧的第一列数据,实际上并不是以太网帧的内容,仅仅作为行号
- 其增量为 16 16 16 ,表示每行有 16 16 16 个字节的内容
 

从图中可知,主机的默认网关就是路由器 R,主机会将 Web 请求发送给默认网关
- 由默认网关将 
Web请求转发到因特网。 
因此,以太网帧头中的目的 MAC 地址字段,封装的就是默认网关的 MAC 地址。

第 4 4 4 问

14、小结




















