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

     

  • 相关阅读:
    垂直搜索引擎蜘蛛
    利用Lucene.net搜索引擎进行多条件搜索的做法
    收缩数据库日志文件
    页头加上<!DOCTYPE html PUBLIC "//W3C//>后 js不符合w3c标准 对联不滚动
    winfrom中使用cache
    Vista与XP局域网文件共享设置方法
    如何快速高效的群发Email
    StringTemplate学习笔记(转载)
    清除sql 日志文件
    利用 Sandcastle 编写软件 SDK 文档
  • 原文地址:https://www.cnblogs.com/chenyang920/p/6583135.html
Copyright © 2011-2022 走看看