TCP如何分割其数据

时间:2016-08-02 14:49:38

标签: networking tcp udp

我们都知道TCP是一种流媒体协议。

与UDP不同,它保证整个客户端消息将作为单个数据报传递给服务器(我们正在讨论传输层,因此目前避免使用MTU),TCP可以分割一条“消息”(数据是将send函数传递给几个较小的数据包,因此我们必须使用自己的分隔符作为消息的边界。

问题是 - TCP如何选择哪些数据应该分段以及大小?是否有任何常用/标准方法?

1 个答案:

答案 0 :(得分:2)

TCP使用名为Maximum Segment Size的参数:

  

最大段大小(MSS)是TCP标头的选项字段的参数,用于指定计算机或通信设备可在单个TCP段中接收的最大数据量(以字节为单位)。它不计算TCP标头或IP标头。包含TCP段的IP数据报可以是单个分组内的自包含的,或者可以从几个分段的片段重建;无论哪种方式,MSS限制都适用于最终重建的TCP段中包含的数据总量。

     

默认TCP最大段大小为536.如果主机希望将最大段大小设置为默认值以外的值,最大段大小被指定为TCP选项,最初在TCP SYN数据包中在TCP握手期间。建立连接后无法更改该值。

如果启用了path MTU discovery,则MSS设置为减去TCP标头大小。

在Linux TCP_MAXSEG上,socket选项控制参数:

  

如果在连接建立之前设置了此选项,它还会将初始数据包中公布的MSS值更改为另一端。 大于(最终)接口MTU的值无效。 TCP还会将其最小和最大边界强加于所提供的值。