UNP_27_IP选项
27.1 概述
IPv4 允许在 20 字节首部固定部分之后跟最多 40 个字节的选项。尽管已经定义的 IPv4 选项共有 10 种,常用的确实源路径选项。这些选项访问途径是存取 IP_OPTIONS 套接字选项。
IPv6 允许在固定长度的 40 字节 IPv6 首部和传输层首部之间出现扩展首部。目前定义了 6 种不同的扩展首部。不同于 Ipv4 的是,IPv6 扩展首部的访问途径是函数接口。
27.2 ipv4 选项
IP首部 4 位的头部长度把 IPv4 的首部总长度限制在了 60 字节,因此 IPv4 选项字段最长位 40 字节,IPv4 定义了 10 种选项(其中作废的 3 种不列举):
- NOP:单字节选项,典型的用途是为某个后续选项落在 4 字节边界上进行填充
- EOL:单字节选项,终止选项的处理
- LSRR
- SSRR
- Timestamp
- Record route
- Router alert:包含该选项的 IP 数据报要求所有转发路由器都查看内容
读取和设置 IP 选项字段使用 getsockopt 和 setsockopt。这两个函数的第四个参数是指向某个缓冲区的一个指针,第五个参数是缓冲区的大小。
使用 setsockopt 设置 IP 选项之后,在相应套接字上发送的所有 IP 数据报都将包含这些选项。可以在其上设置 IP 选项的套接字包括 TCP,UDP 和原始 IP 套接字。清楚这些选项也是用 setsockopt,只是把第四个参数置为空指针,第五个参数置为 0.
27.3 ipv4 源路径选项
源路径是由 IP 数据报的发送者指定的一个 IP 地址列表。如果源路径是严格的,那么数据报必须且只能逐一经过所有的节点。也就是说源路径中的所有节点必须前后为邻居。如果源路径是宽松的,那么数据报必须注意经过所有的节点,不过也可以经过未列在源路径中的其他节点。
IPv4源路径称为源和记录路径(source and record route, SRR),宽松源路径选项称为LSRR,严格源路径选项称为SSRR,原因是当数据报穿过所列的全部节点到来时,每个节点都将自己的所列地址替换为自己的外出接口地址。这允许接收者将新的列表倒序以沿逆向的路径回到发送者。这两个源路径的例子以及相应的tcpdump输出在TCPv1的8.5节
27.4 ipv6 扩展首部
IPv6 首部可以后跟如下几种可选的扩展首部:
- 步跳选项
- 目的地选项
- 路径首部
- 分片首部:完全由内核处理
- 认证首部
- 安全净荷封装
27.5 ipv6 步跳选项和目的地选项
步跳选项和目的地选项有类似的格式,
27.6 ipv6 路由首部
27.7 ipv6 粘附选项
有 7 种可以使用 sendmsg 和 recvmsg 发送和接受的辅助数据对象:
- IPv6 分组信息:in6_pktinfo 结构或者包含目的地址和外出接口索引,或者包含源地址和到达接口索引。
- 外出跳限或接收跳限
- 下一跳地址
- 外出流通类别或接收流通类别
- 步跳选项
- 目的地选项
- 路由首部
如果这些辅助数据对象各自有单个值将应用于从某个套接字发送的所有分组,那么我们不必每次调用 sendmsg 时都发送它们,而是代之以设置相应的套接字选项。这些套接字选项所用常值与辅助数据对象一致,也就是说调用 setsockopt 的级别参数总是 IPPROTO_IPV6