UNP编程:23---套接字选项之(IPV4套接字选项:IPPROTO_IP)_首部

  • 这些套接字选项由IPv4处理,它们的级别(即getsockopt和setsockopt函数的第二个参 数)为IPPROTO_IP。我们把其中的多播套接字选项推迟到多播文章中再讨论
一、IP_HDRINCL
  • 如果本选项是给一个原始IP套接字设置的,那么我们必须为所有在该原始套接字上发送的数据报构造自己的IP首部。一般情况下,在原始套接字上发送的数据报其IP首部是 由内核构造的,不过有些应用程序(特别是路由跟踪程序traceroute)需要构造自己的IP首部 以取代IP置于该首部中的某些字段。
  • 当本选项开启时,我们构造完整的IP首部,不过下列情况例外:
    • IP总是计算并存储IP首部校验和
    • 如果我们将IP标识字段置为0,内核将设置该字段
    • 如果源IP地址是INADDR_ANY,IP将把它设置为外出接口的主IP地址
    • 如何设置IP选项取决于实现。有些实现取出我们预先使用IP_OPTIONS套接字选项设置 的任何IP选项,把它们添加到我们构造的首部中,而其他实现则要求我们亲自在首部指 定任何期望的IP选项
    • IP首部中有些字段必须以主机字节序填写,有些字段必须以网络字节序填写,具体取决 于实现。这使得利用本套接字选项编排原始分组的代码不像期待的那样便于移植
二、IP_OPTIONS
  • 本选项的设置允许我们在IPv4首部中设置IP选项。这要求我们熟悉IP首部中IP选项的格式
  • 我们将在后面文章讲述IPv4源路径时讨论这个选项
三、IP_RECVDSTADDR
  • 本套接字选项导致所收到UDP数据报的目的IP地址由recvmsg函数作为辅助数据返回

  • 我们将在后面文章给出本选项的一个例子

四、IP_RECVIF
  • 本套接字选项导致所收到UDP数据报的接收接口索引由recvmsg函数作为辅助数据返回
  • 我们将在后面文章给出本选项的一个例子
五、IP_TOS
  • 本套接字选项允许我们为TCP、UDP或SCTP套接字设置IP首部中的服务类型字段(图A-1, 该字段包含DSCP和ECN子字段)。如果我们给本选项调用getsockopt,那么用于放入外出IP数 据报首部的DSCP和ECN字段中的TOS当前值(默认为0)将返回。我们没有办法从接收到的IP 数据报中取得该值。
  • 应用进程可以把DSCP设置成用户和网络业务供应商预先协商好的某个值,以便接受预定的 服务,例如对IP电话的低延迟服务,对海量数据传送的高吞吐量服务。由RFC 2474[Nichols et al. 1998]定义的区分服务(diffserv)体系结构只是有限向后兼容历史性的TOS字段定义(RFC1349 [ Almquist 1992 ])。 把 IP_TOS设置成 中定义的某个 常 值(例如 IPTOS_LOWDELAY和IPTOS_THROUGHPUT)的应用程序应该改为使用由用户指定的某个DSCP值。 区分服务存留的TOS值只有优先权级别6(“internetwork control”,网间控制)和7(“network control”,网内控制),这意味着把IP_TOS设置成IPTOS_PREC_NETCONTROL或IPTOS_PREC_ INTERNETCONTROL的应用程序在区分服务网络中可以继续工作
  • RFC 3168[Ramakrishnan, Floyd, and Black 2001]中有ECN字段的定义。应用进程通常应 该把ECN字段的设置留给内核,也就是把由IP_TOS设置的值中的低两位指定为0
六、IP_TTL
  • 我们可以使用本选项设置或获取系统用在从某个给定套接字发送的单播分组上的默认TTL 值(图A-1)。(多播TTL值使用IP_MULTICAST_TTL套接字选项设置,见21.6节)例如4.4BSD 对TCP和UDP套接字使用的默认值都是64(这由IANA的“IP Option Numbers”注册处规定), 对原始套接字使用的默认值则是255。跟TOS字段一样,调用getsockopt返回的是系统将用于 外出数据报的字段的默认值。我们没有办法从接收到的IP数据报中取得该值。我们将在图28-19 所示的traceroute程序中设置本套接字选项