1. 介绍
1.1. 产生原因
IP协议是用于将多个包交换网络连接起来的,它在源地址和目的地址之前传送一种称之为数据报的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
1.2. 范围
IP的责任就是把数据从源传送到目的地。它不负责保证传送可靠性,流控制,包顺序和其它对于主机到主机协议来说很普通的服务。
1.3. 接口
这个协议由主机到主机协议调用,而此协议负责调用本地网络协议将数据报传送以下一个网关或目的主机。例如TCP可以调用IP协议,在调用时传送目的地址和源地址作为参数,IP形成数据报并调用本地网络(协议)接口传送数据报。
1.4. 操作
IP实现两个基本功能:寻址和分段。IP可以根据数据报报头中包括的目的地址将数据报传送到目的地址,在此过程中IP负责选择传送的道路,这种选择道路称为路由功能。如果有些网络内只能传送小数据报,IP可以将数据报重新组装并在报头域内注明。IP模块中包括这些基本功能,这些模块存在于网络中的每台主机和网关上,而且这些模块(特别在网关上)有路由选择和其它服务功能。对IP来说,数据报之间没有什么联系,对IP不好说什么连接或逻辑链路。
IP使用四个关键技术提供服务:服务类型,生存时间,选项和报头校验码。服务类型指希望得到的服务质量。服务类型是一个参数集,这此参数是Internet能够提供服务的代表。这种服务类型由网关使用,用于在特定的网络,或是用于下下一个要经过的网络,或是下一个要对这个数据报进行路由的网关上选择实际的传送参数。生存时间是数据报可以生存的时间上限。它由发送者设置,由经过路由的地方处理。如果未到达时生存时间为零,抛弃此数据报。对于控制函数来说选项是重要的,但对于通常的通信来说它没有存在的必要。选项包括时间戳,安全和特殊路由。报头校验码保证数据的正确传输。如果校验出错,抛弃整个数据报。
IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。
2. 总览
2.1. 与其它协议的联系
下图显示了IP协议在协议体系中的位置。
IP上下有两个接口,一个是与主机与主机协议的接口,另一个是与本地网络的接口,本地网络可以是小型网络也可以大型网络,说不定的。
2.2. 操作模式
下面的例子可以看到操作的模型是什么。我们假设传输要经过中间网关。传送进程调用本地IP模块传送数据,同时传送目的地址和其它参数作为调用参数。IP层准备数据报头并把它加在需要传送的数据之前。IP模块为这个网络地址决定一个本地网络地址,在这里就是网关地址。IP传送数据报和本地网络地址到网络接口。本地网络接口创建一个本地网络头加在数据报上,然后向本地网络发送。
加上本地网络头的数据报到达网关后,本地网络接口去掉这个头,将结果传送给(网关上的)IP模块。这个IP模块决定决定目的主要的本地网络地址,然后再如上所述的过程传送数据报到本地网络接口。这个本地网络接口创建一个本地网络头加在数据报上,将数据报传送到目的主机。在目的主机上,本地网络接口去掉数据报上的本地网络头,将结果交给IP模块。IP模块决定数据报应该把数据报向哪一个应用程序传送,系统会发出系统调用,IP模块返回源地址和其它参数。
2.3. 功能描述
IP的功能就是把数据报在互联的网络上传送,通过将数据报在一个个IP模块间传送直到目的模块来达到目的。网络中每个主机和网关上都有IP模块。数据报在一个个模块间通过路由处理网络地址传送到目的地址。因此网络地址对于IP协议十分重要。如前所述,因为各个网络上的数据报大小可能不同,因此有必要对大的数据报进行分段。
名字,地址和路由是有区别的,名字是我们要找的,地址指出这个名字在什么地方,路由解决如何到那里的问题。IP主要处理地址的问题。把名字和地址进行映射的工作由上层协议完成。IP模块将地址和本地网络地址加以映射,而将本地网络地址和路由进行映射则是低层协议的任务。
地址是32位长,由网络号和本地地址两部分构成。地址有三类:A类的最高位为0,后7位表示网络号,其它的24位表示本地地址;B类前两位为10,后14位表示网络地址,其它16位表示本地地址;C类三位为110,后21位是网络号,其它8位代表本地地址。
在将网络地址和本地网络地址进行映射时必须注意,有些主机可能使用几个不同的IP地址(我们可以把本地网络地址理解为MAC地址)。我们必须能够处理一台主机有几个处理端口,而每个端口都有几个逻辑的IP地址。
对于不同的网络,其中传送的包大小可能不一样,因此把大包分小的功能是必须的。数据报也可以被标记为“不可分段”,如果一个数据报被如何标记了,那么在任何情况下都不准对它进行分段。如果不分段到不了目的地,那就把包在半路抛弃了。在本地网内进行的重新分段和重组对IP模块是不可见的,这种方法也可以使用。
本地网分段和重组把重组的各段加上标记,接收方使用这些标记使不同的段区别开来。段偏移量域告诉接收方应该把这一段放在什么地方,多段标记指示最后一个段,利用不同的域完全可以重组一个数据报。标记域是用于唯一标记数据报的,它是最初的发送方设置,而且要保证数据报在网络传输的全过程中它中唯一的。最初的发送方把多段标记设置为零,段偏移量设置为零。
我们假设IP模块把一个大数据报分为两个小的,IP模块首先取得数据报头,再分隔数据为两份,将数据报头加在两份数据上。分隔数据时以8个字节为单位,第二段不一定是8个字节,但第一个必须是。我们把第一段中的8位字节数称为段块数(NFB)。新生成的第一个数据报内是生成的第一段数据,设置多段标记为1;新生成的第二个数据报内是生成的第二段数据,多段标记等于原来数据报内的值,段偏移量等于原数据报中的值加上NFB。上述过程可以从2扩展至N的情况。
对段的重组要求以下四个域有相同的值:标记,源地址,目标地址和协议。将不同的数据报根据自己带的偏移量重新组合为新段,第一个段的偏移量为0,最后一个段的多段标记为0。
2.4. 网关
网关在不同网络间传送数据报,网关也实现网关到网关协议(GGP),它用于传送路由和其它控制信息。网关中的高层协议根本不用实现,GGP的功能可以在IP模块内实现。
3. 说明
3.1. Internet包头格式
包头格式如下:
3.1.1
此域标明包头的格式。我们现在说明的是IP版本4。
Internet包头长度是以32位为单位标记的包头长度,它指向数据的开始位置,这个域的最小合法值为5。
它是一些指示服务质量的参数,这些参数用于在特定网络指示所需要的服务。有些网络会提供优先级服务。选择的基本原则是以下三者的权衡:低延时,高可靠和高吞吐量。
Ø 0-2: 优先级
Ø 3: 0 = 通常延时 1 = 低延时
Ø 4: 0 = 通常吞吐量 1 = 高吞吐量
Ø 5: 0 = 通常可靠性 1 = 高可靠性
Ø 6-7: 保留
优先级的说明如下:
Ø 111 - Network Control
Ø 110 - Internetwork Control
Ø 101 - CRITIC/ECP
Ø 100 - Flash Override
Ø 011 – Flash
Ø 010 – Immediate
Ø 001 – Priority
Ø 000 – Routine
如果使用了延时(D),吞吐量(T)和可靠性(R)选项可以增加服务质量。这因各个网络不同而不同,没有通用性。除了非常特殊的情况外,最多设置两个参数就够了。服务类型是用来指示如何对待在网络中传送的数据报。网络控制优先级原来是用于一个网络中的,而实际中却应用于每个网络了。互联控制是用于网关控制的。如果只在一个网络中实现了这些参数,那个网络必须在自己的范围之内控制对它们的访问。
总长度指的是数据报的长度,由字节计,包括数据和报头。允许数据报的大小为64K。这么大的数据报对大多数主机和网络来说是不适用的。但是,所有主机必须能够接收大于576字节的数据报,无论它们是一起来,还是分段来。如果知道对方主机能够接收大于576字节的数据报,最好在发送时不要发送小于576字节的数据报。选择576是因为576=512(数据)+64(报头)。报头最长不超过60字节,通常为20字节。
标记是发送用于帮助重组分段的包的。
Ø 0: 保留,必须为0
Ø 1: (DF) 0 = 可分段,1 = 不可分段
Ø Bit 2: (MF) 0 = 最后一段,1 = 还有多段
|
0 |
1 |
2 |
|
0 |
DF |
MF |
此域指示这个段在应该在数据报中什么位置,它以64位为单位计算,首段的偏移为零。
此域说明数据报在互联网系统生存的最大时间。如果此域的值为零,抛弃此数据报。在处理报头的同时也处理此域。时间以秒计,但每个处理单元都至少会对TTL减一,即使时间小于一秒。
此域指示用于数据报数据部分的下一层协议。
校验码只在头部,因此头域会在处理时改变,因此头会经常改变。这种校验方法比较容易计算,实验证明它也是适用的,但它可能在未来被CRC校验过程取代。
在数据报中可以有选项也可以没有,但IP模块中必须有处理选项的功能。有些情况下,安全选项是必须的。它的长度不定,可以没有也可以是多个。选项有两种格式:
Ø 单独一个选项类型字节;
Ø 一个选项类型字节,一个选项长度字节和实际选项数据字节。。
1)选项长度是选项类型,长度本身和数据的长度。选项类型可被看作有3个域:
Ø 1位 复制标记
Ø 2位 选项类
Ø 5位 选项号
复制标记指这个选项要在分段是要存在于所有段中。
Ø 0 = 不复制
Ø 1 = 复制
选项类有:
Ø 0 = 控制
Ø 1 = 保留
Ø 2 = 调度和测量
Ø 3 = 保留
下面是具体选项:
|
CLASS |
NUMBER |
LENGTH |
DESCRIPTION |
|
0 |
0 |
- |
选项表结束。只占一个字节,没有长度字节 |
|
0 |
1 |
- |
无操作。只占一个字节,没有长度字节 |
|
0 |
2 |
11 |
安全,用于传送安全,Compartmentation,用户组(TCC)和DOD规则兼容的处理限制码 |
|
0 |
3 |
变长 |
松源地址路由,使用源地址提供的信息进行路由 |
|
0 |
9 |
变长 |
紧源地址路由,使用源地址提供的信息进行路由 |
|
0 |
7 |
变长 |
记录路由,用于跟踪数据报采用的路由 |
|
0 |
8 |
4 |
流ID,用于传送流标记 |
|
2 |
4 |
变长 |
Internet时间戳 |
2)特定选项定义
Ø 选项表结束
+----------+
|00000000|
+----------+
Type=0
此选项指示选项表的结束,它不一定和报头结束点一致,它用于指示选项表的结束而不是每个选项的结束,只有当选项表结束位置和报头结束位置不一致时使用。它可以被复制,引入或在分段时删除。
Ø 无操作
+----------+
|00000001|
+----------+
Type=1
此选项可被用于选项间,它可以被复制,引入或在分段时删除。
3)安全
此选项提供主机一种发送安全,compartmentation,处理限制和TCC参数的方法。此选项的格式如下:
类型=130 长度=11
Ø 安全(S域):16位
安全共分16级,8级保留。
Ø 00000000 00000000 - 未分类的
Ø 11110001 00110101 - 机密
Ø 01111000 10011010 – EFTO
Ø 10111100 01001101 – MMMM
Ø 01011110 00100110 – PROG
Ø 10101111 00010011 - 限制的
Ø 11010111 10001000 - 秘密
Ø 01101011 11000101 - 绝对机密
Ø 00110101 11100010 - 保留
Ø 10011010 11110001 - 保留
Ø 01001101 01111000 - 保留
Ø 00100100 10111101 - 保留
Ø 00010011 01011110 - 保留
Ø 10001001 10101111 - 保留
Ø 11000100 11010110 - 保留
Ø 11100010 01101011 - 保留
Ø Compartments(C域):16位
全0代表传送的信息是非compartment的。
Ø 处理限制(H域):16位
控制值和版本标记是由字母和数字组成的,具体说明请参阅其它资料。
Ø 传输控制码(TCC域):24位
提供控制流量的方法。TCC的值为三字母词。在分段时必须复制它。
4)松源地址和记录路由
+----------+--------+--------+------------//--------+
|10000011| length | pointer| route data |
+----------+--------+--------+---------//-----------+
Type=131
松源地址和记录路由(LSRR)可以由源地址提供路由信息,并记录路由信息。这个选项以选项类型码开始。第二位是选项长度,第三位是一个指针,指向路由数据中下一个要被处理的源地址,它的最小值为4。路由数据是由一系列地址组成的,每个地址是32位。如果指针大于长度,源路由为空(记录的路由满),路由要根据目的地址域进行。
如果目的地址已经达到,而指针未大于长度,源路由中的下一地址代替目的地址域中的地址,同时记录的路由地址代替则使用过的源地址,将指针加4。这一以记录的路由替换源路由的过程意味着选项(和IP头一起作为一个整体)数据报在网络中经过处理后保持一个固定长度。它称之为松源地址路由是因为网关或主机IP在达到路由的下一个地址时可以使用多个中间网关。它在分段时必须复制。
5)紧源地址和记录路由
+----------+--------+--------+---------//--------+
|10001001| length | pointer| route data |
+----------+--------+--------+---------//--------+
Type=137
紧源地址和记录路由(SSRR)选项可以由源地址提供路由信息,并记录路由信息。这个选项以选项类型码开始。第二位是选项长度,第三位是一个指针,指向路由数据中下一个要被处理的源地址,它的最小值为4。路由数据是由一系列地址组成的,每个地址是32位。如果指针大于长度,源路由为空(记录的路由满),路由要根据目的地址域进行。
如果目的地址已经达到,而指针未大于长度,源路由中的下一地址代替目的地址域中的地址,同时记录的路由地址代替则使用过的源地址,将指针加4。这一以记录的路由替换源路由的过程意味着选项(和IP头一起作为一个整体)数据报在网络中经过处理后保持一个固定长度。它称之为紧源地址路由是因为网关或主机IP在达到路由的下一个地址时不可以使用中间网关。它在分段时必须复制。
6)记录路由
+--------+--------+--------+---------//--------+
|00000111| length | pointer| route data |
+--------+--------+--------+---------//--------+
Type=7
此选项提供了记录数据报路由的方法。这个选项以选项类型码开始。第二位是选项长度,第三位是一个指针,指向路由数据中下一个要被处理的源地址,它的最小值为4。记录的路由是由一系列IP地址构成的,每个IP地址是32位。如果指针大于长度,记录路由数据域已满。源主机必须为这一选项分配足够大的空间。空间分定后不会因为加入地址而增加。初始内容必须为0。
当IP模块处理数据报时,它检查是否有记录路由选项,如果有,它将自己的IP地址放入记录路由地址空间,指针值加4。如果地址空间已满,模块不会把自己的IP地址加入了;如果空间未满,可是不够整个地址加入,模块会认为源数据报出错并抛弃它。上面两种情况下,ICMP参数信息消息会发送到源主机。在分段时不复制,而仅仅存在于第一个段。
6)流标记
+--------+--------+--------+--------+
|10001000|00000010| 流ID |
+--------+--------+--------+--------+
类型=136 长度=4
此选项提供一种在不支持流的网络中传送16位SATNET流标记的方法。分段时须复制。
1) Internet时间戳
|
01000100 |
长度 |
指针 |
oflw标记 |
|
IP地址 | |||
|
时间戳 | |||
|
...... | |||
类型=68
选项长度是在选项内的类型,长度,指针和溢出/标记字节的大小。指针是从选项开始到时间戳结束的字节数加一。最小值为5。当指针大于长度时时间戳域满。溢出(oflw)(大小为4位)是IP模块号,这个模块因缺省空间而不能注册时间戳。它的值分别为:
1) 0 -- 仅有时间戳,保存于连续的32位字中;
2) 1 -- 每个时间戳前都有注册单元的IP地址;
3) 3 -- IP地址域是预先指定的,如果IP模块的地址和下一个指定的IP地址一致,则注册自己的时间戳。
时间戳是从UT午夜时间开始以毫秒计算的,如果时间不以毫秒计算,或不能提供以UT午夜为基准,那用什么时间倒都可以,只要时间戳的最高位设置为1,表示这不是一个标准值就行了。源主机必须为这一选项分配足够大的空间。空间分定后不会因为加入地址而增加。初值必须为零或IP地址/零这样的偶对。如果空间已满,模块在传送数据报时不加入时间戳,但溢出计数仍然加一。
如果剩余的空间不能使完全的时间戳加入,或溢出计数溢出,源数据报出错并被抛弃。ICMP参数信息消息会发送到源主机。此选项在分段时不复制,仅在第一段出现。
报头域填充用于保证报头是32位的倍数。填充值为0。
3.2.








