什么时候需要IPPROTO_UDP?

发布于 2024-08-15 10:25:03 字数 276 浏览 4 评论 0原文

什么时候需要IPPROTO_UDP?

是否存在 UDP不是 SOCK_DGRAM 的默认协议的情况? (真实案例,而不是假设的“可能是”,请“)

即,在什么情况下以下两行不会产生相同的行为?

if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1)

When is IPPROTO_UDP required?

Is there ever a case where UDP is not the default protocol for SOCK_DGRAM? (real cases, not hypothetical "it might be", please")

i.e., what are the situations where the following two lines would not produce identical behavior?

if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

土豪我们做朋友吧 2024-08-22 10:25:03

某些操作系统(例如 2.6.20 之后的 Linux 内核)支持 SOCK_DGRAM 的第二种协议,称为 UDP-Lite。如果您的系统支持,则可以通过提供 IPPROTO_UDPLITE 作为 socket() 调用的第三个参数来启用它。

它与普通 UDP 的区别在于允许仅对数据报的一部分应用校验和。 (通常,UDP 校验和是一种全有或全无的努力。)这样,如果校验和区域之外的某些片段可能在传输过程中丢失,协议可以更好地抵抗由于分段传输而导致的校验和失败。只要覆盖校验和部分的片段被成功接收,尽可能多的数据报仍将被传递到应用程序。

为了与现有代码向后兼容,我怀疑(但我不能保证)调用套接字(AF_INET,SOCK_DGRAM,0)将继续默认为普通UDP,即使在另外支持UDP-Lite的系统中也是如此。

Some operating systems (eg. Linux kernel after 2.6.20) support a second protocol for SOCK_DGRAM, called UDP-Lite. If supported by your system, it would be enabled by providing IPPROTO_UDPLITE as the third argument to the socket() call.

It is differentiated from normal UDP by allowing checksumming to be applied to only a portion of the datagram. (Normally, UDP checksumming is an all-or-nothing effort.) That way, the protocol can be more resistant to checksum failures due to fragmented transmission, in the event that some fragments outside the checksummed area may have been lost in transit. As long as the fragments covering the checksummed portion were successfully received, as much of the datagram as possible will still be delivered to the application.

For backwards compatibility with existing code, I suspect (but I cannot guarantee) that the call socket(AF_INET,SOCK_DGRAM,0) will continue to default to normal UDP, even in systems that additionally support UDP-Lite.

夏至、离别 2024-08-22 10:25:03

鉴于这些声明:

tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
raw_socket = socket(AF_INET, SOCK_RAW, protocol);

Linux 中的 ip(7) 手册页显示:

协议的唯一有效值是
0 和 IPPROTO_TCP 用于 TCP 套接字,以及
0 和 IPPROTO_UDP 用于 UDP 套接字。
对于 SOCK_RAW 您可以指定一个有效的
RFC 1700 中定义的 IANA IP 协议
分配的号码。

你的问题中的这两行总是会产生相同的结果。

Given these declarations:

tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
raw_socket = socket(AF_INET, SOCK_RAW, protocol);

the ip(7) manual page in linux says:

The only valid values for protocol are
0 and IPPROTO_TCP for TCP sockets, and
0 and IPPROTO_UDP for UDP sockets.
For SOCK_RAW you may specify a valid
IANA IP protocol defined in RFC 1700
assigned numbers.

Those two lines in your questions will always produce the same result.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文