2016-08-02 163 views
2

我们都知道TCP是一个流媒体协议。与UDP相比,UDP可以保证整个客户端消息作为单个数据报被传送到服务器(我们正在讨论传输层,因此避免了MTU),TCP可以将一条“消息”(数据被传递给send函数)分成几个更小的数据包,所以我们必须使用我们自己的分隔符作为消息的边界。TCP如何分割其数据

现在的问题是 - TCP如何选择哪些数据应该分段并按哪个大小?有没有使用共同/标准的方法?

+0

@Robᵩ那么有没有共同的规则或标准的碎片方法? – FrozenHeart

+0

从应用程序中观察不到。你想解决什么问题? –

+0

@Robᵩ这比实际的问题更具理论性。有趣的是知道这样的事情 – FrozenHeart

回答

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套接字选项控制参数:

如果这个选项被连接建立之前设置,也改变公布的初始数据包的另一端的MSS值。 大于(最终)接口MTU的值不起作用。 TCP还将对所提供的价值施加其最小和最大范围。

+0

我发现网络协议(如TCP)的解释非常有趣:) – pjcognetta

+0

好吧,它可以在TCP层(每个数据包最大到MSS)和IP层(每个数据包最多到MTU),对吗? – FrozenHeart

+2

@FrozenHeart是的,TCP将数据拆分成段,IP层拆分成碎片。 –