3.1 引言
IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输(见图1-4)。许多刚开始接触TCP/IP的人对IP提供不可靠、无连接的数据报传送服务感到很奇怪,特别是那些具有X.25或SNA背景知识的人。
不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。
无连接(connectionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。
在本章,我们将简要介绍IP首部中的各个字段,讨论IP路由选择和子网的有关内容。还要介绍两个有用的命令:ifconfig和netstat。关于IP首部中一些字段的细节,将留在以后使用这些字段的时候再进行讨论。RFC 791[Postel 1981a]是IP的正式规范文件。
3.2 IP首部
IP数据报的格式如图3-1所示。普通的IP首部长为20个字节,除非含有选项字段。
图3-1 IP数据报格式及首部中的各字段
第3章 IP:网际协议25
图3-2 服务类型字段推荐值
Te lnet和Rlogin这两个交互应用要求最小的传输时延,因为人们主要用它们来传输少量的交互数据。另一方面,FTP文件传输则要求有最大的吞吐量。最高可靠性被指明给网络管理(SNMP)和路由选择协议。用户网络新闻(Usenet news, NNTP)是唯一要求最小费用的应用。
现在大多数的TCP/IP实现都不支持TO S特性,但是自4.3BSD Reno以后的新版系统都对它进行了设置。另外,新的路由协议如OSPF和IS-IS都能根据这些字段的值进行路由决策。
26TCP/IP详解,卷1:协议
图3-3 数据报从主机bsdi到sun的传送过程
数据报被送到以太网驱动程序,然后作为一个以太网数据帧被送到sun主机上(见图2-1)。IP数据报中的目的地址是以太网140.252.13,而在 链路层首部中的目的地址是48bit的sun主机的以太网接口地址。这个48bit的以太网地址是用ARP协议获得的,我们将在下一章对此进行描述。
现在来看另一个例子:主机bsdi有一份IP数据报要传到ftp.uu.net主机上,它的IP地址是192.48.96.9。经过的前三个路由器如图3-4所示。首先,主机bsdi搜索路由表,但是没有找到与主机地址或网络地址相匹配的表目,因此只能用默认的表目,把数据报传给下一站路由器,即主机sun。当数据报从bsdi被传到sun主机上以后,目的IP地址是最终的信宿机地址(192.48.96.9),但是链路层地址却是sun主机的以太网接口地址。这与图3-3不同,在那里数据报中的目的IP地址和目的链路层地址都指的是相同的主机(sun)。
图3-4 从bsdi到ftp.uu.net(192.48.96.9)的初始路径
30TCP/IP详解,卷1:协议
图3-5 B类地址的一种子网编址
第3章 IP:网际协议31
图3-6 网络noao.edu(140.252)中的大多数子网安排
32TCP/IP详解,卷1:协议
图3-7 两种不同的B类地址子网掩码的例子
尽管IP地址一般以点分十进制方法表示,但是子网掩码却经常用十六进制来表示,特别是当界限不是一个字节时,因为子网掩码是一个比特掩码。
给定IP地址和子网掩码以后,主机就可以确定IP数据报的目的是:(1)本子网上的主机;(2)本网络中其他子网中的主机;(3)其他网络上的主机。如果知道本机的IP地址,那么就知道它是否为A类、B类或C类地址(从IP地址的高位可以得知),也就知道网络号和子网号之间的分界线。而根据子网掩码就可知道子网号与主机号之间的分界线。
举例
假设我们的主机地址是140.252.1.1(一个B类地址),而子网掩码为255.255.255.0(其中8bit为子网号,8bit为主机号)。
如果目的IP地址是140.252.4.5,那么我们就知道B类网络号是相同的(140.252),但是子网号是不同的(1和4)。用子网掩码在两个IP地址之间的比较如图3-8所示。
如果目的IP地址是140.252.1.22,那么B类网络号还是一样的(140.252),而且子网号也是一样的(1),但是主机号是不同的。
如果目的IP地址是192.43.235.6(一个C类地址),那么网络号是不同的,因而进一步的比较就不用再进行了。
图3-8 使用子网掩码的两个B类地址之间的比较
第3章 IP:网际协议33
图3-9 特殊情况的IP地址
我们把这个表分成三个部分。表的头两项是特殊的源地址,中间项是特殊的环回地址,最后四项是广播地址。
表中的头两项,网络号为0,如主机使用BOOTP协议确定本机IP地址时只能作为初始化过程中的源地址出现。
在12.2节中,我们将进一步分析四类广播地址。
3.7 一个子网的例子
这个例子是本文中采用的子网,以及如何使用两个不同的子网掩码。具体安排如图3-10所示。
图3-10 作者所在子网中的主机和网络安排
如果把该图与扉页前图相比,就会发现在图3-10中省略了从路由器sun到上面的以太网之间的连接细节,实际上它们之间的连接是拨号SLIP。这个细节不影响本节中讨论的子网划分问题。我们在4.6节讨论ARP代理时将再回头讨论这个细节。
34TCP/IP详解,卷1:协议
图3-11 变长子网
140.252.13子网中的所有接口的子网掩码是255.255.255.224,或0xffffff e0。这表明最右边的5bit留给主机号,左边的27 bit留给网络号和子网号。
图3-10中所有接口的IP地址和子网掩码的分配情况如图3-12所示。
图3-12 作者子网的IP地址
第1栏标为是“主机”,但是sun和bsdi也具有路由器的功能,因为它们是多接口的,可以把分组数据从一个接口转发到另一个接口。
这个表中的最后一行是图3-10中的广播地址140.252.13.63:它是根据以太网子网号(140.252.13.32)和图3-11中的低5位置1(16+8+4+2+1=31)得来的(我们在第12章中将看到,这个地址被称作以子网为目的的广播地址(subnet-directed broadcast address))。
第3章 IP:网际协议35
环回接口(2.7节)被认为是一个网络接口。它是一个A类地址,没有进行子网划分。
需要注意的是以太网没有采用尾部封装(2.3节),而且可以进行广播,而SLIP链路是一个点对点的链接。
SLIP接口的标志LINK0是一个允许压缩slip的数据(CSLIP,参见2.5节)的配置选项。其他的选项有LINK1(如果从另一端收到一份压缩报文,就允许采用CSLIP)和LINK2(所有外出的ICMP报文都被丢弃)。我们在4.6节中将讨论SLIP链接的目的地址。
安装指南中的注释对最后这个选项进行了解释:“一般它不应设置,但是由于一些不当的ping操作,可能会导致吞吐量降到0。”
bsdi是另一台路由器。由于-a参数是SunOS操作系统具有的功能,因此我们必须多次执行ifconfig,并指定接口名字参数:
这里,我们看到以太网接口(we0)的一个新选项:SIMPLEX。这个4.4BSD标志表明接口不能收到本机传送的数据。在BSD/386中所有的以太网都这样设置。一旦这样设置后,如果接口发送一帧数据到广播地址,那么就会为本机拷贝一份数据送到环回地址(在6.3小节我们将举例说明这一点)。
在主机slip中,SLIP接口的设置基本上与上面的bsdi一致,只是两端的IP地址进行了互换:
最后一个接口是主机svr4上的以太网接口。它与前面的以太网接口类似,只是SVR4版的ifconfig没有打印RUNNING标志:
36TCP/IP详解,卷1:协议
这个命令打印出每个接口的MTU、输入分组数、输入错误、输出分组数、输出错误、冲突以及当前的输出队列长度。
在第9章将用netstat命令检查路由表,那时再回头讨论该命令。另外,在第13章将用它的一个改进版本来查看活动的广播组。
3.10 IP的未来
IP主要存在三个方面的问题。这是Internet在过去几年快速增长所造成的结果(参见习题1.2)。
超过半数的B类地址已被分配。根据估计,它们大约在1995年耗尽。
32 bit的IP地址从长期的Internet增长角度来看,一般是不够用的。
当前的路由结构没有层次结构,属于平面型(flat)结构,每个网络都需要一个路由表目。随着网络数目的增长,一个具有多个网络的网站就必须分配多个C类地址,而不是一个B类地址,因此路由表的规模会不断增长。
无类别的域间路由选择CIDR(Classless Interdomain Routing)提出了一个可以解决第三个问题的建议,对当前版本的IP(IP版本4)进行扩充,以适应21世纪Internet的发展。对此我们将在10.8节进一步详细介绍。
对新版的IP,即下一代IP,经常称作IPng,主要有四个方面的建议。1993年5月发行的IEEENetwork (vol.7, no.3)对前三个建议进行了综述,同时有一篇关于CIDR的论文。RFC1454[Dixon 1993]对前三个建议进行了比较。
SIP,简单Internet协议。它针对当前的IP提出了一个最小幅度的修改建议,采用64位地址和一个不同的首部格式(首部的前4比特仍然包含协议的版本号,其值不再是4)。
PIP。这个建议也采用了更大的、可变长度的和有层次结构的地址,而且首部格式也不相同。
TUBA,代表“TCP and UDP with Bigger Address”,它基于OSI的CLNP(Connectionless Network Protocol,无连接网络协议),一个与IP类似的OSI协议。它提供大得多的地址空间:可变长度,可达20个字节。由于CLNP是一个现有的协议,而SIP和PIP只是建议,因此关于CLNP的文档已经出现。RFC 1347[Callon 1992]提供了TUBA的有关细节。文献[Perlman 1992]的第7章对IPv4和CLNP进行了比较。许多路由器已经支持CLNP,但是很少有主机也提供支持。
TP/IX,由RFC 1475[Ullmann 1993]对它进行了描述。虽然SIP采用了64 bit的址址,但是它还改变了TCP和UDP的格式:两个协议均为32 bit的端口号,64 bit的序列号,64 bit的确认号,以及TCP的32 bit窗口。
第3章 IP:网际协议37
前三个建议基本上采用了相同版本的TCP和UDP作为传输层协议。
由于四个建议只能有一个被选为IPv4的替换者,而且在你读到此书时可能已经做出选择,因此我们对它们不进行过多评论。虽然CIDR即将实现以解决目前的短期问题,但是IPv4后继者的实现则需要经过许多年。
3.11 小结
本章开始描述了IP首部的格式,并简要讨论了首部中的各个字段。我们还介绍了IP路由选择,并指出主机的路由选择可以非常简单:如果目的主机在直接相连的网络上,那么就把数据报直接传给目的主机,否则传给默认路由器。
在进行路由选择决策时,主机和路由器都使用路由表。在表中有三种类型的路由:特定主机型、特定网络型和默认路由型。路由表中的表目具有一定的优先级。在选择路由时,主机路由优先于网络路由,最后在没有其他可选路由存在时才选择默认路由。
IP路由选择是通过逐跳来实现的。数据报在各站的传输过程中目的IP地址始终不变,但是封装和目的链路层地址在每一站都可以改变。大多数的主机和许多路由器对于非本地网络的数据报都使用默认的下一站路由器。
A类和B类地址一般都要进行子网划分。用于子网号的比特数通过子网掩码来指定。我们为此举了一个实例来详细说明,即作者所在的子网,并介绍了变长子网的概念。子网的划分缩小了Internet路由表的规模,因为许多网络经常可以通过单个表目就可以访问了。接口和网络的有关信息通过ifconfig和netstat命令可以获得,包括接口的IP地址、子网掩码、广播地址以及MTU等。
在本章的最后,我们对Internet协议族潜在的改进建议——下一代IP进行了讨论。
习题
环回地址必须是127.0.0.1吗?
在图3-6中指出有两个网络接口的路由器。
子网号为16 bit的A类地址与子网号为8bit的B类地址的子网掩码有什么不同?
阅读RFC 1219[Tsuchiya 1991],学习分配子网号和主机号的有关推荐技术。
子网掩码255.255.0.255是否对A类地址有效?
你认为为什么3.9小节中打印出来的环回接口的MTU要设置为1536?
TCP/IP协议族是基于一种数据报的网络技术,即IP层,其他的协议族则基于面向连接的网络技术。阅读文献[Clark 1988],找出数据报网络层提供的三个优点。
本文同步发表:https://www.geek-share.com/detail/2752945343.html
《TCP/IP详解 卷1:协议》在线整理版目录导航
《TCP/IP详解》学习笔记(四):ICMP 协议、ping 和 Traceroute
《TCP/IP详解》学习笔记(七):广播和多播、IGMP协议
《TCP/IP详解》学习笔记(十):TCP 连接的建立与中止