Linux 高性能服务器编程-IP 协议详解

IP 协议详解

  • IP 头部信息。IP 头部信息出现在每个 IP数据报中,用于指定 IP 通信的根源 IP地址、目的端 IP 地址,指导 IP 分片和重组,以及指定部分通信行为
  • IP 数据报的路由和转发。 在除目标机器之外的所有主机和路由器上,决定数据报是否应该转发和如何转发

    2.1 IP 服务的特点

    IP 协议是 TCP/IP 协议族的动力,它为上层协议提供 无状态、无连接、不可靠的服务。

无状态:IP 通信双方不同步不同步传输数据的状态信息,因为所有 IP 数据报 发送、传输、接受相互独立。

  • 缺点: 无法处理乱序和重复的 IP数据报。

(面向连接的 TCP 协议,则能够自己处理乱序、重复的报文段,保证递交给上层协议的有序、正确。)

  • 优点:简单、高效。无需为保持通信状态分片内核资源,无需传递状态信息。如 UDP HTTP 协议 都是无状态协议

IP 数据报头部提供标识字段来唯一标识数据报,不用来指示接受顺序。

无连接 :IP 通信双方都不长久维持对方任何信息。

上层协议发送数据,必须指定对方 IP 地址。 不保证 IP数据报准确到达接收端,承诺尽最大努力。
失败:

  • 中转路由器发现 IP 数据在网络上存活时间太长(根据 头部 TTL 判断),丢弃后,返回 ICMP 超时错误。
  • 接收端发现接受到 IP数据报不正确,丢弃后返回 ICMP IP头部参数错误。
    发送失败后,通知上层协议失败,不会重试,所以使用 IP 协议的上层协议(TCP 协议)需要自己实现数据确认、超时重传。

2.2 IPV4 头部

2.2.1 IPV4 头部结构

file

  • 4位版本号 指定 IP 协议版本, IPV4 为 4 ,其他扩展协议 SIP PIP 不同版本号
  • 头部长度: 标识该 IP 头部有多少个 32 bit 字(4字节) 4 位最大表示 15,则 IP 头部最长 60 字节
  • Type of Service, 3位优先权字段(忽略)、4位 TOS 字段、1位为零保留字段。
    4 位 TOS 含义:
    最小延时
    最大吞吐量
    最高可靠性
    最小费用

    如 ssh telnet 登录程序需要最小延时服务,而 ftp 需要最大吞吐量服务。 这4个字段,最多一个能置为1.

  • 16位总长度: 整个IP 数据报的长度,以字节位单位,因此最长长度 2^16 -1 ,但由于 MTU 的数据报分片传输,所以远远没有达到最大值。
  • 16位标识: 唯一的标识主机发送的每一个数据报。初始值系统随机生成,每次加一
  • 3位标志: 第一位保留。第二位标识禁止分片,如果设置,则 IP 模块不对数据分片,但是如果超过 MTU限制,则 IP 模块丢弃数据,返回 ICMP 差错。 第三位 标识更多分片,除了数据报最后一个分片,其他分片都是 1.
  • 13 位分片偏移: 分片相对原始 IP数据报开始(仅数据部分)的偏移,实际偏移值是 该值左移3位(乘8)。因此除了最后一个 IP 分片,其他部分长度必须是 8 的整数倍,以保证后面 IP 部分拥有合适的偏移值。
  • 8位生存时间:Time To Live 数据报到达目的地之前允许经过的路由器跳数,常设64,如果 TTL 减到 0,路由器丢弃数据报,发送 ICMP 差错报文。放置数据路由循环
  • 8位协议:区分上层协议 ICMP 1, TCP 6 UDP 17
  • 16 位头部校验和: 发送端填充,接收端使用 CRC 算法检验 IP数据报 头部是否顺坏。
  • 32 位源端 IP地址 和目的端 IP 地址,标识据报的发送端和接收端。一般情况下 保持不变。
  • 变长可选信息: 最多40字节。IP头部最长 60字节(包括20字节固定部分)。(很少被使用,参考 RFC1393 文档)
    可用 IP选项包括:
    记录路由:告诉数据报途径的所有路由器将自己 IP 地址填入 IP 头部
    时间戳:告诉每个路由器将数据报被转发时间(或时间与 IP地址对)填入 IP头部
    松散源路由选择: 指定一个路由器 IP地址列表,数据报发送过程中必须经过其中路由器
    严格源路由选择: 数据报只能经过被指定的路由器

2.2.2 使用 tcpdump 观察 IPV4 头部结构

sudo tcpdump -ntx -i lo 抓取本地回路上数据包

2.3 IP 分片

当IP 数据报长度超过 帧的 MTU 时,将被分片传输。

只有在最终的目标机器上,分片被内核中的 IP 模块重新组装。在 IP 头部中:数据报标识、标志、片偏移 用以给 IP的分片和重组提供足够信息。一个 IP 数据报的每个分片都具有自己的 IP 头部,他们拒用相同标识值,具有不同片偏移,并且除最后一个分片外,其他分片都设置 MF 值,每个分片的 IP 头部总张都嫁给你被设置为该分片的长度。
以太网帧的 MTU 1500 字节。 因此 除 IP 头部 20字节外,最多 1480 字节的 IP 数据报,.

2.4 IP 路由

  IP 协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径。

2.4.1 IP 模块工作流程

file

  • 当IP 模块接受到来自数据链路层的 IP 数据报时, 首先 对数据报头部做 CRC 校验,之后分析头部具体信息
  • 如果该 IP 数据报头部设置了源站选路选项,则 IP 模块调用数据报转发子模块来处理该数据报
  • 如果该 IP 数据报头部中目标 IP 是本机,则根据数据报头部中的协议字段来决定将它派发给哪个上层应用,如果 IP 模块发现这个数据报不是发送给本机的,则也调用数据报转发子模块来处理该数据报。
  • 数据报转发子模块将首先检测系统是否允许转发,如果不允许,则将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给 IP 数据报输出子模块。
  • IP 数据报应该发送至哪个下一跳路由,以及经过哪个网卡来发送就是 IP 路由过程。IP模块实现数据报路由的核心数据结果是路由表。
  • IP 输出队列中存放的是所有等待发送的 IP 数据报,其中除了需要转发的 IP 数据报外,还包括封装了本机上层数据(ICMP 报文、TCP 报文段、UDP数据报)的 IP 数据报。

2.4.2 路由机制

可以使用 route netstat 查看路由表

file
在路由表中,第一项地址是 default ,即默认路由项。该项包含一个 “G” ,说明路由的下一跳是网关,其地址为 192.168.1.1。另外一个路由项的目标地址是 192.168.1.0 它是本地局域网,该路由项网关地址为 * ,说明数据报不需要路由中转,可以直接发送到目标机器。
IP 路由机制:

  • 查找路由表中和数据报 的目标 IP地址完全相同的主机 IP 地址,如果找到,使用该路由项,没找到则转2
  • 查找路由表中和数据报的目标 IP 地址具有相同网络 ID 的网络 IP地址(如 Gateway),如果找到,使用该路由项,没有转 3
  • 选择默认路由项,这通常意味着数据报的下一跳路由是网关。

所有发送到 IP 地址为 192.168.1.* 的机器的 IP 数据报都可以直接发送到目标机器(匹配路由表第二项),而所有访问因特网的请求都将通过网关来转发(匹配默认路由项)。

file

2.4.3 路由表更新

路由表必须能够更新,以反应网络连接的变化。这样 IP 模块才能准确、高效地转发数据报。

2.5 IP 转发

不是发送给本机的 IP 数据报将由数据报转发子模块来处理。 

路由器都能执行数据报的转发操作,而主机一般只能发送和接受数据报,因为主机上 /proc/sys/net/ipv4/ip_forward 内核参数默认设置 0,我么可以修改 它来使主机的数据报转发功能。
对于允许 IP 数据报转发的系统 ,数据报转发子模块将对期望转发的数据报执行:

  • 检测数据报头部 TTL 值,如果为0,则丢弃该数据报
  • 查看数据报头部的严格源路由选项标志,如果被设置。则检测数据报的目标IP地址是否是本机的某个 IP 地址,如果不是 则发送 ICMP 源站选路失败报文给发送端/
  • 如果有必要,则给源发送一个 ICMP 重定向报文,以告诉它一个更合理的下一跳路由器。
  • 将 TTL 减 1
  • 处理 IP 头部选项
  • 如果有必要,则执行 IP 分片操作。

2.6 重定向 (ICMP 重定向)

file
ICMP 重定向报文的类型值为5,代码字段有 4 个可选值,用来区分不同的重定向类型,主机重定向为 1.

ICMP重定向报文的数据部分很明确:

  • 引起重定向的 IP数据报(即图中 原始 IP数据报) 的源端 IP 地址。
  • 应该使用的路由器 IP 地址

接受主机根据这两个信息就可以断定引起重定向的IP 数据报应该使用哪个路由器来转发,并且更新路由表(通常更新路由表缓冲)
/proc/sys/net/ipv4/conf/all/send_redirects 内核参数指定是否允许发送 ICMP 重定向报文
/proc/sys/net/ipv4/conf/all/accept_redirects 内核参数指定是否允许节后首 ICMP重定向报文。

一般来说, 主机只能接受 ICMP 重定向报文,而路由器只能发送 ICMP 重定向报文。

2.6.2 主机重定向实例

2.7 IPv6 头部结构

IPv6 解决了 IPv4 地址不够用的问题,
增加了多播和流的功能,为网络上多媒体内容的质量提供精细的控制,
引入自动配置功能,使局域网管理更方便,
增加了专门的网络安全功能等。

2.7.1 IPv6 固定头部结构

IPv6 头部由 40 字节的固定头部和可变长的扩展头部组成。

file

  • 4 位版本号 指定 IP 协议的版本,对于 IPv6 来说,值为 6
  • 8位通信类型:执行数据流通信类型或优先级,和 IPv4 中的 TOS 累屎
  • 20 位流标签:新增字段,用于某些对连接的服务质量有特殊要求的通信,比如音频或者视频等实时数据传输
  • 16位净荷长度: IPv6 扩展头部和应用程序数据长度之和,不包括固定头部长度
  • 8 位下一个包头: 指出紧跟IPv6 固定头部后的包头类型,如扩展头或某个上协议头(如TCP UDP ICMP ),类似于IPv4头部中的协议字段,且相同的取值有相同的含义。
  • 8 位跳数限制 和IPv4 中 TTL 含义相同
  • IPv6 用 128 位(16字节)来表示 IP 地址,使 IP 地址的总量达到了 2^128 个。

2.7.2 IPv6 扩展头部

可变长的扩展头部,使得 IPv6 能支持更多选项,长度可以为 0 。
一个数据报可以包含多个扩展头部,每个扩展头部的类型由前一个头部中的下一个报头字段指定。

可以使用的扩展头部:
file

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!