INET6(4P) Protocols INET6(4P)
NAME
inet6 - Internet protocol family for Internet Protocol version 6
SYNOPSIS
#include <sys/types.h> #include <netinet/in.h>DESCRIPTION
The
inet6 protocol family implements a collection of protocols that are
centered around the Internet Protocol version 6 (
IPv6) and share a common
address format. The
inet6 protocol family can be accessed using the
socket interface, where it supports the
SOCK_STREAM,
SOCK_DGRAM, and
SOCK_RAW socket types, or the Transport Level Interface (
TLI), where it
supports the connectionless (
T_CLTS) and connection oriented
(
T_COTS_ORD) service types.
PROTOCOLS
The Internet protocol family for
IPv6 included the Internet Protocol
Version 6 (
IPv6), the Neighbor Discovery Protocol (
NDP), the Internet
Control Message Protocol (
ICMPv6), the Transmission Control Protocol
(
TCP), and the User Datagram Protocol (
UDP).
TCP supports the socket interface's
SOCK_STREAM abstraction and
TLI's
T_COTS_ORD service type.
UDP supports the
SOCK_DGRAM socket abstraction
and the
TLI T_CLTS service type. See
tcp(4P) and
udp(4P). A direct
interface to
IPv6 is available using the socket interface. See
ip6(4P).
ICMPv6 is used by the kernel to handle and report errors in protocol
processing. It is also accessible to user programs. See
icmp6(4P).
NDP is used to translate 128-bit
IPv6 addresses into 48-bit Ethernet
addresses.
IPv6 addresses come in three types: unicast, anycast, and multicast. A
unicast address is an identifier for a single network interface. An
anycast address is an identifier for a set of interfaces; a packet sent
to an anycast address is delivered to the "nearest" interface identified
by that address, pursuant to the routing protocol's measure of distance.
A multicast address is an identifier for a set of interfaces; a packet
sent to a multicast address is delivered to all interfaces identified by
that address. There are no broadcast addresses as such in
IPv6; their
functionality is superseded by multicast addresses.
For
IPv6 addresses, there are three scopes within which unicast addresses
are guaranteed to be unique. The scope is indicated by the address
prefix. The three varieties are link-local (the address is unique on that
physical link), site-local (the address is unique within that site), and
global (the address is globally unique).
The three highest order bits for global unicast addresses are set to
001. The ten highest order bits for site-local addresses are set to
1111 1110 11. The ten highest order bits for link-local addresses are set to
1111 1110 11. For multicast addresses, the eight highest order bits are
set to
1111 1111. Anycast addresses have the same format as unicast
addresses.
IPv6 addresses do not follow the concept of "address class" seen in
IP.
A global unicast address is divided into the following segments:
o The first three bits are the Format Prefix identifying a
unicast address.
o The next 13 bits are the Top-Level Aggregation (
TLA)
identifier. For example, the identifier could specify the
ISP.
o The next eight bits are reserved for future use.
o The next 24 bits are the Next-Level Aggregation (
NLA)
identifier.
o The next 16 bits are the Site-Level Aggregation (
SLA)
identifier.
o The last 64 bits are the interface
ID. This will most often be
the hardware address of the link in
IEEE EUI-64 format.
Link-local unicast addresses are divided in this manner:
o The first ten bits are the Format Prefix identifying a link-
local address.
o The next 54 bits are zero.
o The last 64 bits are the interface
ID. This will most often be
the hardware address of the link in
IEEE EUI-64 format.
Site-local unicast addresses are divided in this manner:
o The first ten bits are the Format Prefix identifying a site-
local address.
o The next 38 bits are zero.
o The next 16 bits are the subnet
ID.
o The last 64 bits are the interface
ID. This will most often be
the hardware address of the link in
IEEE EUI-64 format.
ADDRESSING
IPv6 addresses are sixteen byte quantities, stored in network byte order.
The socket
API uses the
sockaddr_in6 structure when passing
IPv6 addresses between an application and the kernel. The
sockaddr_in6 structure has the following members:
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
uint32_t __sin6_src_id;
Library routines are provided to manipulate structures of this form.
See
inet(3C).
The
sin6_addr field of the
sockaddr_in6 structure specifies a local or
remote
IPv6 address. Each network interface has one or more
IPv6 addresses configured, that is, a link-local address, a site-local
address, and one or more global unicast
IPv6 addresses. The special value
of all zeros may be used on this field to test for "wildcard" matching.
Given in a
bind(3SOCKET) call, this value leaves the local
IPv6 address
of the socket unspecified, so that the socket will receive connections or
messages directed at any of the valid
IPv6 addresses of the system. This
can prove useful when a process neither knows nor cares what the local
IPv6 address is, or when a process wishes to receive requests using all
of its network interfaces.
The
sockaddr_in6 structure given in the
bind() call must specify an
in6_addr value of either all zeros or one of the system's valid
IPv6 addresses. Requests to bind any other address will elicit the error
EADDRNOTAVAI. When a
connect(3SOCKET) call is made for a socket that has
a wildcard local address, the system sets the
sin6_addr field of the
socket to the
IPv6 address of the network interface through which the
packets for that connection are routed.
The
sin6_port field of the
sockaddr_in6 structure specifies a port number
used by
TCP or
UDP. The local port address specified in a
bind() call is
restricted to be greater than
IPPORT_RESERVED (defined in <
netinet/in.h>)
unless the creating process is running as the super-user, providing a
space of protected port numbers. In addition, the local port address
cannot be in use by any socket of the same address family and type.
Requests to bind sockets to port numbers being used by other sockets
return the error
EADDRINUSE. If the local port address is specified as
0,
the system picks a unique port address greater than
IPPORT_RESERVED. A
unique local port address is also selected when a socket which is not
bound is used in a
connect(3SOCKET) or
sendto() call. See
send(3SOCKET).
This allows programs that do not care which local port number is used to
set up
TCP connections by simply calling
socket(3SOCKET) and then
connect(3SOCKET), and then sending
UDP datagrams with a
socket() call
followed by a
sendto() call.
Although this implementation restricts sockets to unique local port
numbers,
TCP allows multiple simultaneous connections involving the same
local port number so long as the remote
IPv6 addresses or port numbers
are different for each connection. Programs may explicitly override the
socket restriction by setting the
SO_REUSEADDR socket option with
setsockopt(). See
getsockopt(3SOCKET).
In addition, the same port may be bound by two separate sockets if one is
an
IP socket and the other an
IPv6 socket.
TLI applies somewhat different semantics to the binding of local port
numbers. These semantics apply when Internet family protocols are used
using the
TLI.
SOURCE ADDRESS SELECTION
IPv6 source address selection is done on a per destination basis, and
utilizes a list of rules from which the best source address is selected
from candidate addresses. The candidate set comprises a set of local
addresses assigned on the system which are up and not anycast. If just
one candidate exists in the candidate set, it is selected.
Conceptually, each selection rule prefers one address over another, or
determines their equivalence. If a rule produces a tie, a subsequent rule
is used to break the tie.
The sense of some rules may be reversed on a per-socket basis using the
IPV6_SRC_PREFERENCES socket option (see
ip6(4P)). The flag values for
this option are defined in <
netinet/in.h> and are referenced in the
description of the appropriate rules below.
As the selection rules indicate, the candidate addresses are SA and SB
and the destination is D.
Prefer the same address If SA == D, prefer SA. If SB == D, prefer
SB.
Prefer appropriate scope Here,
Scope(X) is the scope of X according
to the IPv6 Addressing Architecture.
If
Scope(SA) <
Scope(SB): If
Scope(SA) <
Scope(D), then prefer SB and otherwise
prefer SA.
If
Scope(SB) <
Scope(SA): If
Scope(SB) <
Scope(D), then prefer SA and otherwise
prefer SB.
Avoid deprecated addresses If one of the addresses is deprecated
(IFF_DEPRECATED) and the other is not,
prefer the one that isn't deprecated.
Prefer preferred addresses If one of the addresses is preferred
(IFF_PREFERRED) and the other is not,
prefer the one that is preferred.
Prefer outgoing interface If one of the addresses is assigned to the
interface that will be used to send packets
to D and the other is not, then prefer the
former.
Prefer matching label This rule uses labels which are obtained
through the IPv6 default address selection
policy table. See
ipaddrsel(8) for a
description of the default contents of the
table and how the table is configured.
If
Label(SA) ==
Label(D) and
Label(SB) !=
Label(D), then prefer SA.
If
Label(SB) ==
Label(D) and
Label(SA) !=
Label(D), then prefer SB.
Prefer public addresses This rule prefers public addresses over
temporary addresses, as defined in
RFC 3041. Temporary addresses are disabled by
default and may be enabled by appropriate
settings in
ndpd.conf(5).
The sense of this rule may be set on a per-
socket basis using the IPV6_SRC_PREFERENCES
socket option. Passing the flag
IPV6_PREFER_SRC_TMP or
IPV6_PREFER_SRC_PUBLIC will cause temporary
or public addresses to be preferred,
respectively, for that particular socket.
See
ip6(4P) for more information about IPv6
socket options.
Use longest matching prefix. This rule prefers the source address that has the longer matching
prefix with the destination. Because this is the last rule and
because both source addresses could have equal matching prefixes,
this rule does an
xor of each source address with the destination,
then selects the source address with the smaller
xor value in order
to break any potential tie.
If SA ^ D < SB ^ D, then prefer SA.
If SB ^ D < SA ^ D, then prefer SB.
Applications can override this algorithm by calling
bind(3SOCKET) and
specifying an address.
SEE ALSO
ioctl(2),
inet(3C),
bind(3SOCKET),
connect(3SOCKET),
getipnodebyaddr(3SOCKET),
getipnodebyname(3SOCKET),
getprotobyname(3SOCKET),
getservbyname(3SOCKET),
getsockopt(3SOCKET),
send(3SOCKET),
sockaddr(3SOCKET),
icmp6(4P),
ip6(4P),
tcp(4P),
udp(4P) Conta, A. and Deering, S.,
Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification, RFC 1885, December
1995.
Deering, S. and Hinden, B.,
Internet Protocol, Version 6 (IPv6) Specification, RFC 1883, December 1995.
Hinden, B. and Deering, S.,
IP Version 6 Addressing Architecture, RFC
1884, December 1995.
Draves, R.,
RFC 3484, Default Address Selection for IPv6. The Internet
Society. February 2003.
Narten, T., and Draves, R.
RFC 3041, Privacy Extensions for Stateless Address Autoconfiguration in IPv6. The Internet Society. January 2001.
NOTES
The
IPv6 support is subject to change as the Internet protocols develop.
Users should not depend on details of the current implementation, but
rather the services exported.
March 30, 2022
INET6(4P)