我知道对于 TCP,您可以启用例如Nagle 算法。但是,您可以为 UDP 提供类似的东西吗?
实际问题(假设 UDP 套接字):
如果我send()
在短时间内调用两次,每次send()
调用 1 个字节的数据。传输层是否可能决定仅发送 1 个带有数据的 UPD 数据包1 byte + 1 byte = 2 bytes
?
提前致谢!
我知道对于 TCP,您可以启用例如Nagle 算法。但是,您可以为 UDP 提供类似的东西吗?
实际问题(假设 UDP 套接字):
如果我send()
在短时间内调用两次,每次send()
调用 1 个字节的数据。传输层是否可能决定仅发送 1 个带有数据的 UPD 数据包1 byte + 1 byte = 2 bytes
?
提前致谢!
不会。UDP 数据报完全按照发送的方式发送,或者根本不发送。
不符合 RFC ( RFC 768 )。在 IP 设施本身之上,UDP 实际上只提供了额外的基于端口的路由和一点额外的损坏或路由错误检测。
这意味着无法组合数据报。事实上,由于它是面向事务的,我会说将两个事务合并为一个可能不是保持这些事务不同的一个坏主意。
否则,您将需要 UDP 之上的一层,它可以弄清楚如何从数据报中提取这些事务。目前,这不是必需的,因为数据报是事务。
作为对这种争用的附加支持(当然不是确定的),请参阅UDP 维基百科页面:
数据报——数据包是单独发送的,只有在它们到达时才检查完整性。数据包有明确的边界,在接收时遵守,这意味着接收器套接字上的读取操作将产生原始发送的完整消息。
但是,对它的最佳支持来自其客户之一。UDP 是专门为 TFTP 设计的(除其他外),如果您无法区分事务,该协议就会崩溃。
具体来说,TFTP 事务类型之一是data
由操作码、块号和最多 512 字节的数据组成的事务。如果在开始时没有长度指示或在结束时没有标记值,除非事务和数据报之间存在一对一的映射,否则无法确定下一个事务将从哪里开始。
顺便说一句,其他四种 TFTP 事务类型具有固定长度或字符串结尾标记值,但data
事务是此处的决定者。