IP - Linux手册页

Linux程序员手册 第7部分
更新日期: 2020-06-09

说明

Linux实现了RFC 791和RFC 1122中描述的Internet协议版本4。ip包含一个符合RFC 1112的2级多播实现。它还包含一个具有包过滤器的IP路由器。

编程接口与BSD套接字兼容。有关套接字的更多信息,请参见socket(7)。

IP套接字是使用socket(2)创建的:

套接字(AF_INET,socket_type,协议);

有效的套接字类型包括:SOCK_STREAM打开流套接字; SOCK_DGRAM打开数据报套接字; SOCK_RAW打开raw(7)套接字以直接访问IP协议。

protocol是IP报头中要接收或发送的IP协议。协议的有效值包括:

*
0和IPPROTO_TCP用于tcp(7)流套接字;
*
0和IPPROTO_UDP用于udp(7)数据报套接字;
*
用于sctp(7)流套接字的IPPROTO_SCTP;和
*
udplite(7)数据报套接字的IPPROTO_UDPLITE。

对于SOCK_RAW,您可以指定在RFC 1700分配的编号中定义的有效IANA IP协议。

当进程想要接收新的传入数据包或连接时,应使用bind(2)将套接字绑定到本地接口地址。在这种情况下,任何给定的本地(地址,端口)对都只能绑定一个IP套接字。在bind调用中指定INADDR_ANY时,套接字将绑定到所有本地接口。在未绑定的套接字上调用listen(2)时,该套接字会自动绑定到本地地址设置为INADDR_ANY的随机空闲端口。在未绑定的套接字上调用connect(2)时,该套接字会自动绑定到随机空闲端口或本地地址设置为INADDR_ANY的可用共享端口。

除非已设置SO_REUSEADDR标志,否则关闭后的一段时间内,已绑定的TCP本地套接字地址不可用。使用此标志时应小心,因为它会使TCP可靠性降低。

Address format

IP套接字地址定义为IP接口地址和16位端口号的组合。基本IP协议不提供端口号,而是由更高级别的协议(如udp(7)和tcp(7))实现的。在原始套接字上,将sin_port设置为IP协议。

struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

/* Internet address. */
struct in_addr {
    uint32_t       s_addr;     /* address in network byte order */
};

sin_family始终设置为AF_INET。这是必需的;在Linux 2.2中,缺少此设置时,大多数联网功能都会返回EINVAL。 sin_port包含网络字节顺序的端口。低于1024的端口号称为特权端口(有时也称为保留端口)。只有特权进程(在Linux上:在管理其网络名称空间的用户名称空间中具有CAP_NET_BIND_SERVICE功能的进程)可以绑定(2)到这些套接字。请注意,这样的原始IPv4协议没有端口的概念,它们仅由更高的协议(如tcp(7)和udp(7))实现。

sin_addr是IP主机地址。 struct in_addr的s_addr成员包含网络字节顺序的主机接口地址。应该使用htonl(3)为in_addr分配INADDR_ *值之一(例如INADDR_LOOPBACK),或者使用inet_aton(3),inet_addr(3),inet_makeaddr(3)库函数或直接使用名称解析器来设置in_addr(请参见gethostbyname( 3))。

IPv4地址分为单播,广播和多播地址。单播地址指定主机的单个接口,广播地址指定网络上的所有主机,多播地址寻址多播组中的所有主机。仅当设置了SO_BROADCAST套接字标志时,才能发送或接收广播地址的数据报。在当前的实现中,面向连接的套接字只允许使用单播地址。

请注意,地址和端口始终以网络字节顺序存储。特别是,这意味着您需要在分配给端口的号码上调用htons(3)。标准库中的所有地址/端口操作功能均以网络字节顺序工作。

有几个特殊地址:INADDR_LOOPBACK(127.0.0.1)始终通过环回设备引用本地主机; INADDR_ANY(0.0.0.0)表示要绑定的任何地址; INADDR_BROADCAST(255.255.255.255)表示任何主机,并且由于历史原因,对绑定的作用与INADDR_ANY相同。

Socket options

IP支持某些特定于协议的套接字选项,这些选项可以通过setsockopt(2)进行设置,并可以通过getsockopt(2)进行读取。 IP的套接字选项级别为IPPROTO_IP。布尔整数标志为false时为零,否则为true。

当指定了无效的套接字选项时,getsockopt(2)和setsockopt(2)失败,并显示错误ENOPROTOOPT。

IP_ADD_MEMBERSHIP(since Linux 1.2)
加入组播组。参数是ip_mreqn结构。
struct ip_mreqn {
    struct in_addr imr_multiaddr; /* IP multicast group
                                     address */
    struct in_addr imr_address;   /* IP address of local
                                     interface */
    int            imr_ifindex;   /* interface index */
};

imr_multiaddr包含应用程序要加入或离开的多播组的地址。它必须是一个有效的多播地址(或setsockopt(2)失败,并显示错误EINVAL)。 imr_address是系统应加入多播组的本地接口的地址;如果等于INADDR_ANY,则系统选择适当的接口。 imr_ifindex是应该加入/离开imr_multiaddr组的接口的接口索引,或者0表示任何接口。

ip_mreqn结构仅从Linux 2.2开始可用。为了兼容,仍然支持旧的ip_mreq结构(从Linux 1.2开始存在)。它与ip_mreqn的不同之处仅在于不包括imr_ifindex字段。 (内核根据optlen中传递的大小确定要传递的结构。)
IP_ADD_MEMBERSHIP仅对setsockopt(2)有效。
IP_ADD_SOURCE_MEMBERSHIP(since Linux 2.4.22 / 2.5.68)
加入多播组,并仅允许从指定源接收数据。参数是ip_mreq_source结构。
struct ip_mreq_source {
    struct in_addr imr_multiaddr;  /* IP multicast group
                                      address */
    struct in_addr imr_interface;  /* IP address of local
                                      interface */
    struct in_addr imr_sourceaddr; /* IP address of
                                      multicast source */
};

ip_mreq_source结构类似于IP_ADD_MEMBERSHIP下描述的ip_mreqn。 imr_multiaddr字段包含应用程序要加入或离开的多播组的地址。 imr_interface字段是系统应加入多播组的本地接口的地址。最后,imr_sourceaddr字段包含应用程序要从中接收数据的源地址。

可以多次使用此选项,以允许从多个来源接收数据。
IP_BIND_ADDRESS_NO_PORT(since Linux 4.2)
通知内核在使用端口号为0的bind(2)时不保留临时端口。稍后,该端口将在connect(2)时自动选择,其方式是只要共享源端口4元组是唯一的。
IP_BLOCK_SOURCE(since Linux 2.4.22 / 2.5.68)
停止从给定组中的特定来源接收多播数据。仅在应用程序已使用IP_ADD_MEMBERSHIP或IP_ADD_SOURCE_MEMBERSHIP订阅了多播组之后,此设置才有效。
参数是IP_ADD_SOURCE_MEMBERSHIP下描述的ip_mreq_source结构。
IP_DROP_MEMBERSHIP(since Linux 1.2)
离开多播组。参数是类似于IP_ADD_MEMBERSHIP的ip_mreqn或ip_mreq结构。
IP_DROP_SOURCE_MEMBERSHIP(since Linux 2.4.22 / 2.5.68)
保留特定于源的组-即,停止接收来自给定源的给定多播组的数据。如果应用程序已订阅了同一组中的多个源,则仍将传递其余源中的数据。要停止一次从所有来源接收数据,请使用IP_DROP_MEMBERSHIP。
参数是IP_ADD_SOURCE_MEMBERSHIP下描述的ip_mreq_source结构。
IP_FREEBIND(since Linux 2.4)
如果启用,则此布尔选项允许绑定到非本地或尚不存在的IP地址。这允许侦听套接字,而无需底层网络接口或指定的动态IP地址在应用程序尝试绑定到套接字时启动。该选项与下面描述的ip_nonlocal_bind / proc接口的按套接字等效。
IP_HDRINCL(since Linux 2.0)
如果启用,则用户在用户数据之前提供IP标头。仅对SOCK_RAW套接字有效;有关更多信息,请参见raw(7)。启用此标志后,将忽略IP_OPTIONS,IP_TTL和IP_TOS设置的值。
IP_MSFILTER(since Linux 2.4.22 / 2.5.68)
此选项提供对高级全状态过滤API的访问。参数是ip_msfilter结构。
struct ip_msfilter {
    struct in_addr imsf_multiaddr; /* IP multicast group
                                      address */
    struct in_addr imsf_interface; /* IP address of local
                                      interface */
    uint32_t       imsf_fmode;     /* Filter-mode */
uint32_t       imsf_numsrc;    /* Number of sources in
                                  the following array */
struct in_addr imsf_slist[1];  /* Array of source
                                  addresses */

};

有两个宏,MCAST_INCLUDE和MCAST_EXCLUDE,可用于指定过滤模式。此外,还存在IP_MSFILTER_SIZE(n)宏来确定需要多少内存来存储ip_msfilter结构以及源列表中的n个源。

有关多播源过滤的完整说明,请参阅RFC 3376。
IP_MTU(since Linux 2.2)
检索当前套接字的当前已知路径MTU。返回一个整数。
IP_MTU仅对getsockopt(2)有效,并且仅在连接套接字后才能使用。
IP_MTU_DISCOVER(since Linux 2.2)
设置或接收套接字的"路径MTU发现"设置。启用后,Linux将在SOCK_STREAM套接字上执行RFC 1119中定义的路径MTU发现。对于非SOCK_STREAM套接字,IP_PMTUDISC_DO强制在所有传出数据包上设置"不分段"标志。用户有责任将数据打包成MTU大小的块,并在必要时进行重新传输。内核将拒绝(使用EMSGSIZE)大于已知路径MTU的数据报。如果需要,IP_PMTUDISC_WANT将根据路径MTU对数据报进行分段,否则将设置"不分段"标志。
The system-wide default can be toggled between IP_PMTUDISC_WANT

and
IP_PMTUDISC_DONT

by writing (respectively, zero and nonzero values) to the
/proc/sys/net/ipv4/ip_no_pmtu_disc

file.

Path MTU discovery valueMeaning
IP_PMTUDISC_WANTUse per-route settings.
IP_PMTUDISC_DONTNever do Path MTU Discovery.
IP_PMTUDISC_DOAlways do Path MTU Discovery.
IP_PMTUDISC_PROBESet DF but ignore Path MTU.

启用PMTU发现后,内核会自动跟踪每个目标主机的路径MTU。当使用connect(2)将其连接到特定对等方时,可以使用IP_MTU套接字选项方便地检索当前已知的路径MTU(例如,在发生EMSGSIZE错误之后)。路径MTU可能会随时间变化。对于具有多个目标的无连接套接字,也可以使用错误队列访问给定目标的新MTU(请参阅IP_RECVERR)。对于每个传入的MTU更新,新错误将排队。

在进行MTU发现时,可能会丢弃来自数据报套接字的初始数据包。使用UDP的应用程序应该意识到这一点,而不应将其数据包重传策略考虑在内。
要在未连接的套接字上引导路径MTU发现过程,可以从较大的数据报大小开始(报头最大为64 KB),然后通过更新路径MTU使其收缩。
要获得路径MTU的初始估计,请使用connect(2)将数据报套接字连接到目标地址,并通过使用IP_MTU选项调用getsockopt(2)来检索MTU。
通过设置IP_PMTUDISC_PROBE的值(从Linux 2.6.22开始可用),可以使用SOCK_DGRAM或SOCK_RAW套接字实现RFC 4821 MTU探测。这对于希望故意发送大于观察到的路径MTU的探测数据包的诊断工具(例如tracepath(8))尤其有用。
IP_MULTICAST_ALL(since Linux 2.6.31)
此选项可用于修改将多播消息传递到绑定到通配符INADDR_ANY地址的套接字的传递策略。参数是一个布尔整数(默认为1)。如果设置为1,套接字将从整个系统上全局加入的所有组接收消息。否则,它将仅从已在此特定套接字上显式加入的组(例如,通过IP_ADD_MEMBERSHIP选项)传递消息。
IP_MULTICAST_IF(since Linux 1.2)
为多播套接字设置本地设备。 setsockopt(2)的参数是类似于IP_ADD_MEMBERSHIP的ip_mreqn或(自Linux 3.5起)ip_mreq结构或in_addr结构。 (内核根据optlen中传递的大小确定要传递的结构。)对于getsockopt(2),参数是in_addr结构。
IP_MULTICAST_LOOP(since Linux 1.2)
设置或读取一个布尔整数参数,该参数确定是否应将发送的多播数据包循环回本地套接字。
IP_MULTICAST_TTL(since Linux 1.2)
设置或读取此套接字的传出多播数据包的生存时间值。对于组播数据包来说,设置尽可能小的TTL是非常重要的。默认值为1,这意味着除非用户程序明确请求,否则组播数据包不会离开本地网络。参数是整数。
IP_NODEFRAG(since Linux 2.6.36)
如果启用(参数为非零),则在netfilter层中禁用输出数据包的重组。参数是整数。
此选项仅对SOCK_RAW套接字有效。
IP_OPTIONS(since Linux 2.0)
设置或获取与该套接字中的每个数据包一起发送的IP选项。参数是指向包含选项和选项长度的内存缓冲区的指针。 setsockopt(2)调用设置与套接字关联的IP选项。 IPv4的最大选项大小为40个字节。有关允许的选项,请参阅RFC 791。当SOCK_STREAM套接字的初始连接请求数据包包含IP选项时,IP选项将自动设置为初始数据包中的选项,且路由头相反。建立连接后,不允许传入的数据包更改选项。默认情况下,所有传入源路由选项的处理都是禁用的,并且可以使用accept_source_route / proc接口启用。时间戳等其他选项仍会处理。对于数据报套接字,IP选项只能由本地用户设置。使用IP_OPTIONS调用getsockopt(2)会将用于发送的当前IP选项放入提供的缓冲区中。
IP_PKTINFO(since Linux 2.2)
传递一个IP_PKTINFO辅助消息,该消息包含一个pktinfo结构,该结构提供有关传入数据包的一些信息。这仅适用于面向数据报的套接字。该参数是一个标志,告诉套接字是否应传递IP_PKTINFO消息。只能使用recvmsg(2)或sendmsg(2)将消息本身作为带有包的数据包作为控制消息进行发送/检索。
struct in_pktinfo {
    unsigned int   ipi_ifindex;  /* Interface index */
    struct in_addr ipi_spec_dst; /* Local address */
    struct in_addr ipi_addr;     /* Header Destination
                                    address */
};
ipi_ifindex是接收数据包的接口的唯一索引。 ipi_spec_dst是数据包的本地地址,而ipi_addr是数据包标头中的目标地址。如果将IP_PKTINFO传递给sendmsg(2)并且ipi_spec_dst不为零,则它将用作路由表查找和设置IP源路由选项的本地源地址。当ipi_ifindex不为零时,索引指定的接口的主要本地地址将覆盖ipi_spec_dst,以进行路由表查找。
IP_RECVERR(since Linux 2.2)
启用扩展的可靠错误消息传递。在数据报套接字上启用后,所有生成的错误将在每个套接字的错误队列中排队。当用户从套接字操作中收到错误时,可以通过设置MSG_ERRQUEUE标志的调用recvmsg(2)来接收错误。描述错误的sock_extended_err结构将在附带消息中传递,该消息的类型为IP_RECVERR,级别为IPPROTO_IP。这对于在未连接的套接字上进行可靠的错误处理很有用。错误队列的接收数据部分包含错误数据包。
IP_RECVERR控制消息包含sock_extended_err结构:
#define SO_EE_ORoirN_NONE    0
#define SO_EE_ORoirN_LOCAL   1
#define SO_EE_ORoirN_ICMP    2
#define SO_EE_ORoirN_ICMP6   3

struct sock_extended_err {
    uint32_t ee_errno;   /* error number */
    uint8_t  ee_oroirn;  /* where the error oroirnated */
    uint8_t  ee_type;    /* type */
    uint8_t  ee_code;    /* code */
    uint8_t  ee_pad;
    uint32_t ee_info;    /* additional information */
    uint32_t ee_data;    /* other data */
    /* More data may follow */
};

struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
ee_errno包含排队的错误的错误号。 ee_oroirn是错误起源的原始代码。其他字段是特定于协议的。宏SO_EE_OFFENDER返回一个指针,该指针指向网络对象的地址,错误的源于给定的辅助消息指针。如果该地址未知,则sockaddr的sa_family成员包含AF_UNSPEC,并且sockaddr的其他字段未定义。
IP使用sock_extended_err结构,如下所示:对于作为ICMP数据包接收到的错误,ee_oroirn设置为SO_EE_ORoirN_ICMP,对于本地生成的错误,设置为SO_EE_ORoirN_LOCAL。未知值应忽略。 ee_type和ee_code是从ICMP标头的类型和代码字段中设置的。 ee_info包含发现的EMSGSIZE错误的MTU。该消息还包含导致错误的节点的sockaddr_in,可以使用SO_EE_OFFENDER宏进行访问。当来源未知时,SO_EE_OFFENDER地址的sin_family字段为AF_UNSPEC。当错误源自网络时,套接字上启用并包含在错误数据包中的所有IP选项(IP_OPTIONS,IP_TTL等)将作为控制消息传递。导致错误的数据包的有效负载作为常规有效负载返回。请注意,TCP没有错误队列。在SOCK_STREAM套接字上不允许使用MSG_ERRQUEUE。 IP_RECVERR对TCP有效,但是所有错误都仅由套接字函数return或SO_ERROR返回。
对于原始套接字,IP_RECVERR允许将所有收到的ICMP错误传递给应用程序,否则仅在连接的套接字上报告错误
它设置或检索整数布尔标志。 IP_RECVERR默认为关闭。
IP_RECVOPTS(since Linux 2.2)
在IP_OPTIONS控制消息中将所有传入的IP选项传递给用户。路由标头和其他选项已为本地主机填写。 SOCK_STREAM套接字不支持。
IP_RECVORIGDSTADDR(since Linux 2.6.29)
该布尔选项启用recvmsg(2)中的IP_ORIGDSTADDR辅助消息,其中内核返回所接收数据报的原始目标地址。辅助消息包含一个结构sockaddr_in。
IP_RECVTOS(since Linux 2.2)
如果启用,则将IP_TOS辅助消息与传入数据包一起传递。它包含一个字节,用于指定数据包报头的"服务类型/优先级"字段。需要一个布尔整数标志。
IP_RECVTTL(since Linux 2.2)
设置此标志后,传递IP_TTL控制消息,并将接收到的数据包的生存时间字段作为32位整数。 SOCK_STREAM套接字不支持。
IP_RETOPTS(since Linux 2.2)
与IP_RECVOPTS相同,但是返回未处理的原始未处理选项,其时间戳和路由记录选项未为此跃点填充。
IP_ROUTER_ALERT(since Linux 2.2)
将设置了" IP路由器警报"选项的所有待转发数据包传递到此套接字。仅对原始套接字有效。例如,这对于用户空间RSVP守护程序很有用。被窃听的数据包不被内核转发;用户有责任再次将其发送出去。套接字绑定将被忽略,此类数据包仅按协议进行过滤。需要一个整数标志。
IP_TOS(since Linux 1.0)
设置或接收与源自此套接字的每个IP数据包一起发送的服务类型(TOS)字段。它用于对网络上的数据包进行优先级排序。 TOS是一个字节。定义了一些标准的TOS标志:IPTOS_LOWDELAY以最小化交互式通信的延迟,IPTOS_THROUGHPUT以优化吞吐量,IPTOS_RELIABILITY以优化可靠性,IPTOS_MINCOST应该用于"填充数据",其中慢速传输无关紧要。最多可以指定这些TOS值之一。其他位无效,应清除。默认情况下,Linux首先发送IPTOS_LOWDELAY数据报,但是确切的行为取决于配置的排队规则。某些高优先级级别可能需要超级用户特权(CAP_NET_ADMIN功能)。
IP_TRANSPARENT(since Linux 2.6.24)
设置此布尔选项将启用此套接字上的透明代理。此套接字选项允许调用的应用程序绑定到非本地IP地址,并以外部地址作为本地端点作为客户端和服务器运行。注意:这要求设置路由,以便通过TProxy框(即托管使用IP_TRANSPARENT套接字选项的应用程序的系统)路由去往外部地址的数据包。启用此套接字选项需要超级用户特权(CAP_NET_ADMIN功能)。
使用iptables TPROXY目标进行TProxy重定向还要求在重定向套接字上设置此选项。
IP_TTL(since Linux 1.0)
设置或检索从此套接字发送的每个数据包中使用的当前生存时间字段。
IP_UNBLOCK_SOURCE(since Linux 2.4.22 / 2.5.68)
取消阻止以前阻止的多播源。当未阻止给定源时,返回EADDRNOTAVAIL。
参数是IP_ADD_SOURCE_MEMBERSHIP下描述的ip_mreq_source结构。

/proc interfaces

IP协议支持一组/ proc接口来配置一些全局参数。可以通过在目录/ proc / sys / net / ipv4 /中读取或写入文件来访问参数。描述为布尔值的接口采用整数值,其中非零值(" true")表示启用相应的选项,而零值(" false")表示禁用该选项。

ip_always_defrag(Boolean; since Linux 2.2.13)
[内核2.2.13的新功能;在早期的内核版本中,此功能是在编译时由CONFIG_IP_ALWAYS_DEFRAG选项控制的;此选项在2.4.x及更高版本中不存在]
启用此布尔值标志(不等于0)时,传入的碎片(IP数据包的一部分,当源和目标之间的某个主机确定数据包太大并将它们切成碎片时出现)将在处理之前重新组装(碎片整理) ,即使它们即将被转发。
仅在运行防火墙(它是唯一链接到网络的防火墙)或透明代理时才启用;永远不要将其用于普通路由器或主机。否则,如果碎片通过不同的链路传输,则会打乱碎片通信。碎片整理还具有较大的内存和CPU时间成本。
配置伪装或透明代理时,该功能会自动打开。
ip_autoconfig(since Linux 2.2 to 2.6.17)
没有记录。
ip_default_ttl(integer; default: 64; since Linux 2.2)
设置传出数据包的默认生存时间值。可以使用IP_TTL选项针对每个套接字更改此设置。
ip_dynaddr(Boolean; default: disabled; since Linux 2.0.31)
在接口地址更改时启用动态套接字地址和伪装条目重写。这对于更改IP地址的拨号接口很有用。 0表示不重写,1表示不重写,2表示详细模式。
ip_forward(Boolean; default: disabled; since Linux 1.2)
使用布尔标志启用IP转发。 IP转发也可以基于每个接口进行设置。
ip_local_port_range(since Linux 2.2)

This file contains two integers that define the default local port range
allocated to sockets that are not explicitly bound to a port number---that
is, the range used for
ephemeral ports.

An ephemeral port is allocated to a socket in the following circumstances:

*
调用bind(2)时,套接字地址中的端口号指定为0;
*
在以前未绑定的流套接字上调用listen(2);
*
在以前未绑定的套接字上调用了connect(2);
*
在先前未绑定的数据报套接字上调用sendto(2)。
临时端口的分配以ip_local_port_range中的第一个数字开始,以第二个数字结束。如果临时端口的范围已用尽,则相关的系统调用将返回错误(但请参阅BUGS)。
请注意,ip_local_port_range中的端口范围不应与伪装所使用的端口相冲突(尽管情况已得到处理)。同样,任意选择可能会导致某些防火墙数据包筛选器出现问题,这些筛选器会对使用的本地端口进行假设。第一个数字应至少大于1024,或者更好,大于4096,以避免与众所周知的端口冲突并最大程度地减少防火墙问题。
ip_no_pmtu_disc(Boolean; default: disabled; since Linux 2.2)
如果启用,默认情况下不要对TCP套接字执行"路径MTU发现"。如果路径上配置错误的防火墙(丢弃所有ICMP数据包)或接口配置错误(例如,两端之间在MTU不一致的点对点链接),路径MTU发现可能会失败。最好在路径上修复损坏的路由器,而不是在全局范围内关闭路径MTU发现,因为不这样做会给网络带来高昂的成本。
ip_nonlocal_bind(Boolean; default: disabled; since Linux 2.4)
如果设置,则允许进程将(2)绑定到非本地IP地址,这可能非常有用,但可能会破坏某些应用程序。
ip6frag_time(integer; default: 30)
将IPv6片段保留在内存中的时间(以秒为单位)。
ip6frag_secret_interval(integer; default: 600)
IPv6片段的哈希秘密(或哈希秘密的生存期)的重新生成间隔(以秒为单位)。
ipfrag_high_thresh(integer), ipfrag_low_thresh(integer)
如果排队的IP片段的数量达到ipfrag_high_thresh,则将该队列缩减为ipfrag_low_thresh。包含一个带有字节数的整数。
neigh/*
参见arp(7)。

Ioctls

socket(7)中描述的所有ioctl都适用于ip。

netdevice(7)中描述了用于配置通用设备参数的Ioctl。

语法

#包括
#包括
#include / 上一个/的超集

tcp_socket =套接字(AF_INET,SOCK_STREAM,0);
udp_socket = socket(AF_INET,SOCK_DGRAM,0);
raw_socket =套接字(AF_INET,SOCK_RAW,协议);

错误说明

EACCES
用户试图在没有必要权限的情况下执行操作。这些步骤包括:在未设置SO_BROADCAST标志的情况下将数据包发送到广播地址;通过禁止路由发送分组;在没有超级用户特权的情况下修改防火墙设置(CAP_NET_ADMIN功能);绑定到没有超级用户特权(CAP_NET_BIND_SERVICE功能)的特权端口。
EADDRINUSE
试图绑定到已经使用的地址。
EADDRNOTAVAIL
请求了不存在的接口,或者请求的源地址不是本地的。
EAGAIN
在非阻塞套接字上的操作将阻塞。
EALREADY
非阻塞套接字上的连接操作已经在进行中。
ECONNABORTED
accept(2)期间关闭了连接。
EHOSTUNREACH
没有有效的路由表条目与目标地址匹配。此错误可能是由来自远程路由器的ICMP消息引起的,也可能是由本地路由表引起的。
EINVAL
传递了无效的参数。对于发送操作,这可能是由发送到黑洞路由引起的。
EISCONN
在已连接的套接字上调用connect(2)。
EMSGSIZE
数据报大于路径上的MTU,并且无法分段。
ENOBUFS, ENOMEM
可用内存不足。这通常意味着内存分配受套接字缓冲区限制(而不是系统内存)限制,但这不是100%一致的。
ENOENT
在没有数据包到达的套接字上调用了SIOCGSTAMP。
ENOPKG
未配置内核子系统。
ENOPROTOOPTand EOPNOTSUPP
传递了无效的套接字选项。
ENOTCONN
该操作仅在已连接的套接字上定义,但未连接该套接字。
EPERM
用户无权设置高优先级,更改配置或向请求的进程或组发送信号。
EPIPE
连接意外关闭或被另一端关闭。
ESOCKTNOSUPPORT
未配置套接字或请求了未知的套接字类型。

覆盖协议可能会产生其他错误;请参阅tcp(7),raw(7),udp(7)和socket(7)。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

备注

IP_FREEBINDIP_MSFILTERIP_MTUIP_MTU_DISCOVERIP_RECVORIGDSTADDRIP_PKTINFOIP_RECVERR,IP_ROUTER_ALERT和IP_TRANSPARENT是特定于Linux的。

使用SO_BROADCAST选项时要非常小心-在Linux中没有特权。粗心的广播很容易使网络过载。对于新的应用协议,最好使用多播组而不是广播。不鼓励广播。

其他一些BSD套接字实现提供IP_RCVDSTADDR和IP_RECVIF套接字选项,以获取目标地址和接收到的数据报的接口。 Linux对于同一任务具有更通用的IP_PKTINFO。

某些BSD套接字实现还提供IP_RECVTTL选项,但是IP_RECVTTL类型的辅助消息与传入的数据包一起传递。这与Linux中使用的IP_TTL选项不同。

使用SOL_IP套接字选项级别不可移植。基于BSD的堆栈使用IPPROTO_IP级别。

INADDR_ANY(0.0.0.0)和INADDR_BROADCAST(255.255.255.255)是字节顺序无关的。
这意味着htonl(3)对它们没有影响。

Compatibility

为了与Linux 2.0兼容,仍支持过时的套接字(AF_INET,SOCK_PACKET,协议)语法来打开packet(7)套接字。不建议使用此方法,而应使用套接字(AF_PACKET,SOCK_RAW,协议)代替。主要区别是用于通用链接层信息的新sockaddr_ll地址结构,而不是旧的sockaddr_pkt。

另外参见

recvmsg(2),sendmsg(2),byteorder(3),功能(7),icmp(7),ipv6(7),netdevice(7),netlink(7),raw(7),socket(7), tcp(7),udp(7),ip(8)

内核源文件Documentation / networking / ip-sysctl.txt。

原始IP规范的RFC 791。 RFC 1122适用于IPv4主机要求。 RFC 1812适用于IPv4路由器要求。

名称

ip-Linux IPv4协议实现

BUGS

错误值太多。

在可以分配临时端口的各个系统调用(connect(2),bind(2),listen(2),sendto(2))之间,用于诊断临时端口范围耗尽的错误有所不同。

没有介绍用于配置IP特定接口选项和ARP表的ioctl。

在某些2.2内核中,无法通过recvmsg(2)在msg_name中使用MSG_ERRQUEUE接收原始目标地址。

日期:2019-08-20 18:01:54 来源:oir作者:oir