TCP/IP系列文章(3):Internet协议

  IP是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP和IGMP数据都是通过IP数据报传输。IP提供了一种尽力而为、无连接的数据报交付服务
  “尽力而为”的含义是不保证IP数据报能成功到达目的地。虽然IP不是简单丢弃所有不必要流量,当它也不对自己尝试交付的数据报提供保证。当某些错误发生时,例如一台路由器临时用尽缓冲区,IP提供一个简单的错误处理方法:丢弃一些数据(通常是最后到达的数据报)。任何可靠性必须由上层(例如TCP)提供。IPv4和IPv6都使用这种尽力而为的基本交付模式。
   “无连接”意味着IP不维护网络单元(即路由器)中数据报相关的任何链接转态信息每个数据报独立于其他数据报来处理。这也意味着IP数据报可不按顺序交付。如果一个源主机向同一目的地发送两个连续的数据报(第一个为A,第二个为B),每个数据报可以独立路由,通过不同路径,并且B可能在A之前到达。IP数据报也可能发生其他问题:它们可能在传输过程中被复制,可能改变内容从而导致错误。此外,IP之上的一些协议(通常是TCP)需要处理这些潜在问题,以便为应用提供无差错的交付。
TCP/IP系列文章(3):Internet协议_第1张图片
TCP/IP系列文章(3):Internet协议_第2张图片

IPv4头部和IPv6头部

   正常的IPv4头部大小为20字节,除非存在选项(这种情况很少见)。IPv6头部长度是IPv4的两倍,但没有任何选项,它可以有扩展头部,可提供类似的功能。
  以一个32位值的4字节为例,按以下顺序传输:首先是0-7位(高位),然后是8-15位,接着是16-23位,最后是24-31位(低位)。这就是所谓的高位优先字节序,它是TCP/IP头部中所有二进制整数在网络中传输时所需的字节顺序,也称为网络字节序(大端)。计算机的CPU使用其他格式存储二进制整数,例如大多数PC使用低位优先字节序也称为主机字节序(小端)。在传输时必须将头部值转换为网络字节序,并在接收时再转换回来。

IP头部字段

   第一个字段(只有4位或半个字节)是版本字段,它包含IP数据报的版本号:IPv4为4,IPv6为6。IPv4和IPv6头部除版本字段位置相同外再无其他是一样的。
   Internet头部长度(IHL)字段保存IPv4头部中32位字的数量,包括任何选项。由于它是一个4位的字段 ,所以IPv4头部被限制为最多15个32位字(即60字节),故选项最后可以有60-20=40个字节。这个字段的正常值是5(即没有选项时,头部为20字节)。IPv6中不存在这个字段,其头部长度固定为40字节。
  头部长度字段之后有两个部分,前6位被称为区分服务字段(DS字段),后2位是显式拥塞通知字段(ECN字段)或指示位。IPv4和IPv6中都有这两个字段,它们被用于数据报转发时的特殊处理。
  总长度字段是IPv4数据报的总长度(以字节为单位),通过这个字段和IHL字段,就能知道数据报的数据部分从哪里开始,以及它的长度。由于它是一个
16位
的字段,所以IPv4数据报的最大长度(包括头部)为65535字节。尽管可以发送一个65535字节的IP数据报,但大多数链路层(例如以太网)不能携带这么大的数据,除非将它分成更小的片。当一个IPv4数据报被分成多个更小的分片时,每个分片自身仍是一个独立的IP数据报,总长度字段反映具体的分片长度
  标识字段帮助标识由IPv4主机发送的数据报。为了避免将一个数据报分片和其他数据报分片混淆,发送主机通常在每次(从它的一个IP地址)发送数据报时都将一个内部计数器加1,并将该计数器值复制到IPv4标识字段。在IPv6中,这个字段显示在分片的扩展头部中。
  生存期(TTL)字段用于设置一个数据报可经过的路由器数量的上限。发送方将它初始化为某个值(RFC建议为64,但128和256也不少见),每台路由器在转发数据报时将该值减1。当这个字段值达到0时,该数据报被丢弃,并使用一个ICMP消息通知发送方。这可以防止由于出现不希望的路由导致数据报在网络中永远循环。这个字段在IPv6中根据实际用途已被重新命名为跳数限制。
  协议字段包含一个数字,表示数据报有效载荷部分的数据类型最常用的值为17(UDP)和6(TCP)。这提供了多路分解的功能,以便IP协议可用于携带多种协议类型的有效载荷。虽然该字段最初仅用于指定数据报封装的传输层协议,但它现在用于识别其中封装的协议是否为一种传输层协议。IPv6头部中的下一个头部字段给出了IPv4中的协议字段。
  头部校验和字段仅计算IPv4头部,这意味着IP协议不检查IPv4数据报有效载荷(例如TCP或UDP数据)的正确性。为了确保IP数据报的有效载荷部分已正确传输,其他协议必须通过自己的数据完整性检验机制来检查重要数据。实际上,封装在IP中的几乎所有协议(ICMP、IGMP、UDP和TCP)在自己头部中都有一个涵盖其头部和数据的检验和,也涵盖它们认为重要的IP头部的某些部分(一种“违反分层”的形式)。当一个IPv4数据报经过一台路由器时,TTL字段减1带来的结果是其头部校验和必须改变。IPv6头部没有任何校验和字段。

Internet校验和

  大多数使用校验和的Internet相关协议都使用同一种校验和计算算法,因此称之为Internet校验和。Internet校验和是一个16位的数字和,它能以相当高的概率确定接收的消息或其中的部分内容是否与发送的相匹配。当发现一个头部出错(计算的校验和不为0)时,IPv4将丢弃接收到的数据报。但是,不会生成差错信息。更高层以某种方式检测丢失的数据报,并在必要时重新传输。注意,Internet校验和算法与常见的循环冗余校验(CRC)不同,CRC提供了更强的保护功能。

IP转发

  从概念上来说,IP转发是很简单的,特别对于一个主机。**如果目的地是直接相连的主机(例如点到点链接)或共享网络(例如以太网),IP数据报直接发送到目的地,不需要或者不使用路由器。否则,主机将数据报发送到一台路由器(称为默认路由器),由该路由器将数据报交付到目的地。**这个简单方案适用于大多数主机配置。大多数主机既可以配置为路由器,也可配置为主机。主机和路由器处理IP数据报的区别在于:主机不转发那些不是由它生成的数据报,但是路由器会转发
  在整个转发方案中,IP协议可接收一个数据报。它可能来自同一主机上的其他协议(TCP、UDP等),也可能来自一个网络接口。IP层包括一些位于内存中的信息,通常称为路由表或转发表,每次转发一个数据报需要从中查找信息。当一个网络接口接收到一个数据报时,IP模块首先检查目的地址是否为自己的IP地址(与自己的某个网络接口相关的IP地址),或是它可以接收其流量的一些其他地址(例如IP广播或组播地址)。如果是的话,数据报交付给由IPv4头部的协议字段或IPv6头部的下一个头部字段指定的协议模块。如果数据报的目的地不是本地IP模块使用的IP地址,那么:(1)如果IP层配置为一台路由器,则转发该数据报,则转发该数据报(也就是说,作为一个输出的数据报处理);(2)数据报被默默丢弃,在某些情况下(例如在(1)中没有路由),ICMP消息可能发送会源节点,以表明发生了一个错误。

转发表

IP标准协议没有规定转发表所需的精确数据,这个选择工作留给IP协议的实现者。但是,IP转发表通常需要包含几个关键信息,至少在理论上,路由或转发表中的每个条目包含以下字段信息:
  目的地:它是一个32位字段(或128位字段,用于IPv6),用于与一个掩码操作结果相匹配
  掩码:它是一个32位字段(或128位字段,用于IPv6),与数据报的目的IP地址进行按位与操作,掩码结果与转发表条目中的多个目的地的进行比较。
  下一跳:它是下一个IP实体(路由器或主机)的32位IPv4地址(或128位IPv6地址)数据报将被转发到该地址。下一跳实体通常在一个网络中由执行转发查找的系统所共享,这意味着它们共享同一网络前缀。
  接口:它包含一个由IP层使用的标识符,以确定将数据报发送到下一跳的网络接口。例如,它可能是一台主机的802.11无线接口,一个有线的以太网接口或一个与串行端口相关联的ppp接口。如果转发系统也是IP数据报的发送方,该字段用于选择输出数据报的源IP地址。

IP转发行动

  当一台主机或路由器中的IP层需要向下一跳的路由器或主机发送一个数据报时,它首先检查数据报中的目的IP地址(D)。在转发表中使用该值D来执行最长前缀匹配算法
  在表中搜素具有以下属性的所有条目:将该条目的掩码字段m和目的IP地址D执行按位与,如果得到的结果与该条目的目的地字段D相等,则表示该条目e与目的IP地址相“匹配”,其中掩码字段m中被设置为1的位数越多,说明匹配的“越好”。选择最匹配的条目,并将其下一跳字段n作为转发数据报的下一跳IP地址。
  如果转发表中没有发现匹配的条目,这个数据报将无法交付。如果在本地出现(在这台主机)无法交付的数据报,通常向生成数据报的应用程序返回一个“主机不可达“错误。如果在一条路由器上,ICMP消息通常返回给发送数据报的主机
  在某些情况下,可能有多个条目都是最匹配的,例如当多个默认路由可用时会发生这种情况。此时,通常最简单地选择第一个最匹配的结果,更复杂的系统可能尝试在多个路由上平衡负载或拆分流量。

例子

  为了对简单的局部环境(例如同一LAN)和某些更复杂的多跳环境(全球Internet)中的IP转发工作进行理解,下面将分两种情况进行讨论:第一种情况,所有系统使用相同的网络前缀,这称为直接交付;另一种情况为间接交付。
TCP/IP系列文章(3):Internet协议_第3张图片

直接交付

  如图5-16(上)所示,源主机S的发送一个IP数据报到目的主机D,整个系统通过一台交换机互连起来,两台主机都在同一以太网中。当源主机S的IP层接收到一个来自上层的数据报(例如TCP或UDP),它将会查找自己的转发表。源主机S的转发表如下表所示:
TCP/IP系列文章(3):Internet协议_第4张图片
  在表5-8中,目的IPv4地址D(10.0.0.9)与第一和第二个转发表条目都匹配,但与第二个条目匹配得更好(25位),所以下一跳网关地址为10.0.0.100,其实就是源主机地址S。该条目的网关部分包含发送主机的网络接口(没有涉及路由器),说明采用直接交付来发送数据报。
  这个数据报被封装在一个底层帧(链路层)中,并发送给目的主机D。如果目的主机的底层地址(MAC地址)未知,可能需要使用ARP协议(对于IPv4)或邻居请求(对于IPv6)操作,以确定正确的MAC地址。这台交换机基于MAC地址交付该帧,它并不关心IP地址。

间接交付

  源主机有一个IP数据报发送到目的主机ftp.uu.net,其IPv4地址为192.48.96.9。图5-16(下)显示了通过4台路由器的数据报传输路径。首先,源主机主机在自己的转发表中,查找,但在本地网络没有找到匹配的前缀。这是,它使用自己的默认路由条目(匹配每个目的地,但没有“1”位)。这个默认路由条目指出适当的下一跳网关地址为10.0.0.1(路由器R1的“a侧”)。
  在间接交付中,IP地址对应于前面的源主机和目的主机,但是底层地址(MAC地址)不对应。实际上,MAC地址决定哪台机器在每跳的基础上接收包含数据报的帧。在本例中,需要的MAC地址为下一跳路由器R1的a侧接口的以太网地址,MAC地址对应的IPv4地址为10.0.0.1。这由ARP(IPv6则是一个邻居请求)在互联S和R1的网络上完成。R1通过其a侧的MAC地址响应后,S将向R1发送数据报。S向R1交付仅根据低层头部(更具体地说是低层的目的地址)来处理。在接收到这个数据报之后,R1将检查自己的转发表
TCP/IP系列文章(3):Internet协议_第5张图片
  当R1接收到数据报时,它发现数据报的目的IP地址不是自己,因此它将转发这个数据报。R1搜索转发表,并使用默认的条目。在这种情况下,该默认条目的下一跳位于ISP服务的网络中,即70.231.159.254(这是R2 a侧的接口)。由于R2这台路由器位于全球Internet中,并且Windows机器的源地址为私有地址10.0.0.100,R1对数据报进行网络地址转换,以使它在Internet中可路由对数据报进行NAT处理,结果是生成新的源地址70.231.132.85,它对应于R1的b侧接口。不使用私有地址(例如ISP和大型企业)的网络不需要执行一步,并且保持原来的源地址不变。
  当路由器R2(在ISP内部)接收到数据报,它的操作步骤与本地路由器R1相同(除了NAT操作外)。如果数据报目的地不是自己的IP地址,则转发这个数据报。以此列推。

你可能感兴趣的:(TCP/IP)