另外参见

ip(7),raw(7),socket(7),udplite(7)

内核源文件Documentation / networking / ip-sysctl.txt。

用户数据报协议的RFC 768。
主机要求的RFC 1122。
RFC 1119用于描述路径MTU发现。

UDP - Linux手册页

Linux程序员手册 第7部分
更新日期: 2020-04-11

名称

udp-IPv4的用户数据报协议

错误说明

UDP套接字上的发送或接收可能返回针对socket(7)或ip(7)记录的所有错误。

ECONNREFUSED
没有接收者与目标地址相关联。这可能是由套接字上发送的先前数据包引起的。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

说明

这是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);
FIONREAD(SIOCINQ)
获取指向整数的指针作为参数。返回整数形式的下一个未决数据报的大小,以字节为单位;如果没有未决数据报,则返回0。警告:使用FIONREAD不可能将没有数据报挂起的情况与下一个待处理数据报包含零字节数据的情况区分开。使用select(2),poll(2)或epoll(7)区分这些情况更安全。
TIOCOUTQ(SIOCOUTQ)
返回本地发送队列中的数据字节数。仅在Linux 2.4及更高版本中受支持。

此外,支持ip(7)和socket(7)中记录的所有ioctl。

语法

#包括
#包括
#包括

udp_socket = socket(AF_INET,SOCK_DGRAM,0);

版本

IP_RECVERR是Linux 2.2中的新功能。

日期:2019-08-20 18:02:03 来源:oir作者:oir