我对TCP段重组有疑问。 我了解到数据包可以划分为多个部分(这与MSS有关)。
即消息流(假设):
我的理解是TCP层是重组的分割段。 如果我错了,请纠正我。
以下是我真正要澄清的内容。
使用Netty时,服务器端的“messageReceived()”方法只被调用一次或3次? 如果TCP层是重组的分割段的位置,那么“messageReceived()”方法只被调用一次,是否正确?
那么,使用像“ReplayingDecoder”这样的东西来保证服务器接收的字节数是不是真的很有必要呢?
非常感谢您的帮助。
附加问题:
如果服务器无法重新组合段,因为其中一个段丢失或者其他东西,那么TCP层将不完整的数据包传递给应用层?
答案 0 :(得分:2)
数据包可以分为多个部分
颠倒或不好的术语。 TCP发送被分成数据包的段,并且可以在途中进一步拆分成子包。
我的理解是TCP层是重组的分段。
数据包重组发生在IP层,而不是应用程序(或TCP层)。段重组在TCP层中进行。
“messageReceived()”方法只被调用一次或三次?
从1到N调用任意次数,其中N是字节流的长度。发送方发送方和接收方之间没有保证1:1的对应关系。
如果服务器无法重新组合段,因为其中一个丢失或者其他东西, 那么TCP层将不完整的数据包传递给应用层?
绝对不是。 TCP根本不会将数据包传递给应用程序层。它传递一个完整的,正确排序的字节流,或者什么都没有。
想知道我是否应该自己处理段重组
您不会,也不能自己处理任何问题。 TCP为应用程序提供字节流,而不是段或数据包。