TCP拆包、滑动窗口通俗理解

简介:TCP协议会将应用层的数据封装交给下层继续处理,根据七层协议,可以不管TCP数据包在下层的详细过程,而假设接收端TCP层同样可以收到该数据包,在此基础上进行以下讨论。
完美情况:
TCP直接将应用层数据包(可以认为就是一个数组)发给接收方,并且根据TCP协议,TCP会将每个发送的数据包编号(序列号),发送完一个序列号后,接收端收到会回复该序列号,代表已经被接受。
TCP拆包、滑动窗口通俗理解_第1张图片
这样实际上保证了数据包的有序性,并且如果包与包之间接受有时间间隔的话,就按照顺序解包就可以了(一般来说,一个包对应一个信息,即数据未分段发送)
TCP拆包、滑动窗口通俗理解_第2张图片
但问题是:
(1)接收端有自己的TCP缓存区,它会将多个包积累在一起在进行处理,这样的结果是导致包与包之间“无缝连接”,即所谓的”粘包“
TCP拆包、滑动窗口通俗理解_第3张图片
TCP拆包、滑动窗口通俗理解_第4张图片
TCP拆包、滑动窗口通俗理解_第5张图片
针对此问题,就有了一些解决办法:

  • 每个包长度固定:这样接收端就可以每隔一定长度进行拆包,但缺点是浪费资源
  • 加入头部信息:每个数据包前加入该数据包中数据的长度值,这样接收端从缓存中读取时,通过读该头部信息,知道了每个包的长度,这样就能拆包。
    详情可参考:粘包、拆包

(2)每个数据包发送后都要得到响应才发下一个,如果因为某一个包发送出现问题,会阻塞而导致程序一直占据资源等待,这是一种浪费。所以引入了滑动窗口机制。
详情参考:滑动窗口机制

你可能感兴趣的:(网络)