通过TCP套接字发送数据的一般功能如下:
ssize_t send(int sockfd,const void * buffer,size_t length,int flags);
通常,如果数据大小超过MSS,则TCP将对数据进行分段。但据说send()API将发送'length'数据量并返回可以发送到传出缓冲区的任何数量的数据,并且开发人员有责任检查返回值并重新发送剩余数据。
所以我怀疑它,那么如果'length'值超过MSS,TCP会不会自动分段数据?如果不是,那么我们如何通过一次send()调用使TCP内部分段数据呢?
通常,如果数据大小超过MSS,则TCP将对数据进行分段。
不一般。总是。否则MSS没有确定的意义。
但据说send()API将发送'length'数据量并返回可以发送到传出缓冲区的任何数量的数据,并且开发人员有责任检查返回值并重新发送剩余数据。
正确。
这两个陈述没有冲突。 send()
将数据传输到套接字发送缓冲区; TCP将其从那里传输到网络,同时适当注意MSS,拥塞,接收窗口等。
所以我怀疑它,那么如果'length'值超过MSS,TCP会不会自动分段数据?
往上看。 TCP处理套接字发送缓冲区中的内容,而不是提供给send()
的参数值。
如果不是,那么我们如何通过一次send()调用使TCP内部分段数据呢?
你不能。您无法控制TCP分段。
对于流套接字,如果长度大于可以在单个分组中发送,则网络层确实会自动将其分成多个分组。您几乎无法控制操作系统选择拆分流数据的方式,有一些套接字选项会产生一些影响(例如TCP_NODELAY),但如果您谈论的主要是发送大数据包,则不会产生太大影响。