IPv4
《Tcp/Ip协议族》笔记
网际协议版本4(IPv4)
IP分组由一个基本首部和一些选项构成,这些选项有时用于促进和控制分组的交付。
目标:
- 解释IP协议背后的总体思想,并说明IP与Tcp/Ip协议族中其他协议之间的位置关系;
- 说明IPv4数据报的一般格式,并列出首部中各个字段;
- 讨论数据报的分片和重装,以及如何从数据报的分片中恢复原始的数据报;
- 讨论IPv4数据报中可能存在的一些选项以及它们的应用;
- 说明发送方站点如何为IPv4数据报的首部计算校验和,以及接受方站点有时如何检查这个检验和;
- 讨论IP在ATM上运行,并与建立局域网或点对点广域网之上的IP进行比较;
- 描述一个简化版本的IP软件包,并给出某些模块的伪码。
引言
网际协议(Internet Protocol,IP)是TCP/IP协议族在网络层使用的传输机制。
IP在TCP/IP协议族中的位置IP是一种不可靠的无连接数据报协议——尽最大努力交付(best-effort delivery)的服务。尽最大努力是IP分组有可能损坏、丢失、失序或延迟到达,并且可能会给网络带来拥塞。IP依靠更高层的协议来解决所有这些问题。
如果可靠性很重要,那么IP就必须与可靠的协议(如TCP)配合起来使用。
数据报
网络(互联网)层的分组称为数据报(datagram)。数据报是一个可变长度的分组,它由两部分组成:首部和数据。
首部长度由 20字节基本首部+0-40字节可选部分构成,包含有关路由选择和交付的重要信息。
习惯上,在TCP/IP中都是以4字节为一段来表示首部。
IP数据报-
版本(VER):
这个4位字段定义了IP协议的版本;
如果机器使用其他版本的IP,那么这个数据报就会被丢弃,而不是错误地进行解释。 -
首部长度(HLEN):
这个4位字段定义了数据报首部的总长度,以4字节(Byte)为单位计算;
可变首部长度,5(0101)x4=20Byte — 15(1111)x4=60Byte。 -
服务类型(TOS):
type of service,它指明了应当如何处理数据报;
它定义了一组区分服务(differentiated services)。
-
总长度:
这个16位字段定义了以字节为单位的数据报总长度(首部+数据),所以数据报长度限制在勒65535
($2^16-1$)Byte;
虽然65535字节的长度看起来好像很长,但是,随着底层技术使得更大的吞吐量(高带宽)成为可能,IP数据报的长度在不久的将来可能会大大增加;
某些物理网络不能把65535毕节的数据报封装成它们的帧,要以需要对数据报进行分片;
但有些情况下,因为数据报长度很小,需要对封装的帧附加一些填充才行。
-
标识:
此16位字段用于分片。 -
标志:
此3位字段用于分片。 -
分片偏移:
此13位字段用于分片。 -
生存时间(TTL):
此8位字段表示,数据报在互联网中是有生存时间限制的;
此字段之所以必要,是因为因特网中路由表很可能会损坏。一个数据报可能在两个或多个路由器之间逗留了很长时间,也没能够交付到目的主机;
这个字段的另一个用途就是源主机想故意限制这个分组的行程。 -
协议(Protocol):
此8位字段定义了使用此IP服务的高层协议;
有许多高层协议(如TCP,UDP,ICMP,IGMP
等)的数据都能被封装到IP数据报中;
这个字段指明了IP数据报必须交付给哪个最终目的协议。
值 | 协议 |
---|---|
1 | ICMP |
2 | IGMP |
6 | TCP |
17 | UDP |
89 | OSPF |
-
首部检验和:
-
源地址:
-
目的地址:
分片
数据报可以穿越不同的网络。每个数据报都会从收到的数据帧中拆解出IP数据报,并对它进行处理,然后再封装成另一个帧;
接收到的帧格式与长度取决于这个帧刚刚经过的物理网络所使用的协议,而发送出去的帧格式与长度则取决于这个帧将要经过的物理网络所使用的协议。
例如,某台路由器将一个以太网连接到一个广域网。
那么它收到的帧是以太网格式的,而发送的帧是广域网格式的。
最大传输单元(MTU)
每个数据链路层协议都有自己的帧格式,在这个格式中有一个字段是"数据字段最大长度"。
MTU对于不同的物理网络协议,MTU的值是不同的。
例如,以太网局域网的MTU是1500字节,FDDI局域网的MTU是4352字节,而PPP是296字节。
为了使IP协议与物理网络无关,协议设计者们决定让IP数据报的最大长度等于65535字节。如果我们使用的协议的MTU正好等于这个数值,那么传输效率会很高;
但是对于其他物理网络,就要分割数据报,使它们能够通过这些网络,这称为分片(fragmentation)。
当数据报被分片时,每一个数据报都有自己的首部,其中大部分的字段是重复的,但有些是变化的;
如果已经分片的数据报遇到具有更小MTU的网络,那么这些已经分片的数据报还可以再进行分片;
换言之,数据报在到达最后终点之前可以经过多次分片。
数据报可以被源主机或途中任何路由器分片,但数据报的重装只能在目的主机上进行,因为每一个分片都变成了独立的数据报;
一方面,分片的数据报可以各走不同的路由,我们永远无法控制或保证分片的数据报应当走哪一条路径;
另一方面,属于同一个数据报的所有数据报片最终是会到达它们的目的主机;
所以,从逻辑上讲,应当在最后的终点进行重装。
另外还有一个更有力的反对在传输期间进行重装的理由,那就是这样做会严重影响效率。
当数据报被分片时,首部中一些必要的部分必须被复制到所有的分片中,其余的各字段必须被复制;
对数据报进行分片的主机或路由器必须改变三个字段的值:标志,分片偏移,总长度;
不管是否进行分片,校验和的值总是要重新计算的;
只有数据报中的数据是分片的。
与分片有关的字段
与一个数据报的分片与重装有关的字段是:标识、标志和分片偏移。
-
标识:
此16位字段标志了从源主机发出的一个数据报;
在数据报分片时,标识字段的值要复制到所有的分区中。换言之,所有的分片中具有相同的标识号;
这些标识号在终点重装数据报时很有用,终点知道所有具有相同标识号的分片必须被组装成一个数据报。 -
标志:
此3位字段,第一位保留,第二位是“不分片”,第三位是“还有分片”。
-
分片偏移:
此13位字段表示分片在整个数据报中的相对位置;
这是数据在原始数据报中的偏移量,以8字节为度量单位;
要记住偏移量是以8字节为单位,除了最后一个分片外,所有分片的标志字段中的“还有分片”为均应为1.
即使各个分片采取不同的路径并失序到达,最终的目的主机也能够用收到的分片(假设没有丢失)组装成原始的数据报。
选项
选项对于数据报来说并不是必需的,但它可用于网络的测试和排错;
虽然选项并非IP首部的必要项目,但对选项的处理确是IP软件的必要部分。
格式
选项的组成是:类型字段(1字节)、长度字段(1字节)和值字段(可变长度)。这三个字段常被称为 TLV(type-length-value)。
选项格式类型
类型字段(type field)长度为8位,包括了三个子字段:复制、类别和编号。
- 复制, 这个1位子字段控制选项在分片中的出现;
- 类别, 这个2位子字段定义了该选项的一般用途;
- 编号, 这个5位子字段定义了选项的类型。
长度
长度字段(length field)定义选项的总长度,包括类型字段和长度字段本身。这个字段并不是在所有类型的选项中都会出现。
值
值字段(value field)包含的是某些特定选项所需的数据。这个字段并不是在所有类型的选项中都会出现。
选项类型
目前仅使用了六种选项:
- 两种是单字节选项,它们不需要长度字段和值字段,因为类型字段刚好1个字节;
- 四种是多字节选项,它们需要长度字段和值字段。
-
无操作选项
无操作选项(no-operation option),用作选项和选项之间的填充符。
无操作选型
-
选项结束项
选项结束项(end-of-option option),用于选项字段结束时的填充。它只能用于最后一个选项,且只能使用一次。
选项结束项
-
记录路由选项
记录路由选项(record-route option),用来记录处理数据报的因特网路由器。
记录路由选项
-
严格源路由选项
严格源路由选项(strict-source-route option),被源点用来预先指定数据报在因特网中传送时的路由。
严格源路由选项
-
不严格源路由选项
不严格的源路由选项(loose-source-route option),与严格路由相似,但条件宽松一些。
不严格源路由选项
-
时间戳
时间戳选项(timestamp option),用来记录路由器处理数据报的时间。时间是从午夜开始以毫秒计的全球通用时间。
时间戳选项
校验和
绝大多数TCP/IP协议采用的差错检测方法称为 检验和(checksum)。
校验和能够防止分组在传输期间出现的损坏,校验和是附加在分组上的冗余信息。
发送端计算出校验和,并把得到的校验和与分组一起发送出去;接收端对整个分组重复同样的计算。
若得到正确结果则接收此分组,否则丢弃。
在发送端计算校验和
发送端按以下步骤产生检验和:
- 把分组划分成k段,每段的长度都是 n 位;
- 用反码算术运算把这些所有段相加;
- 把最终结果取反码就得到检验和。
在接收端计算检验和
接收端检验步骤:
- 把收到的分组划分为k段;
- 把所有段相加,取反码;
- 若为0,则接收分组。否则丢弃分组。
假设发送端将所有段相加后得到的数为T,当我们用反码算术运算把这个数取反码时,就得到了这个数的负值。这表示,若所有段之和为T,则校验和就是-T。
当接收端收到这个分组时,把所有段相加。这实际上就是把T与-T相加,二进制反码为-0,再取反码为0。
IP分组中的校验和
在IP分组中,首先把“校验和”字段值置为0。然后把整个首部划分为16位(ip首部校验和16位)的段,再将各段相加。把结果(和)取反码,把插入到ip-header的校验和字段中。
IP分组中的校验和为首部校验和,不包括数据。
发送端计算校验和 接收端计算校验和
IP在ATM上运行
在前面,我们都假设支持IP数据报在其上传送的底层网络是局域网或点对点广域网。
我们希望了解IP数据报如何通过像ATM这样的交换广域网来传送。
在ATM交换广域网中,IP分组被封装在信元中(不止一个),对于一个设备的物理地址,ATM网络有它自己的定义。在IP地址和物理地址之间的绑定是通过一个称为ATMARP的协议获得的。
ATM广域网
作为信元交换网络的ATM可以称为IP数据报的高速公路。
ATM广域网AAL层
能被因特网使用的AAL只有AAL5,有时它称为 简单有效的适配层(simple and efficient adaptation layer,SEAL)。
AAL5假设从IP数据报中创建出来的所有信元都属于同一个报文。因此,AAL5不提供地址、序列或其它的首部信息。
实际上,只有一些填充和一个四字段的尾部被附加在IP分组上。
IP协议使用的AAL层是AAL5,使用AAL5效率更高。
信元的路由选择
ATM网络在两个路由器之间建立一条路由。我们称这两个路由器为 进入点(entering-point)路由器 和 离去点(exiting-point)路由器。
进入点和离去点路由器地址
把信元从一个特定的进入路由器转发到一个特定的离去路由器,需要3种类型的地址:IP地址、物理地址和虚电路标识符。
-
IP地址
IP地址在IP层指明了特定的路由器,但是它在ATM网络中没有任何作用。 -
物理地址
每个连接到ATM网络上的路由器(或其他设备)都有一个物理地址。这个物理地址与ATM网络相关,但和因特网没什么关系。
ATM论坛为ATM网络定义了20字节的地址。 -
虚电路标识符
ATM网络内部的交换机根据虚电路标识符(VPI和VCI)来为信元选路,这个虚电路标识符在数据传送时使用。
地址绑定
ATM网络需要用虚电路标识符为信元选路。在IP数据报中只包含了源IP地址和目的IP地址。必须根据目的IP地址来判断其虚电路标识符。
步骤如下:
- 进入点路由器收到一个IP数据报。它用IP数据报的目的地址和自己的路由表来找出下一个路由器(即离去点路由器)的IP地址;
- 进入点路由器使用了一个称为ATMARP的协议服务找出离去点路由器的物理地址。ATMARP和ARP类似。
- 虚电路标识符被绑定到相应的物理地址。
安全性
与整个因特网一样,IPv4协议在诞生之初,因特网上的用户彼此之间都是互相信任的。IPv4没有提供任何安全措施。但是,现如今的因特网已不再安全。
安全问题
有三个安全问题是特别应用于IP协议的:
- 分组窃取(packet sniffing)
- 分组篡改(packet modification)
- IP伪装(IP spoofing)
IPSec
目前我们可以使用一种称为 IPSec(IP安全性) 的协议来保护IP分组不受前面所提到的各种攻击。
这个协议是与IP协议结合在一起使用的。
它在两个实体之间创建了一种面向连接的服务,使这两个实体在交换IP分组时不用担心会受到前面三种攻击。
IPSec提供四中服务:
- 定义算法和密钥
- 分组加密
- 数据完整行
- 起源鉴别
IP软件包
将给出一个假象的IP软件包的栗子,目的是为了展示本章所讨论的各种不同概念之间的相互关系。
IP的构件可以认为IP软件包包含了八个构件:首部添加模块、处理模块、转发模块、分片模块、重装模块、路由表、MTU表和重装表。
-
首部添加模块(header-adding module)
首部添加模块,接收来自高层协议的数据及其目的IP地址。它通过添加IP首部,把数据封装在一个IP数据报中。
IP_Adding_Module(数据,目的地址)
{
把数据封装为IP数据报
计算校验和,并将它插入到校验和字段
把数据发送到相应的输入队列
返回
}
-
处理模块(processing module)
处理模块是IP软件包的核心。
IP_Processing_Module(IP数据报)
{
从一个输入队列中取出一个数据报
if(目的地址与本地地址中的一个相匹配)
{
把数据报发送到重装模块
返回
}
if(本机是路由器)
{
TTL-1
}
if(TTL<=0)
{
丢弃这个数据报
发送ICMP差错报文
返回
}
把数据报发送到转发模块
返回
}
-
队列(queue)
包括 输入队列(input queues) 和输出队列 。
输入队列,存放的是来自数据链路层或高层协议的数据报;
输出队列,存放的是将要发送到数据链路层或高层协议的数据;
处理模块从输入队列中取出数据;
分片和重装模块则向输出队列中添加数据报。
- 路由表(router table)
-
转发模块(forwarding module)
转发模块接收来自处理模块的IP分组,如果分组需要转发,则把分组传递给这个模块;
转发模块找出下一站的IP地址以及发送该分组的接口号。然后,转发模块把分组连同这些信息一起传递给分片模块。
-
MTU表
分片模块使用MTU表找出特定接口的 最大传送单元(MTU),MTU表包含 接口和MTU。
-
分片模块(fragmentation module)
分片模块,接收来自转发模块的IP数据报。
转发模块给出IP数据报、下一站IP地址和接口号。
IP_Fragmentation_Module(IP数据报)
{
提取数据报的长度
if(长度 > 相应网络的MTU)
{
if(D位 被置为1)#D位 为不分片
{
丢弃这个数据报
发送ICMP报文
返回
}
Else
{
计算最大长度
把数据报划分为分片
给每个分片添加首部
给每个分片添加需要的选项
发送分片
返回
}
}
Else
{
发送这个数据报
}
返回
}
-
重装表(reassembly table)
重装表是重装模块在使用;
重装表有五个字段:状态、源IP、数据报标识、超时以及分片。
重装表
状态字段的值可以是 FREE 或 IN-USE;
数据报标识是一个数字,它唯一地定义了一个数据报以及该数据报的所有分片;
超时是一个预定义的时间,在这段时间内所有分片必须到达;
分片字段是执行分片链表的指针。
-
重装模块(reassembly module)
重装模块,接收来自处理模块且已到达最终目的地的数据报分片。
重装模块把为分片的数据报也看成数据报分片,只不过这个数据报仅有一个分片。
IP_Reassembly_Module(IP数据报)
{
if(分片偏移值为0且M为为0)
{
把数据报发送到适当的队列
返回
}
查找重装表中的相应表项
if(相应表项未找到)
{
创建一个新的项目
}
在链表的适当地方插入这个分片
if(所有的分片都已到达)
{
重装这些分片
把数据交付给相应的高层协议
返回
}
Else
{
if(超时)
{
丢弃所有的分片
发送ICMP差错报文
}
}
返回
}
小结
讨论IPv4的RFC包括:RFC791、RFC815、RFC894、RFC1122、RFC2474和RFC2475.
重要术语
尽最大努力交付; 校验和;
码点; 输出队列;
数据报; 指针字段;
区分服务; 优先级;
选项结束选项; 处理模块;
进入点路由器; 重装模块;
转发模块; 重装表;
分片; 分片偏移;
分片模块; 记录路由选项;
服务类型; 严格的源路由选项;
首部添加模块; 生存时间;
输入队列; 时间戳选项;
网际协议(IP) ; 长度字段;
类型字段; Traceroute;
不严格的源路由选项; 服务类型(TOS);
最大传输单元(MTU); 值类型;
无操作选型;
- IP是不可靠的无连接协议,负责源点到终点的交付。在IP层的分组称为数据报;
- MTU是数据链路协议能够封装的最大字节数。MTU随着协议的不同而不同。分片就是把一个数据报划分为若干更小的单元,以便能够适应数据链路层协议的MTU;
- IP数据报首部包括20字节的固定部分和最大长度为40字节的可变选项部分。IP首部中的选项部分用于网络测试和排错。六个IP选项各有其特定功能;
- IP使用的差错检测方法是校验和。但是这个校验和只覆盖分组的首部,不管数据部分。所以是首部校验和;
- IP在ATM上运行使用了ATM网络的AAL5层。ATM网络在进入点路由器和离去点路由器之间建立了一条路由,通过ATMARP,IP分组的下一跳地址能够被映射为离去点路由器的物理地址;
- IP软件包由以下构件组成:首部添加模块、处理模块、转发模块、分片模块、重装模块、路由表、MTU表以及重装表。