博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP的粘包问题
阅读量:4671 次
发布时间:2019-06-09

本文共 659 字,大约阅读时间需要 2 分钟。

什么是粘包

  粘包指的是数据与数据之间没有明确的分界线,导致不能正确读取

  应用程序无法直接操作硬件,应用程序想要发送数据则必须将数据交给操作系统,而操作系统需要同时为所有应用程序提供数据传输服务,也就意味着,操作系统不可能立马就能将应用程序的数据发送出去,就需要为应用程序提供一个缓冲区,用于临时存放数据,具体流程如下

  发送方

    当应用程序调用send函数时,应用程序会将数据从应用程序拷贝到操作系统缓存,再由操作系统从缓冲区读取数据并发送出去。

  接收方

    对方计算机收到数据也是操作系统先收到,至于应用程序何时处理这些数据,操作系统并不清楚,所以同样需要将数据先存储到操作系统的缓冲区中,当应用程序调用recv时,实际上是从操作系统缓冲区中将数据拷贝到应用程序的过程。

  上述过程对于TCP与UDP都是相同的不同之处在于;

    UDP在收发数据时是基于数据包的,即一个包一个包的发送,包与包之间有着明确的分界,到达对方操作系统缓冲区后也是一个一个独立的数据包,接收方从操作系统缓冲区将数据拷贝到应用程序

如何解决粘包问题  

  解决粘包的核心思路就是 先通知接收方 要发送数据的长度

  再发送真实数据

  问题在于 数据长度也是不确定的

  对方也不清楚 长度信息到底是几个字节  

  解决方案是 把长度信息转换为一个固定的字节的二进制数据(要用到struct模块)

 

转载于:https://www.cnblogs.com/ShenJunHui6/p/10458711.html

你可能感兴趣的文章
从总数中生成一定数量的随机数
查看>>
Strut2页面传参跳转 --Struts2
查看>>
5.User Interface/ActionBar
查看>>
Integer 与 int 中的 ==
查看>>
ReactJS实用技巧(1):JSX与HTML的那些不同
查看>>
java语言程序设计(基础篇) 第2章 基本程序设计 课本源代码
查看>>
装饰者模式 详解
查看>>
【模板】卢卡斯定理
查看>>
[POJ 1273]Drainage Ditches
查看>>
[CODEVS 1036]商务旅行
查看>>
编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...
查看>>
MySQL安装与操作总结
查看>>
python 中time, datetime的用法
查看>>
python中将函数赋值给变量时需要注意的一些问题
查看>>
SAS数据挖掘实战篇【五】
查看>>
如何成为合格的数据分析师
查看>>
ArcGIS10.5资源分享
查看>>
理解http幂等性
查看>>
grep运用
查看>>
logstash收集syslog日志
查看>>