【发布时间】:2010-12-09 18:54:45
【问题描述】:
假设我的程序通过网络 (UDP) 发送 1000 个字节。它是否保证接收器将在一个“批次”中接收 1000 个字节?或者他可能需要执行几次“读取”,直到他收到整个消息?如果后者为真,我如何确保同一消息的数据包顺序不会“混淆”(按顺序),或者协议可能保证它?
编辑:也就是说,我的消息有可能被分成几个数据包吗? (如果我尝试发送 10000mb 的消息会怎样?)
【问题讨论】:
标签: c# c++ networking udp
假设我的程序通过网络 (UDP) 发送 1000 个字节。它是否保证接收器将在一个“批次”中接收 1000 个字节?或者他可能需要执行几次“读取”,直到他收到整个消息?如果后者为真,我如何确保同一消息的数据包顺序不会“混淆”(按顺序),或者协议可能保证它?
编辑:也就是说,我的消息有可能被分成几个数据包吗? (如果我尝试发送 10000mb 的消息会怎样?)
【问题讨论】:
标签: c# c++ networking udp
你会得到它,或者什么都没有。
但不能特别保证您会按照数据包的传输顺序准确接收一次数据包;丢包、重新排序和(不太常见的)重复都是可能的。
存在最大帧大小(65,507 字节),发送()更大尺寸的数据包将返回错误。
您必须提供足够的缓冲区以在一次调用中接收整个帧。
UDP 数据包可以分成多个 IP 片段,但操作系统会丢弃一个不完整的数据包。因此,这对应用程序是透明的。
【讨论】:
接收方将在一次调用中获取整个数据包。数据包长度是有限的,即使在theory:
长度 一个 16 位字段,指定整个字节的长度 数据报:标题和数据。最小值 长度是 8 个字节,因为那是 标头的长度。字段大小 设定理论限制为 65,535 字节(8 字节头 + 65527 字节 data) 用于 UDP 数据报。这 数据长度的实际限制 这是由基础强加的 IPv4 协议为 65,507 字节。
但实际限制要低得多,通常假设为 512 字节是安全的。见What is the largest Safe UDP Packet Size on the Internet。
【讨论】:
UDP 与 TCP 不同,它不是可靠的协议。它没有提供内置机制来确保数据包以正确的顺序到达,甚至根本到达。也就是说,您可以以锁步方式编写发送/接收例程,每次发送数据包时,发送方必须等待接收 ACK 才能再次发送。如果在某个指定的超时后没有收到 ACK,则必须重新发送数据包。这样可以确保以正确的顺序接收数据包。 (有关更多信息,请查看使用此策略的RFC for the TFTP protocol。)
最后,如果可能,您可能要考虑改用 TCP。
【讨论】:
使用 UDP 发送的数据在packets 中分组,因此如果您发送 x 个字节,那么如果接收者收到数据包,他将收到 x 个字节。
但是,您的数据包甚至可能没有到达,或者它们可能乱序到达。
【讨论】:
使用UDP Lite,您可以请求接收部分损坏的数据包。这对于视频和 VoIP 服务很有用。
【讨论】: