2.3.1 IP
在那个“模型们”还没有走上历史舞台的年代,IEEE发布了一篇论文,题为“一个实现数据网通信的协议”。这篇论文的两位作者(文顿·格雷·瑟夫先生和罗伯特·埃利奥特·卡恩先生)描述了一个在网络节点之间使用包交换的方式共享资源的网络互联协议。这个协议的核心叫作“传输控制程序”,它由两部分组成,其中一部分的功能是提供面向连接的传输;另一部分则是提供数据报文服务。后来,就像很多读者可能已经猜测到的那样:这个程序的两大功能按照分层的理念被分为两个协议,其中一个协议负责提供面向连接的传输,叫作传输控制协议,简称TCP;另一个提供数据报文服务,叫作互联网协议,简称IP。这两个协议分别工作在传输(Transport)层和互联网(Internet)层,由此诞生的四层模型就是后来的DoD模型(见对图2-1所说明的“注意”部分)。开始是需求,然后是协议,最后诞生了分层模型,这是具有盘古开天地或者创世纪意义的事件,至少对于网络世界来说,这样的形容毫不夸张。
因此,IP原本就是传输控制程序中的一个组成部分,负责提供数据报文服务。既然原本的传输控制程序中已经安排了TCP来提供有连接的数据传输服务,那么IP必然也是一个无连接的协议,而它提供的数据报文服务肯定不包含在TCP之中。那么,IP到底能够为数据报文提供什么样的服务呢?
这个关子卖得一文不值,因为不知道IP的人,不会有耐心把这本书读到现在——没错,IP提供的服务,主要就是寻址。下面,我们按照前面的惯例,通过分析IP数据包头部格式,来研究这个协议能够提供的功能,请看图2-8。
版本:IP不只有一个版本,但我们当前最常使用的IP叫作IPv4。所有IPv4封装的数据包,版本号字段的取值当然全都是4。虽然新版的IP(也就是IPv6协议)为了提供更丰富的地址资源,也为了修正IPv4的一些缺陷,而对数据包头部格式进行了重新定义,但它依然保留了版本字段,且取值为6。当然,关于IPv6定义的头部格式,我们会在第15章中进行深入的介绍。
头部长度:如果看到这个字段时,你就开始自动在头部格式中搜索“可选项”字段,说明你的学习已经入门了。没错,头部长度需要通过头部格式中字段的取值进行描述,说明这个头部是不定长的,因此一定存在可选项字段,不过我们不会在这一章中介绍IP头部的可选项字段,因为它们并不常用。
图2-8 IP的头部格式
服务类型:这个字段的作用是向设备说明,是否应该对数据包进行特殊处理,以及应该如何对数据包进行特殊处理。
总长度:总长度字段相当于UDP的长度字段,它的数值标明了这个数据包头部与数据部分的长度之和。图2-8标记得很清楚,IP包头如果没有可选项,也没有携带任何数据,则长度为20字节。
标识符、标志与段偏移量:数据在链路中传输是有长度限制的,就像载货车在路上跑是有限重的一样。如果一辆车跑着跑着,发现车皮加货物的总重量超过了前面道路的限重,就应该停车卸货分装,这个过程叫作“分片”,有时也翻译成“分段”。可是最终,同一批货毕竟还是要拾掇齐了才能交付的。为了能把分装的货物按照原样组装回去,难免需要贴一些标签,说明哪些货是同一批的以及如何把它们组装在一起。标识符、标志和段偏移量就是这样的标签。
存活时间:存活时间简称TTL(Time-To-Live)。这个字段定义的本来是数据包在网络中最长能跑多长时间。后来人们发现数据包跑得实在是太快了,就转而把这个字段定义成了数据包在网络中最多能穿过多少台路由器设备。设置这个字段的是为了防止数据因一些不靠谱的行程而“迷失”,在网络中沿着一条环路永远这样跑下去,这样跑的数据多了,网络岂不是会被堵死?
协议号:这个字段定义的是IP封装上层的协议,就像TCP/UDP的端口号字段定义的是它们上层的协议一样。
头部校验和:校验数据在传输的过程中,头部是否发生了变化。
源IP地址和目的IP地址:信封上的发信人地址和收信人地址。关于这两个32位的IP地址我们会单拿一章进行介绍。好消息是那一章的内容极为枯燥,敬请期待。
关于IP,我们姑且介绍到这里,上面的内容仅仅有助于读者了解这个协议所定义的功能。但是这项协议最重要的信息在于它的地址部分,而介绍它的地址必须以一整章的内容展开说明,请读者少安毋躁。下面我们要介绍网络层的另一个协议,那就是与IP关系极为密切的互联网控制报文协议(ICMP)。