IP协议(RFC-791)是IP/TCP协议栈的网络层协议,运行在分组交换的计算机网络之上。提供定长地址的源主机与目标主机之间的数据块传输。

概述

IP&ICMP上层为主机到主机的协议(如TCP),可以调用IP协议进行数据传输(需提供主机地址和其他IP头中需要的字段);下层为本地网络协议(链路层协议如APANET)进行数据报传输。IP协议实现里两个基本操作:寻址和分块。

因特网模块使用IP头提供的地址把数据报传向目标地址,传送路径的选择称为 路由 。因特网模块会对长报文进行分块和装配用以在小报文网络传输。IP协议独立地对待每个数据报,它们之间没有任何联系。

IP协议提供的服务使用了四种核心机制:服务类型、存活时间、选项、头部校验和。

  1. 服务类型用来描述期望的服务质量,是一组描述服务选项的参数的抽象,用于在网关路由时选择传输参数、下一跳的网络、下一个网关。
  2. 存活时间描述了IP数据报存活期的上限。该字段由发送者设置,在路由处完成递减。当达到0时该报文被销毁。
  3. 选项用于在一些情形下提供控制功能,普通通信中并不必要。如:时间戳规定、安全、特殊路由等。
  4. 头部校验和用来检验数据报中的信息是否传输正确。如果校验失败,立即丢掉该报文。

IP协议并不提供可靠的通信。端与端、上一跳与下一跳之间没有确认;也没有数据错误控制和流控制。检测到的错误可能通过ICMP协议进行报告。

操作模型

考虑只有一个中间网关的情形。

  1. 发送方应用程序准备好数据,调用Internet模块来发送(同时给定地址和其他参数)。
  2. Internet模块准备一个数据报头并加载数据,确定目标IP的本地网络地址(在这里是中间网关的地址),然后交给本地网络接口。
  3. 本地网络接口创建一个本地网络头,加载数据报,然后发送到本地网络。
  4. 中间网关拿到本地网络包装过的数据报,本地网络接口去掉该头部后交给Internet模块。Internet模块由IP地址决定应该发往另一个网络的主机,然后确定目标主机的本地网络地址,将数据报交给那个网络的本地网络接口。
  5. 本地网络接口创建头部并加载数据报,发送至目标主机。
  6. 到达目标主机后,本地网络接口将头部移除,交给Internet模块。
  7. Internet模块决定将该数据报交给哪个应用程序。相应的系统调用发生时,传递该数据以及源地址和其他参数。

功能描述

寻址

名称 为要寻找的东西, 地址 是它在哪里, 路由 是怎么到达。上层协议会完成从名称到地址的映射;Internet模块完成从地址映射到本地网络地址;底层的协议完成本地网络地址到路由的映射。

IP地址是固定32位长度,以网络号开始,本地地址结束。有3类Internet地址:

  1. A类:0+7位网络号+24位本地地址;
  2. B类:10+14位网络号+16位本地地址;
  3. C类:110+21位网络号+8位本地地址。

分块

当本地网络允许大包而传输过程必须经过限制到更小的包大小的网络时,IP数据报的分块就势在必行。IP数据报也可以标志为 不要分块 ,在不满足大小限制时便会被丢掉,同时发送ICMP给源地址(该机制被用于MTU发现方法)。

每个被分块后的IP数据报会有more-fragments标志和offset标志。用于识别分块的包还是完整的包,并用于组装。

网关

网关 用来在网络之间转发数据报。同时也实现GGP(Gateway to Gateway protocal)来协调路由和其他Internet控制信息。

头部格式

 0                   1                   2                   3   
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字段说明:

  • Version:IP协议版本
  • IHL:Internet头部长度,单位为32位字
  • Type of Sservice:服务类型,指示期望服务质量的抽象参数。在传输过程中该数据报会因此得到不同的对待。
  • Total Length:数据报的大小,单位为8位字节。因此IP数据报最大长度为65535。实际网络中MTU往往为1500,IP数据最大为1500-链路层头部大小-IP头部大小
  • Identification:发送者赋值,便于组装分块。
  • Flags:第一位:保留为0;第二位:禁止分块;第三位:是否还有后续分块。
  • Fragment Offset:本数据报所在的位置(第一个分块该字段为0),单位为64位字。
  • Time to Live:生存期。在IP头部处理时都会修改,为0时丢弃,即跳数上限。
  • Protocol:下一层的协议,定义在RFC-790。
  • Header Checksum:头部校验和,只校验头部。因TTL等字段会变,该校验值每次处理中都会重新计算。
  • Source/Destination Address:源/目标地址。
  • Option:可选字段,长度可变。其内容包括:安全、LSRR、SSRR、RR、流标识符、Internet时间戳等。
  • Padding:确保Internet头部长度在32位的边界。

参考:RFC-791

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2014/09/21/ip.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。