IP 是 Internet Protocol(网络互连协议,网际协议)的缩写,是 TCP/IP 体系中的网络层协议。
IP 是 TCP/IP 协议族中最为核心的协议,所有的 TCP,UDP,ICMP 和 IGMP 数据都以 IP 数据报格式传输。
IP 提供不可靠,无连接的数据报传送服务。
- 不可靠:不能保证 IP 数据报能成功地到达目的地,IP 仅提供最好的传输服务。
- 无连接:IP 并不维护任何关于后续数据报的状态信息,每个数据报的处理都是相互独立的,这也意味着,IP 数据报可以不按发送顺序接受。
IP 的数据格式如下:
- 4位版本:目前 IP 的协议版本号是 4,因此 IP 也称作 IPv4。
- 4位首部长度:该字段定义数据报协议头长度,表示协议头部具有32位字长的数量。协议头最小值为5,最大值为15。
- 8位服务类型(TOS):TOS 分别代表最小时延,最大吞吐量,最高可靠性和最小费用。
- 16位总长度字段:指整个 IP 数据报的长度,以字节为单位。由于该字段长 16 bit,所以 IP 数据报最长可达 65535 字节。
- 16位标识:唯一地标识主机发送的每一份数据报,通常每发送一份报文它的值就会加 1。
- 3位标记:该字段由3位字段构成,最低位(MF)控制分段,存在下一个分段置为1,否则置0代表该分段是最后一个分段。中间位(DF)指出数据报是否可进行分段,如果为1则机器不能将该数据报进行分段。第三位即最高位保留不使用,值为0。
- 13位分段偏移:该字段指出分段数据在源数据报中的相对位置,支持目标IP适当重建源数据。
- 8位生存时间字段 TTL(time-to-live):设置了数据报可以经过的最多路由器数,它指定了数据报的生存时间。
- 8位协议字段:根据它可以识别是哪个协议向 IP 传送数据。
- 16位首部校验和字段:根据 IP 首部计算的校验和码。
- 32位源 IP 地址/目的 IP 地址:地址都是 32 bit 的值。
- 选项:数据报中的一个可变长的可选信息。
TTL 的初始值由源主机设置(通常为 32 或 64),一旦经过一个处理它的路由器,它的值就减 1。
当该字段为 0 时,数据报就被丢弃,并发送 ICMP 报文通知源主机。
首部校验和不对首部后面的数据进行计算。
ICMP,IGMP,UDP 和 TCP 在它们各自的首部中均含有同时覆盖首部和数据校验和码。
计算 IP 校验和的步骤如下:
- 把校验和字段置为 0
- 对首部中每个 16 bit 进行二进制反码求和,结果存在校验和字段中
- 当收到一份 IP 数据报后,同样对首部中每个 16 bit 进行二进制反码求和
- 如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全 1
- 如果结果不是全 1,那么 IP 就丢弃收到的数据报,由上层去发现丢失的数据报并进行重传
选项很少被使用,并非所有的主机和路由器都支持这些选项,选项定义如下:
- 安全和处理限制,用于军事领域
- 记录路径,让每个路由器都记下它的 IP 地址
- 时间戳,让每个路由器都记下它的 IP 地址和时间
- 宽松的源站选路,为数据报指定一系列必须经过的 IP 地址
- 严格的源站选路,与宽松的源路选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址
一个 IP 数据报从源主机传输到目标主机可能需要经过多个不同的物理网络。
由于各自网络的数据帧都有一个最大传输单元 MTU,如以太网帧的 MTU 是 1500,因此,当路由器在转发 IP 时,如果数据报大小超过了出口链的最大传输单元时,则会将该 IP 分组分解成小的片段。
这些 IP 分片重新封装一个 IP 包独立传输,在到达目标主机时才会被重组起来。
IP 路由选择主要完成以下这些功能:
- 搜索路由表,寻找能与目的 IP 地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。
- 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。
- 搜索路由表,寻找标为"默认(default)"的表目。如果找到,则把报文发送给该表目指定的下一站路由器。
- 如果上面步骤都没有成功,那么一般会向生成数据报的应用程序返回一个"主机不可达"或"网络不可达"的错误。
- 如果目标网络与本地路由器直接相连,则直接将数据报交付给目标主机,这个叫做直接交付
- 否则,路由器通过路由表查找路由信息,并将数据报转交给指明的下一跳路由器,这个叫做间接交付
IP 在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次。
路由表中的每一项都包含下面这些信息:
- 目的 IP 地址。既可以是完整的主机地址,也可以是一个网络地址。
- 下一站(或下一跳)路由器(next-hop router)的 IP 地址,或者有直接连接的网络 IP 地址。
- 标志。一个标志指明目的 IP 地址是网络地址还是主机地址,另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。
- 为数据报的传输指定一个网络接口。
子网掩码是一个 32 bit 的值,其中值为 1 的比特留给网络号和子网号,为 0 的比特留给主机号。
任何主机在引导时进行的部分配置是指定主机 IP 地址。除了 IP 地址以外,主机还需要知道有多少比特用于子网号以及多少比特用于主机号。这是在引导过程中通过子网掩码来确定的。
给定 IP 地址和子网掩码后,主机就可以确定 IP 数据报的目的是:
- 本子网上的主机
- 本网络中其他子网的主机
- 其他网络上的主机