TCP/IP详解卷一_笔记3(IP:网际协议)


· IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。

· 许多刚开始接触TCP / IP的人对IP提供不可靠、无连接的数据报传送服务感到很奇怪。实际上:
不可靠(unreliable) 的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。
无连接( connectionless) 这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明, IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。

3.1 IP首部

· IP数据报的格式如图所示。普通的IP首部长为20个字节,除非含有选项字段。

· IPv4首部一般是20字节长。在以太网帧中,IPv4包首部紧跟着以太网帧首部,同时以太网帧首部中的协议类型值设置为080016。
TCP/IP详解卷一_笔记3(IP:网际协议)
版本号(4位): 目前的协议版本号是4,因此IP有时也称作IPv4。

首部长度(4位): 标识该IP头部有多少个32 bit字(4字节)。因为4位最大能表示15,所以IP头部最长是60字节

服务类型(TOS)(8位): 包括一个3位的优先权字段(现在已经被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延 时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1,应用程序应该根据实际需要来设置它。比如像ssh和telnet这样的登录程序需要的是 最小延时的服务,而文件传输程序ftp则需要最大吞吐量的服务。

长度(16位): 是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535(216-1)字节。但由于MTU的限制,长度超过MTU 的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。接下来的3个字段则描述了如何实现分片。


标识(16位): 唯一地标识主机发送的每一个数据报。其初始值由系统随机生成;每发送一个数据报,其值就加1。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。

标志(3位): 3位标志字段的第一位保留。第二位(Don’t Fragment,DF)表示“禁止分片”。如果设置了这个位,IP模块将不对数据报进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模 块将丢弃该数据报并返回一个ICMP差错报文。第三位(More Fragment,MF)表示“更多分片”。除了数据报的最后一个分片外,其他分片都要把它置1。

片位移(13位): 分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分 片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移值)。


生存时间(TTL)(8位): 是数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1。当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。

协议(8位): 用来区分上层协议,/etc/protocols文件定义了所有上层协议对应的protocol 字段的数值。其中,ICMP是1,TCP是6,UDP是17。/etc/protocols文件是RFC 1700的一个子集。

校验和(16位): 由发送端填充,接收端对其使用CRC算法以检验IP数据报头部(注意,仅检验头部)在传输过程中是否损坏。


源IP地址(32位)/目的IP地址(32位): 用来标识数据报的发送端和接收端。一般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。

选项: 是可变长的可选信息。这部分最多包含40字节,因为IP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。可用的IP选项包括:
① 记录路由(record route),告诉数据报途经的所有路由器都将自己的IP地址填入IP头部的选项部分,这样我们就可以跟踪数据报的传递路径。

② 时间戳(timestamp),告诉每个路由器都将数据报被转发的时间(或时间与IP地址对)填入IP头部的选项部分,这样就可以测量途经路由之间数据报传输的时间。

③ 松散源路由选择(loose source routing),指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器。

④ 严格源路由选择(strict source routing),和松散源路由选择类似,不过数据报只能经过被指定的路由器。

3.2 IP路由选择

· 如果目的主机与源主机直接相连(如点对点链路)或都在一个共享网络上(以太网或令牌环网),那么I P数据报就直接送到目的主机上。否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。

· I P层既可以配置成路由器的功能,也可以配置成主机的功能。当今的大多数多用户系统,包括几乎所有的Unix系统,都可以配置成一个路由器。我们可以为它指定主机和路由器都可以使用的简单路由算法。本质上的区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。内含路由器功能的主机应该从不转发数据报,除非它被设置成那样。

· I P层在内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时, IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址。如果确实是这样,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。
如果数据报的目的不是这些地址,那么①如果I P层被设置为路由器的功能,那么就对数据报进行转发(也就是说,像下面对待发出的数据报一样处理);否则②数据报被丢弃。

3.2.1 路由表

每个Windows系统中都有IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息。(使用route print命令可查看)

一、路由表中的每一项都包含下面这些信息:

① 目的I P地址。它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定(如下所述)。主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的所有主机(如以太网,令牌环网)。

② 下一站(或下一跳)路由器(next-hop router)的I P地址,或者有直接连接的网络I P地址。下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下一站路由器不是最终的目的,但是它可以把传送给它的数据报转发到最终目的。

③ 标志。其中一个标志指明目的I P地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。

④ 为数据报的传输指定一个网络接口。

二、IP路由选择主要完成以下这些功能:

① 搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。

② 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机都是通过这种表目进行寻径的。这种搜索网络的匹配方法必须考虑可能的子网掩码。

③ 搜索路由表,寻找标为“默认(default)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。

• 如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。

• 为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是I P路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模,比如Internet上的路由器有只有几千个表目,而不会是超过100万个表目。

3.2.2 简单的IP路由选择的例子

一、在同一个以太网:
我们的主机bsdi有一个IP数据报要发送给主机sun。双方都在同一个以太网上。
TCP/IP详解卷一_笔记3(IP:网际协议)
路由选择如下:
1、当IP从某个上层收到这份数据报后,它搜索路由表,发现目的I P地址(140.252.13.33)在一个直接相连的网络上(以太网140.252.13.0)。于是,在表中找到匹配网络地址。
2、数据报被送到以太网驱动程序,然后作为一个以太网数据帧被送到sun主机上。

二、不在同一个以太网:

主机bsdi有一份IP数据报要传到ftp.uu.net主机上,它的IP地址是192.48.96.9。经过的前三个路由器如图所示。
TCP/IP详解卷一_笔记3(IP:网际协议)

1、主机bsdi搜索路由表,但是没有找到与主机地址或网络地址相匹配的表目,因此只能用默认的表目,把数据报传给下一站路由器,即主机sun。当数据报从bsdi被传到sun主机上以后,目的IP地址是最终的信宿机地址(192.48.96.9),但是链路层地址却是sun主机的以太网接口地址。

2、当sun收到数据报后,它发现数据报的目的IP地址并不是本机的任一地址,而sun已被设置成具有路由器的功能,因此它把数据报进行转发。经过搜索路由表,选用了默认表目。根据sun的默认表目,它把数据报转发到下一站路由器netb,该路由器的地址是140.252.1.183。(数据报是经过点对点SLIP链路被传送的,这里,我们没有给出像以太网链路层数据帧那样的首部,因为在SLIP链路中没有那样的首部。)

3、当netb收到数据报后,它执行与sun主机相同的步骤:数据报的目的地址不是本机地址,而netb也被设置成具有路由器的功能,于是它也对该数据报进行转发。采用的也是默认路由表目,把数据报送到下一站路由器gateway(140.252.1.4)。

4、位于以太网140.252.1上的主机netb用ARP获得对应于140.252.1.4的48 bit以太网地址。这个以太网地址就是链路层数据帧头上的目的地址。

5、路由器gateway也执行与前面两个路由器相同的步骤。它的默认路由表目所指定的下一站路由器IP地址是140.252.104.2。

关键点:
① 该例子中的所有主机和路由器都使用了默认路由。事实上,大多数主机和一些路由器
可以用默认路由来处理任何目的,除非它在本地局域网上。
② 数据报中的目的IP地址始终不发生任何变化所有的路由选择决策都是基于这个目的IP地址。
③ 每个链路层可能具有不同的数据帧首部,而且链路层的目的地址(如果有的话)始终
指的是下一站的链路层地址。在例子中,两个以太网封装了含有下一站以太网地址的链路层首部,但是SLIP链路没有这样做。以太网地址一般通过ARP获得。

3.3 子网寻址

现在所有的主机都要求支持子网寻址(RFC 950 [Mogul and Postel 1985])。不是把IP地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。
这样做的原因是因为A类和B类地址为主机号分配了太多的空间,可分别容纳的主机数为
2^24-2和 2^16-2。事实上,在一个网络中人们并不安排这么多的主机。由于全0或全1的主机号都是无效的,因此我们把总数减去2。

这里有一个B类网络地址,在剩下的16 bit中,8 bit用于子网号, 8 bit用于主机号,格式如图所示。这样就允许有254个子网,每个子网可以有254台主机。
TCP/IP详解卷一_笔记3(IP:网际协议)
子网对于子网内部的路由器是不透明,如下图所示,一份来自Internet的数据报到达gateway,它的目的地址是140.252.57.1。路由器gateway需要知道子网号是57,然后把它送到kpno。同样,kpno必须把数据报送到R55,最后由R55把它送到R57。
TCP/IP详解卷一_笔记3(IP:网际协议)

3.4 子网掩码

任何主机在引导时进行的部分配置是指定主机I P地址。大多数系统把I P地址存在一个磁
盘文件里供引导时读用。

除了IP地址以外,主机还需要知道有多少比特用于子网号及多少比特用于主机号。这是
在引导过程中通过子网掩码来确定的。这个掩码是一个32 bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号。

下图是一个B类地址的两种不同的子网掩码格式。第一个例子是noao.edu网络采用的子网划分方法,如下图所示,子网号和主机号都是8 bit宽。第二个例子是一个B类地址划分成10 bit的子网号和6 bit的主机号。
TCP/IP详解卷一_笔记3(IP:网际协议)
给定IP地址和子网掩码以后,主机就可以确定I P数据报的目的是:
(1)本子网上的主机;
(2)本网络中其他子网中的主机;
( 3)其他网络上的主机。如果知道本机的I P地址,那么就知道它是否为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地址之间的比较如下图所示。
• 如果目的IP地址是140.252.1.22,那么B类网络号还是一样的(140.252),而且子网号也是一样的(1),但是主机号是不同的。
• 如果目的IP地址是192.43.235.6(一个C类地址),那么网络号是不同的,因而进一步的比较就不用再进行了。
TCP/IP详解卷一_笔记3(IP:网际协议)
给定两个IP地址和子网掩码后, IP路由选择功能一直进行这样的比较。

3.5 特殊情况的IP地址

TCP/IP详解卷一_笔记3(IP:网际协议)
在这个图中, 0表示所有的比特位全为0;- 1表示所有的比特位全为1;netid、subnetid和hostid分别表示不为全0或全1的对应字段。子网号栏为空表示该地址没有进行子网划分。

我们把这个表分成三个部分。表的头两项是特殊的源地址,中间项是特殊的环回地址,
最后四项是广播地址。

表中的头两项,网络号为0,如主机使用BOOTP协议确定本机IP地址时只能作为初始化过程中的源地址出现。

3.6 ifconfig/netstat命令

IPConfig实用程序和它的等价图形用户界面——Windows 95/98中的WinIPCfg可用于显示当前的TCP/IP配置的设置值。这些信息一般用来检验人工配置的TCP/IP设置是否正确。但是,如果你的计算机和所在的局域网使用了动态主机配置协议(Dynamic Host Configuration Protocol,DHCP——Windows NT下的一种把较少的IP地址分配给较多主机使用的协议,类似于拨号上网的动态IP分配),这个程序所显示的信息也许更加实用。这时,IPConfig可以让你了解你的计算机是否成功的租用到一个IP地址,如果租用到则可以了解它分配到的是什么地址。此命令也可以清空DNS缓存(DNS cache)。了解计算机当前的IP地址、子网掩码和缺省网关实际上是进行测试和故障分析的必要项目。

Netstat的定义是: Netstat是在内核中访问网络连接状态及其相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

3.7 IP的未来

IP主要存在三个方面的问题。这是I n t e r n e t在过去几年快速增长所造成的结果

  1. 超过半数的B类地址已被分配。根据估计,它们大约在1995年耗尽。
  2. 32 bit的IP地址从长期的Internet增长角度来看,一般是不够用的。
  3. 当前的路由结构没有层次结构,属于平面型( flat )结构,每个网络都需要一个路由表目。随着网络数目的增长,一个具有多个网络的网站就必须分配多个C类地址,而不是一个B类地址,因此路由表的规模会不断增长。

对新版的IP,即下一代IP,经常称作IPng,主要有四个建议:

  1. SIP,简单Internet协议。它针对当前的IP提出了一个最小幅度的修改建议,采用6 4位地址和一个不同的首部格式(首部的前4比特仍然包含协议的版本号,其值不再是4)。
  2. PIP。这个建议也采用了更大的、可变长度的和有层次结构的地址,而且首部格式也不相同。
  3. TUBA, 代表“ TCP and UDP with Bigger Address ”, 它基于OSI 的CLNP
    (Connectionless Network Protocol,无连接网络协议),一个与IP类似的OS I协议。它提供大得多的地址空间:可变长度,可达20个字节。由于C L N P是一个现有的协议,而SIP和PIP只是建议,因此关于CLNP的文档已经出现。RFC 1347[Callon 1992]提供了T UBA的有关细节。文献[Perlman 1992]的第7章对IPv4和CLNP进行了比较。许多路由器已经支持CLNP,但是很少有主机也提供支持。
  4. TP/IX,由RFC 1475 [Ullmann 1993]对它进行了描述。虽然S I P采用了64 bit的址址,但是它还改变了TCP和UDP的格式:两个协议均为32 bit的端口号,64 bit的***,64 bit的确认号,以及TCP的32 bit窗口。

3.8 小结

本章开始描述了I P首部的格式,并简要讨论了首部中的各个字段。我们还介绍了I P路由
选择,并指出主机的路由选择可以非常简单:如果目的主机在直接相连的网络上,那么就把数据报直接传给目的主机,否则传给默认路由器。

在进行路由选择决策时,主机和路由器都使用路由表。在表中有三种类型的路由:特定
主机型、特定网络型和默认路由型。路由表中的表目具有一定的优先级。在选择路由时,主机路由优先于网络路由,最后在没有其他可选路由存在时才选择默认路由。

I P路由选择是通过逐跳来实现的。数据报在各站的传输过程中目的I P地址始终不变,但
是封装和目的链路层地址在每一站都可以改变。大多数的主机和许多路由器对于非本地网络的数据报都使用默认的下一站路由器。

A类和B类地址一般都要进行子网划分。用于子网号的比特数通过子网掩码来指定。我们
为此举了一个实例来详细说明,即作者所在的子网,并介绍了变长子网的概念。子网的划分缩小了I n t e r n e t路由表的规模,因为许多网络经常可以通过单个表目就可以访问了。接口和网络的有关信息通过i f c o n f i g和n e t s t a t命令可以获得,包括接口的I P地址、子网掩码、广播地址以及M T U等。