UDP(4P) Protocols UDP(4P)
NAME
udp, UDP - Internet User Datagram Protocol
SYNOPSIS
#include <sys/socket.h> #include <netinet/in.h> s = socket(AF_INET, SOCK_DGRAM, 0); s = socket(AF_INET6, SOCK_DGRAM, 0); t = t_open("/dev/udp", O_RDWR); t = t_open("/dev/udp6", O_RDWR);DESCRIPTION
UDP is a simple datagram protocol which is layered directly above the
Internet Protocol ("
IP") or the Internet Protocol Version 6 ("IPv6").
Programs may access
UDP using the socket interface, where it supports
the
SOCK_DGRAM socket type, or using the Transport Level Interface
("
TLI"), where it supports the connectionless (
T_CLTS) service type.
Within the socket interface,
UDP is normally used with the
sendto(),
sendmsg(),
recvfrom(), and
recvmsg() calls (see
send(3SOCKET) and
recv(3SOCKET)). If the
connect(3SOCKET) call is used to fix the
destination for future packets, then the
recv(3SOCKET) or
read(2) and
send(3SOCKET) or
write(2) calls may be used.
UDP address formats are identical to those used by the Transmission
Control Protocol ("
TCP"). Like
TCP, UDP uses a port number along with an
IPor IPv6 address to identify the endpoint of communication. The
UDP port
number space is separate from the
TCP port number space, that is, a
UDP port may not be "connected" to a
TCP port. The
bind(3SOCKET) call can be
used to set the local address and port number of a
UDP socket. The local
IP or IPv6 address may be left unspecified in the
bind() call by using
the special value
INADDR_ANY for
IP, or the unspecified address (all
zeroes) for IPv6. If the
bind() call is not done, a local
IP or IPv6
address and port number will be assigned to the endpoint when the first
packet is sent. Broadcast packets may be sent, assuming the underlying
network supports this, by using a reserved "broadcast address" This
address is network interface dependent. Broadcasts may only be sent by
the privileged user.
Note that no two UDP sockets can be bound to the same port unless the
bound IP addresses are different. IPv4
INADDR_ANY and IPv6 unspecified
addresses compare as equal to any IPv4 or IPv6 address. For example, if a
socket is bound to
INADDR_ANY or unspecified address and port X, no other
socket can bind to port X, regardless of the binding address. This
special consideration of
INADDR_ANY and unspecified address can be
changed using the
SO_REUSEADDR socket option. If
SO_REUSEADDR is set on
a socket doing a bind, IPv4
INADDR_ANY and IPv6 unspecified address do
not compare as equal to any IP address. This means that as long as the
two sockets are not both bound to
INADDR_ANY/unspecified address or the
same IP address, the two sockets can be bound to the same port.
If an application does not want to allow another socket using the
SO_REUSEADDR option to bind to a port its socket is bound to, the
application can set the socket level option
SO_EXCLBIND on a socket. The
option values of 0 and 1 represent enabling and disabling the option,
respectively. Once this option is enabled on a socket, no other socket
can be bound to the same port.
IPv6 does not support broadcast addresses; their function is supported by
IPv6 multicast addresses.
Options at the
IP level may be used with
UDP. See
ip(4P) or
ip6(4P).
Additionally, there is one UDP-level option of interest to IPsec Key
Management applications (see
ipsec(4P)and
pf_key(4P)):
UDP_NAT_T_ENDPOINT If this boolean option is set, datagrams sent via this socket will
have a non-ESP marker inserted between the UDP header and the data.
Likewise, inbound packets that match the endpoint's local-port will
be demultiplexed between ESP or the endpoint itself if a non-ESP
marker is present. This option is only available on IPv4 sockets
(AF_INET), and the application must have sufficient privilege to use
PF_KEY sockets to also enable this option.
There are a variety of ways that a
UDP packet can be lost or corrupted,
including a failure of the underlying communication mechanism.
UDP implements a checksum over the data portion of the packet. If the
checksum of a received packet is in error, the packet will be dropped
with no indication given to the user. A queue of received packets is
provided for each
UDP socket. This queue has a limited capacity. Arriving
datagrams which will not fit within its
high-water capacity are silently
discarded.
UDP processes Internet Control Message Protocol ("
ICMP") and Internet
Control Message Protocol Version 6 ("
ICMP6") error messages received in
response to
UDP packets it has sent. See
icmp(4P) and
icmp6(4P).
ICMP "source quench" messages are ignored.
ICMP "destination
unreachable," "time exceeded" and "parameter problem" messages disconnect
the socket from its peer so that subsequent attempts to send packets
using that socket will return an error.
UDP will not guarantee that
packets are delivered in the order they were sent. As well, duplicate
packets may be generated in the communication process.
ICMP6 "destination unreachable" packets are ignored unless the enclosed
code indicates that the port is not in use on the target host, in which
case, the application is notified.
ICMP6 "parameter problem"
notifications are similarly passed upstream. All other
ICMP6 messages are
ignored.
SEE ALSO
read(2),
write(2),
bind(3SOCKET),
connect(3SOCKET),
recv(3SOCKET),
send(3SOCKET),
icmp(4P),
icmp6(4P),
inet(4P),
inet6(4P),
ip(4P),
ip6(4P),
ipsec(4P),
pf_key(4P),
tcp(4P) Postel, Jon,
RFC 768, User Datagram Protocol, Network Information Center,
SRI International, Menlo Park, Calif., August 1980
Huttunen, A., Swander, B., Volpe, V., DiBurro, L., Stenberg,
M., RFC 3948, UDP Encapsulation of IPsec ESP Packets, The Internet Society, 2005.
DIAGNOSTICS
A socket operation may fail if:
EISCONN A
connect() operation was attempted on a socket on which
a
connect() operation had already been performed, and
the socket could not be successfully disconnected before
making the new connection.
EISCONN A
sendto() or
sendmsg() operation specifying an address
to which the message should be sent was attempted on a
socket on which a
connect() operation had already been
performed.
ENOTCONN A
send() or
write() operation, or a
sendto() or
sendmsg() operation not specifying an address to which
the message should be sent, was attempted on a socket on
which a
connect() operation had not already been
performed.
EADDRINUSE A
bind() operation was attempted on a socket with a
network address/port pair that has already been bound to
another socket.
EADDRNOTAVAIL A
bind() operation was attempted on a socket with a
network address for which no network interface exists.
EINVAL A
sendmsg() operation with a non-NULL
msg_accrights was
attempted.
EACCES A
bind() operation was attempted with a "reserved" port
number and the effective user
ID of the process was not
the privileged user.
ENOBUFS The system ran out of memory for internal data
structures.
July 4, 2006
UDP(4P)