zoukankan      html  css  js  c++  java
  • 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信息中,说明了信息的长度,这样在从缓冲区读取信息时,会根据相应的信息长度将信息读取出来。

     

  • 相关阅读:
    矩阵的阶
    python中'0b111'中的b 是什么意思
    Python字节码介绍
    多版本python共存,安装三方库到指定python版本
    关于python 中的__future__模块
    解决Python模块报错:ModuleNotFoundError: No module name 'StringIO'
    python常用魔法函数
    MySQL binlog
    MySQL start and stop
    Mysql 源码安装
  • 原文地址:https://www.cnblogs.com/chenyang920/p/6583135.html
Copyright © 2011-2022 走看看