使用Send()发送更大的数据

Sending data larger that MSS using send()

本文关键字:数据 Send 使用      更新时间:2023-10-16

通过TCP插座发送数据的一般函数如下:

ssize_t send(int sockfd,const void *buffer,size_t长度,int 标志);

通常,如果数据大小比MSS更多,则TCP会片段片段。但是据说send()API将发送"长度"数据量,并返回任何可以将任何数据发送给传出缓冲区的数据及其责任检查返回值并重新发送剩余的数据。

所以我怀疑,那么,如果"长度"值大于MSS,则TCP不会自动碎片数据?如果否,那么我们如何使TCP用一个send()调用在内部片段?

通常,如果数据大小比MSS更多。

通常不是。总是。否则MSS没有可确定的含义。

,但据说send()API将发送"长度"数据数量,并返回任何可以将任何数据发送给传出缓冲区及其责任检查返回值并重新发送剩余数据的责任。

正确。

这两个陈述没有冲突。send()将数据传输到套接字发送缓冲区;TCP将其从那里转移到网络,请注意MSS,拥塞,接收窗口等。

所以我怀疑,那么,如果"长度"值大于MSS,则不会自动破坏数据?

见上文。TCP处理套接字发送缓冲区中的内容,而不是提供给send()的参数值。

如果否,那么我们如何使TCP用一个send()调用在内部片段?

你不能。您无法控制TCP分割。

对于流插座,如果长度超过单个数据包中的长度,则网络层确实会自动将其分为多个数据包。您几乎无法控制OS选择如何拆分流数据,有一些套接字选项会产生一定的影响(例如TCP_Nodelay),但是如果您在谈论大多数发送大数据包,则不会有很大的不同。