似乎可以在没有有效负载的情况下发送 UDP 数据包。
我能想到的唯一不需要有效载荷的就是用于 NAT 打孔。这还能用来做什么?
这与我之前的问题有关在 Linux 下,recv 能否在 UDP 上返回 0?
我想更重要的是,如果它被指定为某个标准的一部分,那么它被认为在某个地方有用吗?
似乎可以在没有有效负载的情况下发送 UDP 数据包。
我能想到的唯一不需要有效载荷的就是用于 NAT 打孔。这还能用来做什么?
这与我之前的问题有关在 Linux 下,recv 能否在 UDP 上返回 0?
我想更重要的是,如果它被指定为某个标准的一部分,那么它被认为在某个地方有用吗?
任何事物!UDP 数据包不是空的——它带有发送者的身份。因此,这样的数据包可以用作原始类型的信号:可能是你好、再见或保持活动状态。
使用类似的接口sendmsg
,可以使用空包来发送辅助数据,例如cmsg
结构(可用于在 Linux 上的两个进程之间传输文件描述符)。
编辑:另一种用途:NAT 遍历算法,例如STUN或 UDP 打孔。
要回答“为什么协议会这样做”的问题:旧的 Daytime 协议只是使用 UDP 数据包的到达来发回回复数据包。同样,只要 TCP 连接发生,它就会回复时间值,而不管 TCP 连接包含的任何实际数据。
可以发送一个没有负载的 UDP 数据包来检测 UDP 端口是否关闭。如果关闭,则回复 ICMP-unreach。