3

我有一个关于 TCP 段重组的问题。我了解到数据包可以分为多个段(这与 MSS 有关)。

即)消息流(假设):

  1. 客户端发送一个从应用层传递过来的数据包
  2. 在客户端的 TCP 层,数据包分为 3 个段。
  3. 段传递到客户端的 IP 层。
  4. 服务器的 IP 层接收分段。
  5. 在服务器端的 TCP 层,它接收 3 个数据包并将其重组为一个数据包。
  6. 服务器的应用层接收到一个数据包。

我的理解是 TCP 层是重新组装分割段的地方。如果我错了,请纠正我。

这是我真正想澄清的事情。

使用Netty时,Server端的“messageReceived()”方法只被调用一次还是3次?如果 TCP 层是重新组装分割段的地方,“messageReceived()”方法只被调用一次,对吗?

那么,真的有必要使用“ReplayingDecoder”之类的东西来保证服务器正在接收的字节数吗?

非常感谢您的帮助。


附加问题:

如果服务器因为其中一个丢失或其他原因无法重新组装这些段,那么 TCP 层将不完整的数据包传递给应用层?

4

1 回答 1

3

数据包可以分为多个段

颠倒,或错误的术语。TCP 发送分段,这些分段被分成数据包,并且可以在途中进一步分成子数据包。

我的理解是 TCP 层是重新组装分割段的地方。

数据包重组发生在 IP 层,而不是应用程序(或 TCP 层)。段重组发生在 TCP 层。

“messageReceived()”方法只被调用一到三次?

它被调用任意次数,从 1 到 N,其中 N 是字节流的长度。发送方发送和接收方接收之间没有保证的 1::1 对应关系。

如果服务器因为其中一个丢失或其他原因无法重新组装这些段,那么 TCP 层将不完整的数据包传递给应用层?

绝对不。TCP 根本不将数据包传递给应用层。它传递一个完整的、正确排序的字节流,或者什么都不传递。

想知道我是否应该自己处理分段重组

你没有,也不能自己处理任何事情。TCP 向应用程序提供字节流,而不是段或数据包。

于 2013-02-12T20:25:49.483 回答