rfc791 IP协议

简介

目的

在网络中,IP协议被用来从源主机向目的主机传送数据包。网络中的主机用固定长度的地址来标识。由于硬件限制,网络中只能通过有限大小的数据包,IP提供分片和重组功能来传输大的数据包。

范围

IP协议只提供传送数据所需的必要功能。至于可靠性,流量控制等功能都由上层协议提供。

接口

端对端协议调用IP协议,IP协议调用本机网络协议(如以太网协议)将数据包发送到目的主机或网关。
如:TCP模块要传输一个TCP数据包(包含TCP头和用户数据),它调用IP模块,并将地址和其它参数传递进去。IP模块建立IP数据包,然后调用以太网接口去传输数据。

功能

IP协议只实现两个基本功能:地址和分片
IP模块根据IP头部的地址将数据向目的主机传输。传输路径的选择称为路由。
当通过的网络流量较小时,IP模块根据IP头部中的标识对数据进行分片和重组。
这此功能模块运行在每一个主机和网关上,它们在处理地址,分片和重组上都遵循同样的规则。另外,这些模块(特别在网关上)还实现其它功能,如路由选择等。
IP协议将每一个数据包当作是独立的,与其它数据包没任何关系。不存在什么连接和虚拟电路。
IP协议使用4个标识提供服务:服务类型(Type of Service),生存时间( Time to Live),选项( Options), 头部校验值(Header Checksum)
服务类型标识希望得到的服务质量。它提供一组抽象的参数,用来对网络提供的服务进行选择。网关用它来选择下一个跳转点或下一个网关等。
生存时间决定一个数据包的最长生存时间。由发送都设置,每经过一个路由器减少1,如果在到达目的地之前减少为0,数据包被丢弃。
选项只在特殊情况使用,一般用不到。包括时间戳,安全,路由
头部校验值用来验证数据包的正确性,如果验证失败,数据包被丢弃并且发送错误报告。
IP协议不提供传输的可靠性。没有端对端的概念;没有对数据的错误控制,只有头部校验和;没有重传;没有流量控制。
发送错误报告通过ICMP,它在IP模块中实现。

概述

和其它协议的关系

+------+  +-----+      +-----+      +-----+
|Telnet|  | FTP |      | TFTP| ... | ... |
+------+  +-----+      +-----+     +-----+
    |      |              |              |
    +-----+            +-----+      +-----+
    | TCP |            | UDP | ...  | ... |
    +-----+            +-----+      +-----+
      |                  |              |
    +--------------------------------------+
    |     Internet Protocol & ICMP         |
    +--------------------------------------+
                        |
    +-------------------------------------+
    |       Local Network Protocol        |
    +-------------------------------------+

功能模块

从一个应用程序到另一个进行数据传输的功能模块有如下规则:

假设传输会经过一个中间的网关
发送方准备好要传输的数据,调用本地的IP模块发送数据,调用时传递目的地址和其它的参数
IP模块准备好数据头,将数据放在后面。IP模块为此IP地址决定链路层地址(Local network address),这里这个地址为网关
传递数据和链路层地址到链路层接口(local network interface)
链路层接口创建自己的头部,将数据放在后面,发送到本地网络
数据包到达网关,链路层接口去掉链路层头部,将数据提交到IP模块,IP模块根据数据中的IP地址决定数据转发到第2个网络的主机。IP模块决定目的主机的链路层地址,调用链路层接口发送数据。
链路层接口创建自己的头部,将数据放在后面,发送到本地网络
数据包到达目的主机,链路层接口去掉链路层头部,将数据提交到IP模块
IP模块决定目的主机中有一个应用程序要使用此数据,它将此数据提交给应用,作为对系统调用的回应,同时提交源地址和其它一些参数

Application                                     Application
Program                                         Program
     \                                              /
Internet Module        Internet Module            Internet Module
     \                  /           \                 /
    LNI-1            LNI-1         LNI-2            LNI-2
        \             /                \              /
        Local Network 1                 Local Network 2

功能描述

IP协议的目的就是在一组相连的网络上移动数据包。数据包从一个IP模块传输到另一个IP模块,直到到达目的地。IP模块运行在网络系统的主机和网关上。数据包根据IP地址选择不同的路由,穿过一个个独立的网络,从一个IP模块传输到另一个IP模块。所以,IP地址是IP协议中重要的机制。
在从一个IP模块传输到另一个IP模块的过程中,可能会通过一些网络,它们永许通过的最大数据包尺寸小于数据包的大小,所以IP协议提供了分片机制。

地址

先来比较下名称,地址和路由的不同。名称表示我们找的是什么;地址表示它在哪里;路由表示如何到达。IP协议主要处理地址。高层协议负责名称到地址的转化。IP模块映射IP地址到物理地址。低层协议建立物理地址到路由的映射。
地址是固定的32位长(4字节)。地址的开始部分为网络号,剩下的为主机号。有2类地址:a类地址最高位为0,下面的7位为网络号,下面的24位为主机号;b类地址最高2位为0,下面的14位为网络号,下面的16位为主机号;c类地址最高3位为0,下面的21位为网络号,下面的8位为主机号。
映射IP地址到物理地址要注意,一个物理地址可以对应多个不同的IP地址;主机可以有多个不同的物理地址。
对于有多个物理地址,每个物理地址又对应多个IP地址的情况,必须要定义规则。

分片

发送数据包的网络允许传输大尺寸的数据包,当经过允许传输小尺寸数据包的网络时,分片是必须的。
数据包可以被标识为“不可分片“,此时,在任何环境下,都不可以被分片,如果这些包不能到达目的地,将被丢弃。
数据穿过一个网络,分片,传输和重组对IP模块都不可见时,称为内网分片(intranet fragmentation)。
分片将数据分成小的数据包,并在后面可以将它们重组起来。接收方通过各分片中的ID位来区分不同数据包的分片;通过各分片中的偏移位和长度来计算此分片在原数据中的位置。通过标识位more-fragments来识别是否为最后一个分片。
ID位用来区分不同数据包的分片。初始化时,设置ID,并保证值在一个连接中是唯一的;设置数据包的协议类型;设置more-fragments为0,设置偏移值为0。
要对一个长数据包分片,新建2个数据包,把长数据包中IP头分别拷贝到2个新的数据包中。长数据包中的数据按照8字节(64位)对齐分成两份(第一份必须8字节对齐,第2份如果数据不够不用8字节对齐)。第一份数据中8字节的数量称为NFB(Number of Fragment Blocks)。第1份数据放在第1个新的数据包中,长度设为第1份数据的长度;more-fragments设为1。第2份数据放在第2个新的数据包中,长度设为第2份数据的长度;more-fragments设为和长数据相同;偏移位置设为长数据中的偏移位置加上NFB。
上面的过程可以被重复n次,而不是2次。
重组包时,所有将下面4个部分相同的分片当作一个数据包:ID,源地址,目的地址,协议类型。将各分片按它们的偏移位置重新组合。第一个分片的偏移为0,最后一个分片的more-fragments为0。

网关

网关实现了不同网络的数据转发功能。网关实现了GGP(Gateway to Gateway Protocol)来支持路由和其它网络控制信息。
网关不用实现高层协议,GGP被加入到了IP模块中。

   +-------------------------------+
   | Internet Protocol & ICMP & GGP|
   +-------------------------------+
          |                   |
+---------------+          +---------------+
|    Local Net  |          |    Local Net  |
+---------------+          +---------------+

规范

IP头格式
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|         Total Length          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Identification       |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Source Address                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Destination Address                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Options              |     Padding   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Version: 4 bits

版本号,这里为4
IHL: 4 bits
IP头部的长度,单位为32位,它也指向数据开始位置,。一个正确头部的最小值为5。
Type of Service: 8 bits
服务类型标识希望得到的服务质量。它提供一组抽象的参数,用来对网络提供的服务进行选择。网关用它来选择下一个跳转点或下一个网关等。主要有3个选择:低延迟,高可靠性,高吞吐量。

Bits 0-2: Precedence.
Bit 3: 0 = 一般延迟, 1 = 低延迟
Bits 4: 0 = 一般吞吐量, 1 = 高吞吐量
Bits 5: 0 = 一般可靠性, 1 = 高可靠性
Bit 6-7: 保留位

   0     1     2     3     4     5     6     7
+-----+-----+-----+-----+-----+-----+-----+-----+
|                 |     |     |     |     |     |
|   PRECEDENCE    |  D  |  T  |  R  |  0  |  0  |
|                 |     |     |     |     |     |
+-----+-----+-----+-----+-----+-----+-----+-----+

Precedence

111 - Network Control
110 - Internetwork Control
101 - CRITIC/ECP
100 - Flash Override
011 - Flash
010 - Immediate
001 - Priority
000 - Routine
Total Length: 16 bits
数据包的整个长度,字节为单位。最大允许65,535字节的数据包。所有主机必须能接收最少576字节的数据包。
选择576,是允许合理尺寸的数据加上IP头进行传输。如:512字节用户数据加上64字节的头。最大的IP头为60字节,一般为20字节,加上高层协议的头
Identification: 16 bits
用在分片中
Flags: 3 bits
Bit 0: 保留,必须为0
Bit 1: (DF) 0 = 可以分片, 1 = 不可分片
Bit 2: (MF) 0 = 最后的分片, 1 = 后面还有分片

  0   1   2
+---+---+---+
| 0 |DF |MF |
+---+---+---+

Fragment Offset: 13 bits

分片的偏移位置,单位为8字节(64位),第一个分片偏移为0
Time to Live: 8 bits
生存时间决定一个数据包的最长生存时间。由发送都设置,每经过一个路由器减少1,如果在到达目的地之前减少为0,数据包被丢弃。
Protocol: 8 bits
下一层协议类型
Header Checksum: 16 bits
只对IP头部进行的校验和。因为头部的某些域会改变(如TTL),所以在每一个处理头部的点此校验和都要被计算和验证。
算法:The checksum field is the 16 bit one’s complement of the one’s complement sum of all 16 bit words in the header. For purposes of computing the checksum, the value of the checksum field is zero.
Source Address: 32 bits
Destination Address: 32 bits
Options: variable
选项可以出现在数据包中,也可以不出现。有两种格式的选项:

1:单个字节
2:1个类型字节,1个长度字节,后面是实际数据
长度字节包括类型字节,长度字节和实际数据
类型字节分成3部分:
1 bit copied flag
2 bits option class
5 bits option number
copied flag确定在分片时,此属性是否要拷贝到分片中:
0 = 不拷贝
1 = 拷贝
option classes
0 = 控制
1 = 保留
2 = debugging and measurement
3 = 保留
下面是一些属性:

CLASS NUMBER LENGTH DESCRIPTION
----- ------ ------ -----------
   0    0      -    选项列表结束。只有一字节。
   0    1      -    空操作。只有一字节。
   0    2     11    安全。
   0    3     var.  LSR(Loose Source Routing)。根据提供的地址对数据进行路由。
   0    9     var.  SSR(Strict Source Routing)。根据提供的地址对数据进行路由。
   0    7     var.  RR(Record Route)。记录经过的路由。
   0    8      4    Stream ID. stream identifier.
   2    4     var.  网络时间戳

选项列表结束

+--------+
|00000000|
+--------+
Type=0

表示选项列表结束。不一定和IP头部的结束位置重合。用来表示所有属性的结束,而不是单个属性的结束。只在选项结束位置和IP头部结束位置不重合时使用。可以被拷贝到分片,也可以不被拷贝。
空操作

+--------+
|00000001|
+--------+
Type=1

用在选项中间,使每个选项开始位置和32位对齐。可以被拷贝到分片,也可以不被拷贝。
安全
可以发送:security,compartmentation,handling restrictions, TCC (closed user
group)参数。

+--------+--------+---//---+---//---+---//---+---//---+
|10000010|00001011| SSS SSS| CCC CCC| HHH HHH|    TCC |
+--------+--------+---//---+---//---+---//---+---//---+
Type=130 Length=11

Security (S field): 16 bits

16个等级的安全,有8个保留。
00000000 00000000 - Unclassified
11110001 00110101 - Confidential
01111000 10011010 - EFTO
10111100 01001101 - MMMM
01011110 00100110 - PROG
10101111 00010011 - Restricted
11010111 10001000 - Secret
01101011 11000101 - Top Secret
00110101 11100010 - (Reserved for future use)
10011010 11110001 - (Reserved for future use)
01001101 01111000 - (Reserved for future use)
00100100 10111101 - (Reserved for future use)
00010011 01011110 - (Reserved for future use)
10001001 10101111 - (Reserved for future use)
11000100 11010110 - (Reserved for future use)
11100010 01101011 - (Reserved for future use)
Compartments (C field): 16 bits
全0表示非compartmented,其它值可以从Defense Intelligence Agency中得到。
Handling Restrictions (H field): 16 bits
The values for the control and release markings are alphanumeric digraphs and are defined in the Defense Intelligence Agency Manual DIAM 65-19, “Standard Security Markings”.
Transmission Control Code (TCC field): 24 bits
Provides a means to segregate traffic and define controlled communities of interest among subscribers. The TCC values are trigraphs, and are available from HQ DCA Code 530.
必须拷贝到分片中
LSRR(Loose Source and Record Route)

+--------+--------+--------+---------//--------+
|10000011| length | pointer|     route data    |
+--------+--------+--------+---------//--------+
Type=131

使用LSRR,数据包的发送方可以提供路由信息,当网关转发数据时可以用到这些信息,并记录相关的路由信息。
选项以类型开始;第2字节是长度;第3字节指向路由数据,指向下一个地址的开始字节,偏移值从选项开始计算,最小的合法值为4。
路由数据由一串IP地址组成。每一个IP地址为32位。如果pointer大于长度,路由根据目标地址来进行。
如果目标地址到达,但pointer小于长度,用下一个地址替换目标地址,用本机地址替换下一个地址,pointer加4。
用本机地址替换源路由的作法可以保证数据在传输过程中此选项大小不变。
网关和主机可以通过任何路径到达下一个地址。
分片中必须拷贝。
SSRR(Strict Source Routing and Record Route)
使用SSRR,数据包的发送方可以提供路由信息,当网关转发数据时可以用到这些信息,并记录相关的路由信息。
选项以类型开始;第2字节是长度;第3字节指向路由数据,指向下一个地址的开始字节,偏移值从选项开始计算,最小的合法值为4。
路由数据由一串IP地址组成。每一个IP地址为32位。如果pointer大于长度,路由根据目标地址来进行。
如果目标地址到达,但pointer小于长度,用下一个地址替换目标地址,用本机地址替换下一个地址,pointer加4。
用本机地址替换源路由的作法可以保证数据在传输过程中此选项大小不变。
网关和主机必须直接发送到下一个地址,不能通过任何中间路由。
分片中必须拷贝。
RR(Record Route)

+--------+--------+--------+---------//--------+
|00000111| length | pointer|     route data    |
+--------+--------+--------+---------//--------+
Type=7

提供方法记录路由
选项以类型开始;第2字节是长度;第3字节指向路由数据,指向下一个可以记录的位置,偏移值从选项开始计算,最小的合法值为4。
路由数据由一串IP地址组成。每一个IP地址为32位。如果pointer大于长度,记录区域己满。选项的大小不能动态调整,路由区域要初始化为0。
当IP模块路由一个数据包时,如果检测到此属性,将自己的IP地址插入到pointer指向的位置,然后pointer加4。
如果己满,将不再插入地址进去。如果还有一些空间但不能完全放入一个IP地址,一定是出错了。这两种情况都发一个ICMP错误回去。
不在分片中拷贝,只能存在第一个分片中。
Stream ID

+--------+--------+--------+--------+
|10001000|00000010|     Stream ID   |
+--------+--------+--------+--------+
Type=136 Length=4

This option provides a way for the 16-bit SATNET stream identifier to be carried through networks that do not support the stream concept.
必须在分片中拷贝。
网络时间戳

+--------+--------+--------+--------+
|01000100| length | pointer|oflw|flg|
+--------+--------+--------+--------+
|          internet address         |
+--------+--------+--------+--------+
|          timestamp                |
+--------+--------+--------+--------+
|                 .                 |
                  .
                  .
Type = 68

长度字节为单位,最大40。pointer指向下一个时间的开始字节,偏移值从选项开始计算,最小的合法值为5。当pointer大于长度,说明空间己满。
溢出位oflw是由于空间己满而不能插入时间的IP模块的数量。4位大小。
flg(4位)的值如下:

0 : 只保存时间,32位
1 : 时间前保存写入时间的地址
3 : 地址被提前设定,如果IP模块与设定的地址一样,保存时间。
选项的大小不能动态调整,路由区域要初始化为0。
如果空间己满,数据被继续转发,oflw位加1
如果还有一些空间但不能完全放入一个时间,或是oflw溢出,一定是出错了。这两种情况都发一个ICMP错误回去。
padding
使IP头32位对齐,值为空。

讨论
地址

网络号全为0的地址表示本地网络,这个只在一些ICMP报文中出现。

分片和重组

ID,源地址,目的地址,协议类型,这4个相同,它们就要被重组成一个数据包。
MF为1,说明此分片不是最后一个,偏移位置是此分片在原来数据包中的位置,分片按8字节边界来划分。如果一个数据包没有分片,它的MF和偏移都为0。
分片产生,一些属性被拷贝,一此只存在第一个分片中。
分片可能影响下面的值:

  1. 选项
  2. MF
  3. 偏移
  4. IP头部长度
  5. 数据包总长
  6. 头部校验和
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值