最近遇见很多的关于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信息中,说明了信息的长度,这样在从缓冲区读取信息时,会根据相应的信息长度将信息读取出来。