UDP - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-04-11
名称
udp-IPv4的用户数据报协议
语法
#包括
#包括
#包括
udp_socket = socket(AF_INET,SOCK_DGRAM,0);
说明
这是RFC 768中描述的用户数据报协议的实现。它实现了无连接,不可靠的数据报包服务。数据包在到达之前可能会重新排序或重复。 UDP生成并检查校验和以捕获传输错误。
创建UDP套接字时,未指定其本地和远程地址。可以使用sendto(2)或sendmsg(2)(以有效的目标地址作为参数)立即发送数据报。在套接字上调用connect(2)时,将设置默认目标地址,并且现在可以使用send(2)或write(2)发送数据报,而无需指定目标地址。通过将地址传递到sendto(2)或sendmsg(2),仍然可以发送到其他目的地。为了接收数据包,可以首先使用bind(2)将套接字绑定到本地地址。否则,套接字层将自动分配超出/ proc / sys / net / ipv4 / ip_local_port_range定义的范围的空闲本地端口,并将套接字绑定到INADDR_ANY。
所有接收操作仅返回一个数据包。当数据包小于传递的缓冲区时,仅返回那么多的数据;当它更大时,该数据包将被截断并设置MSG_TRUNC标志。不支持MSG_WAITALL。
IP选项可以使用ip(7)中描述的套接字选项发送或接收。仅当启用了适当的/ proc参数时,内核才会对它们进行处理(但即使将其关闭,该参数仍会传递给用户)。参见ip(7)。
当发送时设置了MSG_DONTROUTE标志时,目标地址必须引用本地接口地址,并且数据包仅发送到该接口。
默认情况下,Linux UDP执行路径MTU(最大传输单元)发现。这意味着内核将跟踪到特定目标IP地址的MTU,并在UDP数据包写入超出该值时返回EMSGSIZE。发生这种情况时,应用程序应减小数据包的大小。也可以使用IP_MTU_DISCOVER套接字选项或/ proc / sys / net / ipv4 / ip_no_pmtu_disc文件关闭路径MTU发现。有关详细信息,请参见ip(7)。禁用后,UDP将对超出接口MTU的传出UDP数据包进行分段。但是,出于性能和可靠性的原因,不建议禁用它。
Address format
UDP使用ip(7)中描述的IPv4 sockaddr_in地址格式。
Error handling
即使未连接套接字,所有致命错误也将作为错误返回传递给用户。这包括从网络收到的异步错误。您可能会收到在同一套接字上发送的较早数据包的错误消息。此行为不同于许多其他BSD套接字实现,除非连接了套接字,否则它们不会传递任何错误。 RFC 1122规定了Linux的行为。
为了与旧版代码兼容,在Linux 2.0和2.2中,可以将SO_BSDCOMPAT SOL_SOCKET选项设置为仅在连接套接字后才接收远程错误(EPROTO和EMSGSIZE除外)。始终会生成本地生成的错误。在更高版本的内核中已删除了对该套接字选项的支持。有关更多信息,请参见socket(7)。
启用IP_RECVERR选项后,所有错误都存储在套接字错误队列中,并且可以通过设置了MSG_ERRQUEUE标志的recvmsg(2)来接收。
/proc interfaces
可以通过目录/ proc / sys / net / ipv4 /中的文件访问系统范围的UDP参数设置。
- udp_mem(since Linux 2.6.25)
- This is a vector of three integers governing the number
of pages allowed for queueing by all UDP sockets.
- min
- 在此页数以下,UDP不会对其内存需求感到困扰。当UDP分配的内存量超过此数量时,UDP开始适度使用内存。
- pressure
- 引入该值以遵循tcp_mem的格式(请参阅tcp(7))。
- max
- 所有UDP套接字允许排队的页面数。
- 这三个项目的默认值是在启动时根据可用内存量计算的。
- udp_rmem_min(integer; default value: PAGE_SIZE; since Linux 2.6.25)
- UDP套接字使用的接收缓冲区的最小大小(以字节为单位)。每个UDP套接字都可以使用该大小来接收数据,即使UDP套接字的总页数超过了udp_mem的压力。
- udp_wmem_min(integer; default value: PAGE_SIZE; since Linux 2.6.25)
- UDP套接字使用的发送缓冲区的最小大小(以字节为单位)。即使UDP套接字的总页数超过udp_mem压力,每个UDP套接字也可以使用该大小来发送数据。
Socket options
要设置或获取UDP套接字选项,请调用getsockopt(2)进行读取,或调用setsockopt(2)来编写选项级别参数设置为IPPROTO_UDP的选项。除非另有说明,否则optval是指向int的指针。
以下是UDP特定套接字选项的列表。有关也适用于UDP套接字的某些其他套接字选项的详细信息,请参见socket(7)。
- UDP_CORK(since Linux 2.5.44)
- 如果启用此选项,则此套接字上的所有数据输出都将累积到一个数据报中,当禁用此选项时,将传输该数据报。此选项不应在旨在可移植的代码中使用。
Ioctls
可以使用ioctl(2)访问这些ioctl。正确的语法是:
int value; error = ioctl(udp_socket, ioctl_type, &value);
版本
IP_RECVERR是Linux 2.2中的新功能。
另外参见
ip(7),raw(7),socket(7),udplite(7)
内核源文件Documentation / networking / ip-sysctl.txt。
用户数据报协议的RFC 768。
主机要求的RFC 1122。
RFC 1119用于描述路径MTU发现。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。