【发布时间】:2012-01-23 00:39:32
【问题描述】:
如果在客户端我连接到服务器并多次调用套接字上的Send()方法发送短数据,服务器有时只收到一个包含所有累积数据的“数据包”是否正常?多种发送方式的总和?
【问题讨论】:
标签: sockets network-programming
如果在客户端我连接到服务器并多次调用套接字上的Send()方法发送短数据,服务器有时只收到一个包含所有累积数据的“数据包”是否正常?多种发送方式的总和?
【问题讨论】:
标签: sockets network-programming
是的。 TCP 是一个流,没有单独的“数据包”的概念 - 您应该期望一次接收一个字节的所有内容,所有内容合并在一起或介于两者之间。
唯一的保证是不会丢失任何数据,并且会按照您发送它的顺序到达。
【讨论】:
是的,这对于基于 TCP 流的套接字来说是完全正常的。默认情况下,启用发送合并的Nagle algorithm,这会减少在短时间内传输的数据包数量。如果您希望每个send() 传输自己的数据包,则必须禁用该算法。有时在特殊情况下需要这样做,但通常默认行为对于大多数套接字使用来说是足够且可取的。
【讨论】:
send()s,例如因为多个 IP 数据报在接收进程安排之前到达,或者由于重传或发送窗口已满而在一个 IP 数据报中发送。