且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《分布式系统:概念与设计》一3.4.2 IP协议

更新时间:2022-09-27 12:55:30

3.4.2 IP协议

IP协议将数据报从一个主机传到另一个主机,如果需要的话还会经过中间路由器。完整的IP数据包格式是相当复杂的,图3-17给出了其主要组成部分。有一些头部域没有显示在图中,它们是用于传输和路由算法的。
《分布式系统:概念与设计》一3.4.2 IP协议

IP提供的传输服务被描述成有不可靠或尽力而为这样的传输语义,因为没有传输上的保证。数据包可能会丢失、重复、延迟或顺序错误,但这些错误只在底层网络失败或目的地缓冲区满的时候才会发生。IP中唯一的校验和是头部的校验和,其计算代价不高,还能确保检测到任何寻址和数据包管理数据中发生的错误。它没有提供数据的校验和,这避免了经过路由器时的开销,而是让更高层的协议(TCP和UDP)来提供它们自己的校验和——这是端对端争论中的一个实际例子(参见2.3.3节)。
IP层将IP数据报放入适合底层网络(例如以太网)传输的网络数据包中。当IP数据报的长度大于底层网络的MTU时,就在发送端将IP数据报分割成多个小的数据包,然后在目的地重新组装。数据包还可以进一步分割以适合从源地址到目的地址的路径中所经过的网络(每个数据包都有一个片断标识符,使得打乱顺序的各个段能够重新组合起来)。
IP层还必须在底层网络中插入消息目的地的“物理”网络地址。该地址可以从互联网网络接口层的地址解析模块获得(见下一小节的介绍)。
地址解析 地址解析模块负责将互联网地址转为特定底层网络所使用的网络地址(有时称为物理地址)。例如,如果底层网络是以太网,那么地址解析模块将把32比特的互联网地址转换成48比特的以太网地址。111
这种转换是与网络技术相关的:

  • 有一些主机直接与互联网数据包交换机相连,IP数据包可以不需要地址翻译就路由到它们。
  • 一些局域网允许动态地将网络地址分配给主机,这样就可以方便地选择地址以匹配互联网地址中的主机标识符部分——翻译就是从IP地址中抽取主机标识符。
  • 对于以太网和其他局域网,每个计算机的网络地址都是和它的网络硬件接口固定的,和互联网地址没有直接的关系——翻译取决于主机的IP地址和以太网地址间的对应关系,其具体实现是通过地址解析协议(ARP)完成的。

现在我们概述一下以太网中ARP的实现。为了能在计算机加入局域网时让IP数据包在以太网上传输,使用了动态询问并利用缓存来减少询问消息。先考虑同一个以太网中一个主机用IP向另一个主机传送消息的情况。发送方的IP软件模块在发送数据包前,必须将IP数据包中的接收方的互联网地址翻译成以太网地址。它调用发送方的ARP模块来完成这一任务。
每个主机上的ARP模块都维护一个缓存,保存它以前获得的(IP地址,以太网地址)对。如果需要的IP地址位于这个缓存中,请求就会立刻被应答。如果没有需要的IP地址,ARP模块会在本地的以太网上发出一个以太网广播数据包(ARP请求数据包),数据包中包括了所需的IP地址。本地以太网中的每个计算机都收到这个ARP请求数据包,并用自己的IP地址和数据包中的IP地址进行匹配。如果匹配,就给ARP请求的发出方发送一个ARP应答,应答中包括自己的以太网地址;如果不匹配,就忽略该数据包。发出方的ARP模块在自己的本地(IP地址,以太网地址)缓存中加入新的IP地址到以太网地址的映射表,这样将来如果响应类似的ARP请求就不需要再广播了。一段时间之后,每个计算机上的ARP缓存中都包含了所有计算机的(IP地址,以太网地址)对。这时只有在有新计算机加入到本地以太网时才需要ARP广播。
IP伪冒 我们已经看到,IP数据包中包括一个源地址——发送方计算机的IP地址。它与封装在数据域中的端口地址(对于TCP和UDP数据包)一起,经常被服务器用来生成一个返回地址。遗憾的是,并不能保证给定的源地址就是真正的发送方的地址。心怀叵测的发送者可以轻易地使用别的地址来代替它。这个漏洞已成为多起著名攻击的源头,包括1.5.3节提到的2000年2月出现的分布式拒绝服务攻击[Farrow 2000]。所使用的方法就是在几个站点向大量的计算机发出ping请求(ping是一个简单的服务,用于检查主机的可用性)。这些恶意的ping请求在它们的发送方地址域中都填上了目标计算机的IP地址,因此ping的应答就指向目标计算机,112造成它们的输入缓冲溢出,造成合法的IP数据包无法通过。这种攻击将在第11章中进一步讨论。