TCP封包解包---如有错误,请纠正!

  最近遇见很多的关于TCP中封包解包的数据,在TCP节点之间的信息传递,每次传送的内容是结构体,所以每次在传送的时候,要将结构体中的数据进行封包,然后当一端接收到数据之后,要对接收到的buf参数中的数据进行解包。

  TCP是数据流的传送,数据之间没有分割,UDP是数据包的传送,数据之间有分割,所以UDP是不存在数据的封包解包。

  TCP之所以要进行封包解包:

   例如A->B传送数据,第一段数据是4kb,第二段数据是4kb

   A端可能会由于Nagle算法(TCP总是希望尽可能的发送足够大的数据),在发送第一段数据的时候会将数据存在缓冲区中,然后看还有没有数据要发送,如果这时候第二段数据来了,当达到MSS值时此时会将几段数据一起发送过去。 

   B端也可能由于应用层响应的不及时,所以缓冲区会有几段数据的累计。

   也会因为A端和B端之间的数据包的大小不同,所以当B是一个数据段的发送,但是在A端有收到的数据有几种情况:

    1.A端收到的数据是一个数据的大小,接着会收到第二个数据;

    2.A端收到的数据是第一个数据和第二个数据的部分,接着会收到剩下的第二个数据段;

    3.A端收到的数据是第一个数据的部分,接着会收到剩下的第一个数据和第二个数据段;

    4.A端收到的数据是第一个数据和第二个数据。

 然后由于以上的种种原因,会将数据进行封包,并且在传送中类似于http请求中的content-length信息中,说明了信息的长度,这样在从缓冲区读取信息时,会根据相应的信息长度将信息读取出来。

 

原文地址:https://www.cnblogs.com/chenyang920/p/6583135.html