全球INTERNET网的广泛应用使IP协议深入人心。IP协议以其简单、有效、开放性成为事实上的工业标准IP协议使异种网互联方便可行,尤其值得一提的是它对下层通信技术的巨大包容性
IP协议作为通信子网的最高层,提供无连接的数据报传输机制IP协议是点到点的,核心问题是寻径它向上层提供统一的IP数据报,使得各种物理帧的差异性对上层协议鈈复存在
互连网协议IP是TCP/IP体系中两个最重要的协议之一。与IP协议配套使用的还有三个协议:
图1画出了这三个协议和IP协议的关系在这一层Φ,ARP和RARP画在最下面因为IP经常要使用着两个协议。ICMP画在这一层的上部因为它要使用IP协议。这三个协议将在后面陆续介绍
顺便指出,有時会听到一种不准确的说法:“我们用
TCP/IP协议进行网络互连”我们要请读者注意,TCP是
与互连网协议IP配套使用的一个运输协议TCP相当与
OSI 的运輸层协议而不是一个互连网协议。因此TCP和
网络互连并没有直接的关系只不过是TCP与IP经常配
在TCP/IP体系中,IP地址是一个很重要的概念一定要把咜弄清楚。
我们把Internet看成为一个网络所谓IP地址就是给每一个连接在Internet上的主机分配一个唯一的32bit
地址。IP地址的结构使我们可以Internet上很方便地进行尋址这就是:先按IP地址中的网络号码net-id把网络找到,再按主机号码host-id把主机找到所以IP地址并不只是一个计算机的号码,而是指出了连接到某个网络上的某个计算机IP地址有美国国防数据网DDN的 网络信息中心NIC进行分配。
为了便于对IP地址进行管理同时还考虑到网络的差异很大,囿的网络拥有很多的主机而有的网络上的主机则很少。因此Internet 的IP地址就分成为五类即A类到E类。这样IP地址(图2)由三个字段组成,即:
? 类别字段(又称为类别比特)用来区分IP地址的类型;A、B、C类分别是0,10110。D类为1110E类为11110。
D類地址是一种组播地址主要是留给Internet体系结构委员会IAB(Internet Architecture Board)使用。E类地址保留在今后使用目前大量IP地址仅A至C类三种。
A类IP地址的网络号码数不多目前几乎没有多余的可供分配。现在能够申请到的IP地址只有B类和C类两种当某个单位向IAB申请到IP地址时,实际上只是拿到了一个网络号码net-id具体的各个主机号码host-id则由该单位自行分配,只要做到在该单位管辖的范围内无重复的主机号码即可
为方便起见,一般将32bit的IP地址中的每8個比特用它的等效十进制数字表示并且在这些数字之间加上一个点。例如有下面这样的IP地址:
这是一个B类IP地址,可记为128.11.3.31这显然更方便得多。
在使用IP地址时还要知道下列地址是保留作为特殊用途的,一般不使用
? 全0的网络号码,这表示“本网络”或“我不知道号码嘚这个网络”
? 全0的主机号码,这表示该IP地址就是网络的地址
? 全1的主机号码,表示广播地址即对该网络上所有的主机进行广播。
? 网络号码为127.X.X.X.这里X.X.X为任何数。这样的网络号码用作本地软件回送测试(Loopback test)之用
? 全1地址255.255.255.255,这表示“向我的网络上的所有主机广播”原先是使用0.0.0.0。
这样我们就可得出表1所示的IP地址的使用范围。
网络号码 最后一个可用的
网络号码 每个网络中的
IP地址有一些重要的特点
(1) IP地址有一些是一种非等级的地址结构。这就是说和电话号码的结构不一样,IP地址不能反映任何有关主机位置的地理信息
(2) 当一个主机同时连接到两个网络上时(作路由器用的主机即为这种情况),该主机就必须同时具有两个相应的IP地址其网络号码net-id是不同的,这种主机成为多地址主机(multihomed host).
(3) 按照Internet的观点用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号碼net-id.
(4) 在IP地址中所有分配到网络号码net-id的网络(不管是小的局域网还是很大的广域网)都是平等的。
图2画出了用路由器(用有R字的圆圈符號表示)和网桥(用有B字方框符号表示)连接起来的一个互连网图中的小圆圈表示需要有一个不同的IP地址。可以看出一个计算机若要囷网络号码不同的计算机通信,就必须经过路由器
IP地址的设计有不够合理的地方。例如IP地址中的A至C类地址,可供分配的网络号码超过211萬个而这些网络上的主机号码的总数则超过37.2亿个,初看起来似乎IP地址足够全世界来使用,(在70年代初期设计IP地址是就是这样认为的)其实不然。第一当初没有预计到微机会普及得如此之快。各种局域网和局域网上的主机数目急剧增长第二,IP地址在使用时有很大的浪费例如:某个单位申请到了一个B类地址。但该单位只有1万台主机于是,在一个B类地址中的其余5万5千多个主机号码就白白地浪费了洇为其他单位的主机无法使用这些号码。
因此目前正在研究如何将IP地址加以扩展[NETW93],但这非常复杂因为IP地址一旦改变,在各种主机上运荇的大量软件就必须修改这是一件耗费大量人力和财力的工作。有人也提出采用OSI的20个字节的网络层地址方案读者应注意这一问题。
从1985姩起为了使IP地址的使用更加灵活,在IP地址的网络号码net-id而后面的主机号码host-id则是受本单位控制,由本单位进行分配本单位所有的主机都使用同一个网络号码。当一个单位的主机很多而且分布在很大的地理范围是往往需要用一些网桥(而不是路由器,因为路由器连接的主機具有不同的网络号码)将这些主机互连起来网桥的缺点较多。例如容易引起广播风暴同时当网络出现故障时也不太容易隔离和管理。为了使本单位的各子网之间使用路由器来互连因而便于管理。需要注意的是子网的划分纯属本单位内部的是,在本单位以外是看不見这样的划分从外部看,这个单位只有一个网络号码只有当外面的分组进入到本单位范围后,本单位的路由器在根据子网号码进行选蕗最后找到目的主机。若本单位按照主机所在的地理位置划分子网那么在管理方面就会方便得多。
这里应注意TCP/IP体系的“子网”(subnet)昰本单位网络内的一个更小些的网络,和前面讲的OSI体系中的子网(subnetwork)不同它们的英文名字不同,但中文译名都是一样的
图4说明是在划汾子网时要用到的子网掩码(subnet
mask)的意义。图4(a)举了一个B类IP地址作为例子图4(b)表示将本地控制部分再增加一个子网字段,子网号字段究竟选为多长由本单位根据情况确定。TCP/IP体系规定用一个32bit的子网掩码来表示子网号字段的长度具体的做法是:子网掩码由一连串的“1”囷一连串的“0”组成。“1”对应于网络号码和子网号码字段而“0”对应于主机号码字段(图4(c))
多划分出一个子网号码字段是要付出玳价的。例如对于图4的例子,本来一个B类IP地址可以容纳65534个主机号码但划分出6bit长的子网字段后,最多可有62个子网(去掉全1和全0的子网号碼)每个子网有10bit的主机号码,即每个子网最多可有1022个主机号码因此主机号码的总数是62*个。比不划分子网时要少了一些
若一个单位不進行子网的划分,则其子网掩码即为默认值此时子网掩码中“1”的长度就是网络号码的长度。因此对于A,B和C类IP地址其对应的子网掩碼默认值分别为255.0.0.0,255.255.0.0和255.255.255.0。
上面讲的IP地址还不能直接用来进行通信这是因为:
? IP地址中的主机地址只是主机在网络层中的地址,相当与前面讲過的NSAP若要将网络层中传送的数据报交给目的主机,必须知道该主机的物理地址因此必须在IP地址和主机的物理地址之间进行转换。
? 用戶平时不愿意使用难于记忆的主机号码而是愿意使用易于记忆的 主机名字。因此也需要在主机名字和IP地址之间进行转换
对于较小的网絡,可以使用TCP/IP体系提供的叫做hosts的文件来进行从主机名字到IP地址的转换文件hosts上有许多主机名字到IP地址的映射,供主叫主机使用
对于叫大嘚网络,则在网络中的几个地方放有域名系统DNS(Domain Name System)的名字服务器nameserver,上面分层次放有许多主机名字到IP地址转换的映射表主叫主机中的名字转換软件resolver自动找到DNS的nameserver来完成这种转换。域名系统DNS属于应用层软件
图5中设名字为host-a的主机要与名字为host-b的主机通信,通过DNS从目的主机host-b得出其IP地址為209.0.0.6
IP地址到物理地址的转换由地址转换协议ARP来完成。图5还表示出从IP地址209.0.0.6通过ARP得出了目的主机48bit的物理地址 A(现在假设此主机连接在某个局域網上如网络是广域网,则转换出主机在广域网上的物理地址)
由于IP地址有32bit,而局域网的物理地址(即MAC地址)是48bit,因此它们之间不是一个簡单的转换关系此外,在一个网络上可能经常会有新的计算机假如近来或撤走一些计算机。更换计算机的网卡也会使其物理地址改变可见在计算机中应当存放一个从IP地址到物理地址的转换表,并且能够经常动态更新地址转换协议ARP很好地解决了这些问题。
每一个主机嘟有一个ARP高速缓存(ARP cache)里面有IP地址到物理地址的映射表,这些都是该主机目前知道的一些地址当主机A欲向本局域网上的主机B发送一个IP數据报时,就先在其ARP高速缓存中查看有无主机B的IP地址如有,就可查出其对应的物理地址然后将该数据报发往此物理地址。
也有可能查鈈到主机B的IP地址的项目这可能是主机B才入网,也可能是主机A刚刚加电其高速缓存还是空的。在这种情况下主机A就自动运行ARP,按以下步骤找出主机B的物理地址
① ARP进程在本局域网上广播发送一个ARP请求分组,上面有主机B的IP地址
② 在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
③ 主机B在ARP请求分住中见到自己的IP地址就向主机A发送一个ARP响应分组,上面写入自己的物理映射
④ 主机A收到主机B的ARP响应汾组后,就在其ARP高速缓存中写入主机B的IP地址到物理地址的映射
在很多情况下,当主机A向主机B发送数据报时很可能以后不久主机B还要向主机A发送数据报,因而主机B也可能要向主机A发送ARP请求分组为了减少网络上的通信量,主机A在发送其ARP请求分组时就将自己的IP地址到物理哋址的映射写入ARP请求分组。当主机B收到主机A的ARP请求分组时主机B就将主机A的这一地址映射写入主机B自己的ARP高速缓存中。这对主机B以后向主機A发送数据报时就更方便了
在进行地址转换时,有时还要用到反向地址转换协议RARPRARP使只知道自己物理地址的主机能够知道其IP地址。这种主机往往是无盘工作站这种无盘工作站一般只要运行其ROM中的文件传送代码,就可用下行装载方法从局域网上其他主机得到所需的操作系统和TCP/IP通信软件,但这些软件中并没有IP地址无盘工作站要运行ROM中的RARP来获得其IP地址。
RARP的工作过程大致如下
为了使RARP能工作,在局域网上至尐有一个主机要充当RARP服务器无盘工作站先向局域网发出RARP请求分组(在格式上与ARP请求分组相似),并在此分组中给出自己的物理地址
RARP服務器有一个事先做好的从无盘工作站的物理地址到IP地址的映射表,当收到RARP请求分组后RARP服务器就从这映射表查出该无盘工作站的IP地址。然後写入RARP响音分组发回给无盘工作站。无盘工作站用这样的方法获得自己的IP地址
在TCP/IP的标准中,各种数据格式常常以32bit(即4字节)为单位来描述图6是IP数据报的格式。
从图6可看出一个IP数据报由首部和数据两部分组成。首部的前一部分长度是固定的20个字节后面部分的长度则昰可变长度。下面介绍首部各字段的意义
1.IP数据报首部的固定部分
版本 版本字段站4 bit,指IP协议的版本。通信双方使用的IP协议的版本必须一致目前使用的IP协议版本为4。
首部长度字段占4bit可表示的最大数值是15个单位(一个单位为4字节),因此IP的首部长度的最大值是60字节当IP分组的艏部长度不是4字节的整数倍时,必须利用最后一个填充字段加以填充这样,数据部分永远在4字节的整数倍时开始这样在实现起来会比較方便。首部长度限制为60字节的缺点是有时(如采用源站选路时)不够用但这样做的用意是要用户尽量减少额外的开销。
服务类型 服务類型字段共8bit长用来获得更好的服务,其意义见图6的上面部分所示
服务类型字段的前三个比特表示优先级,它可使数据报具有8个优先级Φ的一个
第4个比特是D比特,表示要求有更低的时延
第5个比特是T比特,表示要求有更高的吞吐量
第6个比特是R比特,表示要求有更高的鈳靠性即在数据报传的过程中,被结点交换机丢弃的概率要更小些
第7个比特是C比特,是新增加的表示要求选择价格更低廉的路由。
朂后一个比特目前尚未使用
总长度 总长度指首部和数据之和的长度,单位为字节总长度字段为16bit,因此数据报的最大长度为65535字节这在當前是够用的。
当很长的数据报要分段进行传送时“总长度”不是指未分段前的数据报长度,而是指分段后每个段的首部长度与数据长喥的总和
标识 标识字段的意义和OSI的IPDU中的数据单元标识符的意义一样,是为了使分段后的各数据报段最后能准确地重装成为原来的数据报请注意:这里的“标识”并没有顺序号的意思,因为IP是无连接服务数据报不存在按序接收的问题。
标志 标志字段占3bit目前只有前两个仳特有意义。
标志字段中的最低位记为MF(More Fragment)MF=1即表示后面还有分段的数据报。MF=0表示这已是若干数据报段中的最后一个
标志字段中间的一位记为DF(Don’t Fragment)。只有当DF=0时才允许分段
段偏移 段偏移字段的意义和OSI的IPDU中规定的相似,只是表示的单位不同这里是以8个字节为偏移单位。鈳见IP数据报的段偏移字段(13bit长)和OSI的IPDU的段偏移字段(16bit长)是相当的
寿命 寿命字段记为TTL(Time To Live),其单位为秒。寿命的建议值是32秒但也可设定為3-4秒,或甚至255秒
协议 协议字段占8bit,它指出此数据携带的运输层数据是使用何种协议以便目的主机的IP层知道应将此数据报上交给哪个进程。常用的一些协议和响应的协议字段值(写在协议后面的括弧中)是:UDP(17)TCP(6),ICMP(1)GGP(3),EGP(8)IGP(9),OSPF(89)以及ISO的TP4(29)。
首蔀检验和 此字段只检验数据报的首部不包括数据部分。不见眼数据部分是因为数据报每经过一个结点结点处理机就要重新计算一下首蔀检验和(一些字段,如寿命、标志、段偏移等都可能发生变化)如将数据部分一起检验,计算的工作量就太大了
地址 源站IP地址字段囷目的站IP地址字段都各占4字节。
2.IP首部的可变部分
IP首部的可变部分就是一个任选字段任选字段用来支持排错、测量以及安全等措施,内容佷丰富此字段的长度可变,从一个字节到40个字节不等取决于所选择的项目。某些任选项目只需要一个字节它只包括一个字节的任选玳码,图7画的是任选代码的格式还有些任选项目需要多个字节,但其第一个字节的格式仍为图7所示的那样这些任选项一个个拼接起来,中间不需要有分隔符最后用全0的填充字段补齐成为4字节的整数倍。
可以看出任选代码共有三个字段。
第一个字段是复制字段占1bit,咜的作用是控制网络中的路由器在将数据报进行分段时所作的选择当复制字段为1时,必须将此任选字段复制到每一个数据报段而当复淛字段为0时,就只复制到第一个数据报段上
第二个字段是任选类别字段,占2bit但目前只有两种可供选用(图8):
第三个字段是任选编号,占5个字节它指出任选是做什么用的。
属于任选类别0的有下列一些任选编号:
任选编号为0:指出这是任选项目中的最后一个
任选编号為1:无操作,用于需要按每4个字节对齐之用和填充字段的功能是一样的。
以上两种都是只使用一个字节的任选代码下面的几种则要使鼡若干个字节。
任选编号为2:为安全用的只用在美国国防系统来传送机密文件。路由器在检测到这一安全任选项目时就要使该数据报鈈要离开安全的环境。在商业上尚无此应用
任选编号为7:为记录路由用的,其长度是可变的图9是记录路由的任选项目的格式。
这种数據报是用来监视和控制互连网中的路由器是如何转发数据报的源站发出一个空白的表,让数据报所经过的个路由填上其IP地址以获得路甴信息。
① 任选代码字段——其中的三个字段分别填入00,和7
② 长度字段——填入此任选项目的长度,包括这前三个字节
③ 指针字段——指出下一个可填入IP地址的空白位置的偏移量。
在这之后就是若干个4字节长的IP地址,让各个路由器填入当一个路由器收到包含有记錄路由任选项目的数据报时,先检查指针所指的位置是否超过了表的长度如不超过,则填入自己的IP地址并将指针值加4,然后转发出去但如表已填满,则不填入自己的IP地址而仅仅转发此数据报。
一般的计算机在受到这样的数据报是并不会理睬该数据报中所记录的路甴。因此源站必须和有关的站主机在、协商好,请目的主机在收到记录的路由信息后将路由信息提取出来,并发回源站
下面两任选項目都是关于源站选路的。
.任选编号为3:不严格的源站选路(loose source routing)其长度是可变的。
源站选路本来是源站将数据报传送的路由事先规定好嚴格的源站选路不允许改变源站规定好的路由。但不严格的源站选路允许在数据报传送的过程中将路由表中源站已规定要经过的一些路甴器,改换成别的路由器
源站选路任选项目的格式与图记录路由的相似。前面也是三个固定的字节但任选代码字节中的三个字段应分別填入1,0和3(不严格的源站选路)以及10和9(严格源站选路)。此外这三个字节后的IP地址表不是空的,而是事先由源站写好的数据报按源站指定的路由传送。当路由器收到此数据报后若指针已超过表的范围,则转发此数据报不写任何数据。若指针的指示是正确的則填入自己的IP地址(覆盖掉原来的IP地址),并按照表中指出的一下一个地址转发出去这里要注意:一个路由器有两个或两个以上IP地址。原来茬这个任选项目路由表中写入的是路由器的入口IP地址而路由器写的IP地址则是路由器的出口IP地址。
在数据报中加入源站选路任选项目可鉯使网络的管理者了解沿网络中的某一条通路的通信状况是否正常。一般的用户并不使用这一功能
最后一个任选项目是Internet的时间戳。
.任選编号为4:作时间戳用其长度是可变的。格式和图类似但一开始除了原来的任选代码字段(填入0,2和4)、长度字段和指针字段这三个字节外再加上一个字节的溢出和标志两个字段。标志字段区分几种情况:(1)只写入时间戳;(2)写入IP地址和时间戳;(3)IP地址由源站规定好蕗由器只写入时间戳。溢出字段写入一个数此数值即数据报所经过的路由器的最大数目(考虑到太多的时间戳可能会写不下)。
时间戳記录了路由器收到数据报的日期和时间占用了4个字节。时间的单位是毫秒是从午夜算起的通用时间(Universal Timer),也就是以前的格林尼治时间当網络中的主机的本地时间和时钟不一致时,记录的时间戳会有一些误差时间戳可用来统计数据报经路由器产生的时延和时延的变化。
在互连网中进行路由选择要使用路由器它平等地看待每一个网络。不论是较大的广域网还是较小的局域网在路由器看来都只是一个网络。因此在图中将每一个网络画成为一片去表示路由器产不知道在每一个网络中一个分组是如何选择具体的路由。路由器只是根据所收到嘚数据报上的目的主机地址选择一个合适的路由器(通过某一个网络)将数据报传送到下一个路由器。通路上最后的路由器负责将数据报送茭目的主机
路由器将分组在某一个网络中走过的通路(从进入网络算起到离开网络为止),人逻辑上看成是一个路由单位并将此路由單位称为一个路由段(hop),或简称为段例如,在图10中主机A到主机C共经过了3个网络和2个路由器,因此共经过3个路由器布从主机A到主机B则经過了5个网络和4个路由器,即经过5个路由段由此可见,若一结点通过一个网络与另一结点相连接则此二结点相隔一个路由段,因而在互連网中是相邻的同理,相邻的路由器是指这两个路由器都连接在同一个网络上一个路由器到本网络中的某个主机制路由段数算作零。茬图中用粗的箭头表示这些路由段至于每一具路由段又由哪几条链路构成,路由器并不关心
在互连网的情况下,只能计算各条通路所包含的路由段数由于网络大小可能相差很大,而每个路由段的实际长度并不相同因此对不同的网络,可以将其路由段乘以一个加权系數用加权后的路由段数来衡量通路的长短。
因此如果把互连网中的路由器看成是网络中的结点,把互连网中的一个路由段看成是网络Φ的一条链路那么互连网中的路由选择就与简单网络中的路由选择相似了。
采用路由段数最小的路由有时也产不一定是理想的例如,經过三个局域网路由段的路由可能比经过两个广域网络路由段的路由快得多
下面通过一个最简单的例子IP地址和物理地址在选路过程中的莋用。
设主机A要向主机B发送一个数据报两个主机分别连接在两个网络上,这两个网络通过一个路由器相连
主机A的IP层收到欲发送的数据報后,就比较目的主机的源主机的网络号码是否相同(这就是从数据报首部的IP地址中抽出网络号码net-id部分进行比较)如相同,则表明这两個主机在同一个网络内这样就只需要用目的主机的物理地址进行通信。如果不知道目的主机的物理地址则可向ARP进行查询。但当主机A和B嘚网络号码不一样时就表明它们连接在不同的网络上,因此必须将数据报发给路由器进行转发
源主机从配置中读出路由器的IP地址。然後从ARP得到路由器的物理地址随后将数据报发送给这个路由器。
这里要强调指出在数据报的首部写上的源IP地址和目的IP地址是指正在通信嘚两个主机的IP地址。路由器的IP地址并没有出现在数据报的首部中当然,路由器的IP地址是很有用的但它是用来使源主机得知路由器的物悝地址。总之数据报在一个路由段上传送时,要用物理地址才能找到路由器
图11是上述概念的示意图。这就是:MAC地址(设物理地址就是局域网的MAC地址)用于主机到路由器之间的通信(即在一个路由段上通信)而IP地址则用于两个主机之间的通信,并用来决定找哪一个路由器符号(1)到(8)表示数据报传送的先后顺序。
图11 两个主机通过路由进行通信
我们应当注意到路由器由于连接在两个网络上,因此具有两上IP地址和两个物理地址(MAC地址)主机A发送的数据报经过路由器后,数据报中的两个IP地址都没有发生变化但数据帧中的MAC地址(源地址和目的地址)却都改变了。
最后发回来的信息是主机B向主机A的应答((7)和(8))
上面的简单例子只有一个路由器。在更加复杂的例子中两个通信的主机偠经过多个网络和路由器。这时通信的通路上紧后的路由器负责将数据报交付给目的主机。
当源主机发送数据报时IP层先检查目的主机IP哋址中的网络号码。如发现与源主机处在同一个网络内则不经过路由器,只要按照目的主机的物理地址传送即可
如目的主机不是和源主机在同一个网络中,那么就查一下是否对此特定的目的主机规定了一个特定的路由如有,则按此路由进行传送这种情况有时很有用,因为在某些情况下需要对到达某一个目的主机的特定路由进行性能测试。
如不属于以上情况则应查找路由表。路由表中写明找某某网络上的主机,应通过路由器的哪个物理端口然后就可找到某某路由器(再查找这个路由器的路由表),或者不再经过别的路由器而呮要在同一个网络中直接传送这个数据报
为了不使路由表过于庞大,可以在网络中设置一个默认路由器(default router)凡遇到在路由表中查不到要找嘚网络,就将此数据报交给网络中的默认路由器默认路由器继续负责下一步的选路。这对只用一个路由器与Internet相连的的小网特别方便因為只要不是发送给本网络的主机的数据报,统统送交给默认路由器
图12的例子说明其中一个路由器(路由器80的路由表的主要内容。这里有7個网络通过8个路由器互连在一起我们应注意到,每一个路由器具有不止一个IP地址图中各网络中的数字是该网络的网络地址(前面讲过,主机号码为全零的IP地址就是网络地址)路由器8由于与三个网络相连,因此有三个IP地址和三个物理端口
各路由表的数据可以是人工输叺,也可能通过各种路由选择协议来生成
IP数据报的传送不保证不丢失。但互连网层对数据报的传送还有一定的质量保证功能这就是使鼡Internet控制报文协议ICMP(Internet Control Message
Protocol)。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告但ICMP不是高层协议,它仍是互连网层中的协议ICMP报文作为互連网层数据报的数据,加上数据报的首部组成IP数据报发送出去。ICMP报文的格式如图13所示
图13 ICMP报文与IP数据报的关系
图15 ICMP改变路由报文的使用举唎
从图15可看出,主机A向主机B发送IP数据报应经过路由器R1而向主机C发送数据报则应经过路由R2。现在假定主机A启动后其路由表中只有一个默認路由器R1。当主机A向主机C发送数据报时数据报就被送到路由器R1。从路由器R1的路由表可查出:发往主机C的数据报应经过路由器R2于是数据報从路由器R1再转到路由器R2,最后传到主机C显然,这个路由不好应改变。于是路由器R1向主机A发送一个ICMP改变路由报文,指出此数据报应經过的下一个路由器R2的IP地址主机A根据收到的信息更新其路由表。以后主机A再向主
C发送数据报时根据路由表就知道应将数据报传到路由器R2,而不再传到默认路由器R1了
图16是ICMP改变路由报文的格式。在第5-8字节了写入数据报应经过的路由器的IP地址再后面就是说明是哪一个数据報。数据报的首部都要写入而数据部分则写入其前8个字节,这里面有运输层数据单元首部的一些数据(端口号)有时要用到。
图16 ICMP改变蕗由报文的格式
当某个速率较高的源主机向另一个速率较慢的目的主机(或路由器)发送一连串的数据报时就有可能使速率较慢的目的主机产生拥塞,因而不得不丢弃一些数据报通过高层协议,源主机得知丢失了一些数据报就不断地重发这些数据报。这就使得本来就巳经拥塞的目的主机更加拥塞在这种情况下,目的主机就要向源主机发送ICMP源站抑制报文使源站暂停发送数据报,过一段时间再逐渐恢複正常
下面介绍几个常用的ICMP询问报文。
ICMP Echo请求报文是由主机或路由器向一个特定的目的主机发出的询问收到此报文的机器必须给主机发送ICMP Echo回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态在应用层有一个服务叫做PING(Packet InterNet Groper),用来测试两个主机之间的连通性PING使用了ICMP Echo请求与Echo回答报文。
ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间在ICMP时间戳回答报文中有一个32bit的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒时间戳请求与回答可用来进行时钟同步和测量时间。
ICMP地址掩码请求与回答可使主机向子网掩码服务器得到某个接口的地址掩码
功能决定结构。分析IP层的功能与地位将有助于我们设计出合理简洁,易于扩展的软件结构以实现IP協议
IP层作为通信子网的最高层协议,提供无连接的数据报传输机制IP协议是点到点的,其主要处理过程是寻径:根据信宿IP地址如何确定通信的下一点这就决定了路由表的设计应是IP协议软件设计的焦点,以它为出发点我们将逐步确定其它主要数据结构以及程序框架。再栲虑到IP层与上下层的关系即IP协议向上层提供统一的数据报,使得各种物理帧的差异对上层协议不复存在因而设计好一个IP层与下层物理網络的统一接口亦是非常重要。下面先给出IP层的数据流图:
对于每个接口我们设置一数据结构ifnet{}来描述一些关于接口的公用信息。这些信息分为五类:
4. 对接口进行操作的函数的指针
由于有些接口,比如说以太网接口向上支持多种协议,因而每个接口都包含一条由ifaddr{}结构组荿的链表该结构主要包含不同上层协议赋给该接口的Socket地址。譬如说Internet协议使用in_ifaddr{}结构OSI协议使用iso_ifaddr{}结构来保存关于该接口的特定信息。另外核心也通过分配一个ifaddr{}结构,两个sockaddr_dl结构来保存该接口的链路层地址一个是链路层地址本身,一个是链路层地址掩码所谓链路层地址(针对鉯太网接口)参见下图示意:
事实上Ifnet{}结构主要反应接口的底层信息,而ifaddr{}结构反应接口的上层信息两者之间用指针相互连接起来。
由于各个接口之间可能存在较大差异因而在ifnet{}结构的基础上还可以定义各个接口的特有信息。系统初始化后相应的ifnet{} 表如下:
针对ifnet{}结构,,有以下一些通用操作:
if_output:将要发送的包放进对应于各接口的输出队列
if_start:启动数据包的传输。
if_done:数据传输后一些必要的清理工作
if_ioctl:处理I/O控制命令。
这些操作函数的指针放在各自的ifnet{}结构中
其它比较重要的数据结构还有各类输入输出队列结构以及Socket{}结构,这里不在赘述
接口部分各模块之间的关系。
下面以以太网接口为例说明接口部分各模块之间的关系。参见下图:
我们从以太网帧的接收开始假设硬件已经初始化,系统已经被设置当数据帧到达,网卡产生中断系统核心调用leintr. 它首先检查硬件。如果是数据帧(frame)到达则调用leread将数据帧从接口传送箌由若干内存快组成的数据链中。如果硬件报告数据帧传送结束或有错误被检测到则leintr更新相关接口统计量,重设硬件调用lestart试图发送例外的数据帧。
所有以太网接口把它们接收到的数据帧转化成数据链后将其作为参数传递给ether_input,它检查由leread提供的数据帧头以判断接收的数据帧嘚类型,根据不同的类型将其转发到上层协议的输入队列以等待处理这些上层协议可能是OSI上层协议,ARP协议IP协议。
当网络层协议譬如說IP协议,要输出包(packet),它将根据寻址结果调用相应接口的if_net结构中的if_output函数(对于以太网来说就是ether_output函数)
该函数将对由ip_output提供的路由信息进行最后嘚确认(这种确认是必要的,因为网络运行状态时刻在变化)然后根据Socket地址形成以太网物理地址将包封装成帧,放入接口输出队列如果ifnet{}结构中的标志位指明设备闲,就调用if_net{}结构的if_start函数该函数将调用lestart函数。该函数将要传输的帧从接口输出队列中取出一般以太网卡硬件Φ有传输缓冲区,如果该传输缓冲区未满则真正的物理传输开始。如果该传输缓冲区已满则置ifnet{}结构中的相应标志位为忙。如果网卡忙则当它传输完当前帧时,它就产生中断网卡驱动程序将调用lestart。
IP层各模块之间的关系
下图简要描述了IP层各模块之间的关系
IP层所有接口嘚输入,都是直接输入到IP输入队列然后产生一个IP输入事件,使IP层的任务能够被调度IP层处理这个输入队列的函数是ipintr()。该函数流程图如下:
首先判断是否进一步转发该数据包接着修改包头中有关域,定位下一站地址调用ip_output。.
IP输出函数可能被ip_forward和传输层协议直接调用
路由表楿当于一个关系数据库,表中每一项都可由一关键字唯一确定在TCP/IP协议中,该关键字就是目标用户IP地址或网络地址表中每一项给出了到達目的地的下一站路由器地址,相应的下层接口的ifnet{}结构以及一些统计信息
Patricia 树结构非常适于实现路由表。树结构能提高查询效率相应的玳价是增加了添加和删除路由表项的开销。
为了理解树结构路由表的工作原理我们先简单举一个例子。要说明一点的是IP层针对不同的协議套定义了不同的树结构路由表。以下所举例子是Internet协议的树结构路由表
路由表所含各项内容解释如下:
目标地址:可能为用户地址或網络地址。
路由器地址:可能为IP地址或网卡物理地址
标志位:U -该线路处于工作状态。
引用次数:该路由项当前正被引用的次数
使用佽数:该线路总共被引用的次数。
相应于上述路由表的树结构实现方式如下图所示:
这里我们有必要解释一下复本关键字和掩码表对于哃一目标地址,我们自然希望用最精确的掩码与待查关键字进行位与使之匹配该目标地址即匹配的越多越好。同时对于同一目标地址(即同一关键字)在路由表树结构中可能会有多个节点这些节点用指针相互连接起来构成复本关键字。每个复本关键字都对应着一个不同嘚掩码在某节点处,在寻找到使之与待查关键字相匹配的最精确的掩码后我们就会从复本关键字中选择那个其掩码与最精确掩码相同嘚复本关键字。该复本关键字将提供最佳的路由信息
路由表的搜索是基于位测试的,即对要查找的地址关键字按位搜索这样做使得同┅搜索函数能够搜索不同协议套的路由表树结构,譬如说OSI协议的可变长度的地址每个路由表项都有网络掩码,对于关键字是具体用户地址的路由表项其掩码是缺省值0x给定要查询的目标地址,搜索过程大致为:
从根节点开始按位测试直至到达相应的叶节点t。再对叶节点t進行全面的测试
If (匹配的节点t为路由树的最左叶节点)
将叶节点的网络掩码与要查询的目标地址进行位与运算,以判断是否有网络匹配
若匹配,则返回匹配节点
/*向上回溯进行查找*/
由于每个节点可能有多个网络掩码因而对各个掩码有一个循环查找过程:
将各个掩码与待寻目標地址进行位与运算获得网络地址。以此网络地址为查询关键字以当前节点为开始节点向下搜索。
则由于对叶节点可能有一个rn_dupedkey链因而叒有一个循环查找过程。
直至找到最佳路由路径返回该路径。
while (还没有到最顶层父节点)
关于具体实现路由表树结构确有很多微妙之处。仔细琢磨大家定会收益非浅。下图给出实际的与路由表有关的数据结构以便大家有一个感性认识。
基于上述路由树查找算法我们进┅步给出寻径过程的算法框架:
在Internet协议控制块中一般维护着一个路由缓冲区,里面存放着最近刚使用过的路由信息在为某个目标地址寻徑时,通常先看一下路由缓冲区里面是否有直接可用的路由信息以及该路由信息提供的路由是否还有效若有效,则直接返回
如果缓冲區中没有路由信息可直接利用,
则首先根据目标地址所属的协议族找出该协议族对应的路由树的根节点然后调用路由树查找算法。
则根據匹配路由项的标志位的设置情况可能要在路由树中克隆该路由项。同时将该路由项的当前引用计数增1
衷心感谢吴文娣,郑瑜两位女壵在录入方面提供的帮助