IPV6 - Linux手册页
Linux程序员手册 第7部分
更新日期: 2017-09-15
名称
ipv6-Linux IPv6协议实现
语法
#包括
#包括
tcp6_socket =套接字(AF_INET6,SOCK_STREAM,0);
raw6_socket =套接字(AF_INET6,SOCK_RAW,协议);
udp6_socket =套接字(AF_INET6,SOCK_DGRAM,协议);
说明
Linux 2.2可以选择实现Internet协议版本6。此手册页包含对Linux内核和glibc 2.1所实现的IPv6基本API的描述。该接口基于BSD套接字接口;参见套接字(7)。
IPv6 API旨在与IPv4 API大部分兼容(请参阅ip(7))。此手册页中仅描述了差异。
要将AF_INET6套接字绑定到任何进程,应从具有in6_addr类型的in6addr_any变量中复制本地地址。在静态初始化中,也可以使用IN6ADDR_ANY_INIT,并将其扩展为常量表达式。它们都以网络字节顺序排列。
IPv6环回地址(:: 1)在全局in6addr_loopback变量中可用。对于初始化,应使用IN6ADDR_LOOPBACK_INIT。
通过使用v4映射到v6的地址类型,可以使用v6 API处理IPv4连接。因此,程序仅需要支持此API类型即可支持这两种协议。这由C库中的地址处理功能透明地处理。
IPv4和IPv6共享本地端口空间。当您获得到IPv6套接字的IPv4连接或数据包时,其源地址将映射到v6,并将其映射到v6。
Address format
struct sockaddr_in6 { sa_family_t sin6_family; /* AF_INET6 */ in_port_t sin6_port; /* port number */ uint32_t sin6_flowinfo; /* IPv6 flow information */ struct in6_addr sin6_addr; /* IPv6 address */ uint32_t sin6_scope_id; /* Scope ID (new in 2.4) */ }; struct in6_addr { unsigned char s6_addr[16]; /* IPv6 address */ };
sin6_family始终设置为AF_INET6; sin6_port是协议端口(请参阅ip(7)中的sin_port); sin6_flowinfo是IPv6流标识符; sin6_addr是128位的IPv6地址。 sin6_scope_id是一个ID,具体取决于地址范围。它是Linux 2.4中的新功能。 Linux仅支持本地链接地址,在这种情况下,sin6_scope_id包含接口索引(请参见netdevice(7))
IPv6支持多种地址类型:单播可寻址单个主机,多播可寻址一组主机,任播可寻址一组主机的最近成员(在Linux中未实现),IPv4-on-IPv6寻址一个IPv4主机,和其他保留的地址类型。
IPv6的地址表示法是一组8个4位十六进制数字,用aq:aq分隔。 " ::"代表0位的字符串。特殊地址对于环回为:: 1,对于IPv4映射为IPv6为:: FFFF :。
IPv6的端口空间与IPv4共享。
Socket options
IPv6支持一些特定于协议的套接字选项,这些选项可以通过setsockopt(2)进行设置,并可以通过getsockopt(2)进行读取。 IPv6的套接字选项级别为IPPROTO_IPV6。布尔整数标志为false时为零,否则为true。
- IPV6_ADDRFORM
- 将AF_INET6套接字转换为其他地址族的套接字。目前仅支持AF_INET。仅对已连接并绑定到v4映射到v6地址的IPv6套接字允许使用。该参数是指向包含AF_INET的整数的指针。这对于将v4映射的套接字作为文件描述符传递给不知道如何处理IPv6 API的程序很有用。
- IPV6_ADD_MEMBERSHIP, IPV6_DROP_MEMBERSHIP
- 控制多播组中的成员资格。参数是指向ipv6_mreq结构的指针。
- IPV6_MTU
- getsockopt():检索当前套接字的当前已知路径MTU。仅在连接插座时有效。返回一个整数。
- setsockopt():设置要用于套接字的MTU。启用路径MTU发现后,MTU受设备MTU或路径MTU的限制。参数是一个指向整数的指针。
- IPV6_MTU_DISCOVER
- 控制套接字上的路径MTU发现。有关详细信息,请参见ip(7)中的IP_MTU_DISCOVER。
- IPV6_MULTICAST_HOPS
- 设置套接字的多播跃点限制。参数是一个指向整数的指针。值中的-1表示使用默认路由,否则应在0到255之间。
- IPV6_MULTICAST_IF
- 将设备设置为在套接字上发送多播数据包。这仅适用于SOCK_DGRAM和SOCK_RAW套接字。该参数是一个指向整数的接口索引的指针(请参见netdevice(7))。
- IPV6_MULTICAST_LOOP
- 控制套接字是否看到自己发送的多播数据包。参数是指向布尔值的指针。
- IPV6_RECVPKTINFO(since Linux 2.6.14)
- 设置对传入数据报的IPV6_PKTINFO控制消息的传递。根据RFC 3542,此类控制消息包含结构in6_pktinfo。仅适用于SOCK_DGRAM或SOCK_RAW套接字。参数是一个指向整数的布尔值的指针。
- IPV6_RTHDR,IPV6_AUTHHDR,IPV6_DSTOPTS,IPV6_HOPOPTS,IPV6_FLOWINFO,IPV6_HOPLIMIT为包含接收到的数据包的扩展头的传入数据报设置控制消息的传递。 IPV6_RTHDR提供路由标头,IPV6_AUTHHDR提供认证标头,IPV6_DSTOPTS提供目标选项,IPV6_HOPOPTS提供跳选项,IPV6_FLOWINFO提供包含流ID的整数,IPV6_HOPLIMIT提供包含分组跳数的整数。控制消息的类型与套接字选项的类型相同。通过将适当的控制消息放入sendmsg(2)的控制缓冲区中,还可以为传出数据包设置所有这些标头选项。仅允许用于SOCK_DGRAM或SOCK_RAW套接字。参数是指向布尔值的指针。
- IPV6_RECVERR
- 控制异步错误选项的接收。有关详细信息,请参见ip(7)中的IP_RECVERR。参数是指向布尔值的指针。
- IPV6_ROUTER_ALERT
- 将包含路由器警报逐跳选项的转发数据包传递到此套接字。仅允许用于SOCK_RAW套接字。窃听的数据包不会由内核转发,用户有责任再次将其发送出去。参数是一个指向整数的指针。正整数表示要拦截的路由器警报选项值。包含带有此整数值字段的路由器警报选项的数据包将被传递到套接字。负整数将禁用带有路由器警报选项的数据包向此套接字的传递。
- IPV6_UNICAST_HOPS
- 设置套接字的单播跳数限制。参数是一个指向整数的指针。值中的-1表示使用默认路由,否则应在0到255之间。
- IPV6_V6ONLY(since Linux 2.4.21 and 2.6)
- 如果此标志设置为true(非零),则套接字被限制为仅发送和接收IPv6数据包。在这种情况下,IPv4和IPv6应用程序可以同时绑定到单个端口。
- 如果此标志设置为false(零),则套接字可用于与IPv6地址或映射了IPv4的IPv6地址之间收发数据包。
- 参数是一个指向整数的布尔值的指针。
- 此标志的默认值由文件/ proc / sys / net / ipv6 / bindv6only的内容定义。该文件的默认值为0(假)。
错误说明
- ENODEV
- 用户试图将(2)绑定到本地链接的IPv6地址,但是提供的sockaddr_in6结构中的sin6_scope_id不是有效的接口索引。
版本
Linux 2.4将通过更改in6_addr的对齐方式并添加一个额外的sin6_scope_id字段来破坏64位主机的sockaddr_in6的二进制兼容性。内核接口保持兼容,但是包含sockaddr_in6或in6_addr到其他结构的程序可能不兼容。对于像i386这样的32位主机,这不是问题。
sin6_flowinfo字段是Linux 2.4中的新增功能。当传递的地址长度包含它时,它由内核透明地传递/读取。某些程序通过更长的地址缓冲区,然后检查传出地址的长度,可能会中断。
备注
sockaddr_in6结构比通用sockaddr大。假定所有地址类型都可以安全地存储在struct sockaddr中的程序需要更改为使用struct sockaddr_storage。
SOL_IP,SOL_IPV6,SOL_ICMPV6和其他SOL_ *套接字选项是IPPROTO_ *的非便携式变体。另请参见ip(7)。
BUGS
目前仅部分实现了RFC 2229中的IPv6扩展API;尽管2.2内核几乎完全支持接收选项,但是glibc 2.1中缺少用于生成IPv6选项的宏。
缺少对EH和AH标头的IPSec支持。
流标签管理不完整,此处未记录。
该手册页不完整。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。