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)

tribblix@gmail.com :: GitHub :: Privacy