首页 文章

使用send()发送大于MSS的数据

提问于
浏览
0

通过TCP套接字发送数据的一般功能如下:

ssize_t send(int sockfd,const void * buffer,size_t length,int flags);

通常,如果数据大小超过MSS,则TCP将对数据进行分段 . 但据说send()API将发送'length'数据量并返回可以发送到传出缓冲区的任何数量的数据,并且开发人员有责任检查返回值并重新发送剩余数据 .

所以我怀疑它,那么如果'length'值超过MSS,TCP会不会自动分段数据?如果不是,那么我们如何通过一次send()调用使TCP内部分段数据呢?

2 回答

  • 3

    通常,如果数据大小超过MSS,则TCP将对数据进行分段 .

    不一般 . 总是 . 否则MSS没有确定的意义 .

    但是据说send()API将发送'length'数据量并返回可以发送到传出缓冲区的任何数量的数据,并且开发人员有责任检查返回值并重新发送剩余数据 .

    正确 .

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

    所以我怀疑它,那么如果'length'值超过MSS,TCP会不会自动分段数据?

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

    如果不是,那么我们如何通过一次send()调用使TCP内部分段数据呢?

    你不能 . 您无法控制TCP分段 .

  • 0

    对于流套接字,如果长度大于可以在单个分组中发送,则网络层确实会自动将其分成多个分组 . 您几乎无法控制操作系统选择拆分流数据的方式,有一些套接字选项会产生一些影响(例如TCP_NODELAY),但如果您谈论的主要是发送大数据包,则不会产生太大影响 .

相关问题