Netty:是否需要关注重新组装的TCP段?

时间:2013-02-12 14:17:05

标签: sockets tcp netty nio

我对TCP段重组有疑问。 我了解到数据包可以划分为多个部分(这与MSS有关)。

即消息流(假设):

  1. 客户端发送从应用程序层传递的数据包
  2. 在客户端的TCP层中,数据包分为3个段。
  3. 传递给客户的IP层的段。
  4. 服务器的IP层接收段。
  5. 在服务器端的TCP层中,它接收3个数据包并将其重新组合为一个数据包。
  6. 服务器的应用层接收一个数据包。
  7. 我的理解是TCP层是重组的分割段。 如果我错了,请纠正我。

    以下是我真正要澄清的内容。

    使用Netty时,服务器端的“messageReceived()”方法只被调用一次或3次? 如果TCP层是重组的分割段的位置,那么“messageReceived()”方法只被调用一次,是否正确?

    那么,使用像“ReplayingDecoder”这样的东西来保证服务器接收的字节数是不是真的很有必要呢?

    非常感谢您的帮助。


    附加问题:

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

1 个答案:

答案 0 :(得分:2)

  

数据包可以分为多个部分

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

  

我的理解是TCP层是重组的分段。

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

  

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

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

  

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

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

  

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

您不会,也不能自己处理任何问题。 TCP为应用程序提供字节流,而不是段或数据包。