https://blog.csdn.net/weixin_45775963/article/details/107451035

  1. 什么是TCP粘包
    TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。

  2. 出现粘包的原因

出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。

  • 发送方原因:Nagle算法造成了发送方可能会出现粘包问题。TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),Nagle算法主要做两件事:只有上一个分组得到确认,才会发送下一个分组;收集多个小分组,在一个确认到来时一起发送。Negale 算法是指发送方发送的数据不会立即发出,而是先放在缓冲区, 等缓存区满了再发出。发送完一批数据后, 会等待接收方对这批数据的回应,然后再发送下一批数据。Negale 算法适用于发送方需要发送大批量数据, 并且接收方会及时作出回应的场合, 这种算法通过减少传输数据的次数来提高通信效率.

  • 接收方原因:TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。

  1. 什么时候需要处理?
  • 如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时当然不需要处理粘包现象,如果多个分组毫不相干,甚至是并列关系,这个时候就一定要处理粘包现象了。
  1. 如何处理?
  • 发送方:对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。

  • 接收方:接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。

  • 应用层:解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成。但是如何判断每条数据的长度呢?格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置

  1. TCP有粘包,UDP没有粘包
    TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。

UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。

什么是沾包?如何处理?相关推荐

  1. pytorch中如何处理RNN输入变长序列padding

    一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练 ...

  2. Laravel 底层是如何处理 HTTP 请求的?

    基于 Laravel 框架构建的 Web 应用处理 HTTP 请求的流程也是如此.所有 HTTP 请求都会被转发到单入口文件 public/index.php,处理 HTTP 请求的核心代码如下(忽略 ...

  3. python 应声虫怎么做_职场人士如何处理好人际关系:要服从,但不要做毫无主见的应声虫...

    职场人士如何处理好人际关系:要服从,但不要做毫无主见的应声虫 职场人士如何处理好人际关系:要服从,但不要做毫无主见的应声虫 在一个公司里,领导是公司的核心,是公司政策的决策者,是公司的权威人物.对员工 ...

  4. 如何处理单元测试产生的数据,下列哪些说法是正确的

    如何处理单元测试产生的数据,下列哪些说法是正确的?:答案在文末 A. 测试数据入库时加特殊前缀标识. B. 测试数据使用独立的测试库. C. 自动回滚单元测试产生的脏数据. D. 无须区别,统一在业务 ...

  5. 作为项目经理,如何处理好与不同类型客户之间的关系?

    作为项目经理,如何处理好与客户之间的关系非常重要.但是究竟如何处理客户关系呢?客户的人员都有哪些类型?不同类型的客户的应对是否都一样呢?下面我们来看看在日常工作中经常遇到的客户类型,应该如何处理跟他的 ...

  6. 机器学习模型如何获得可重复的结果?最佳实践是什么?如何处理random_state参数?

    机器学习模型如何获得可重复的结果?最佳实践是什么?如何处理random_state参数? 目录 机器学习模型如何获得可重复的结果?最佳实践是什么?如何处理random_state参数? #random ...

  7. plt.figure(figsize(x,y))设置后后续程序都跟着改变,如何处理?走破解它!

    plt.figure(figsize(x,y))设置后后续程序都跟着改变,如何处理?走破解它! 目录 plt.figure(figsize(x,y))设置后后续程序都跟着改变,如何处理?走破解它!

  8. matlab bp结果,Matlab如何处理BP网络每次运行结果不一样这个问题

    我按照版上指导,通过循环语句找到了最合适的节点数,也用了归一化处理.但是尽管如此,每次运行后的结果还是从60多到130多不等.这些东西写进报告里没有说服力.这个如何处理一下呢.我的原代码如下: clc ...

  9. .netcore 如何获取系统中所有session_集群化部署,Spring Security 要如何处理 session 共享?

    前面和大家聊了 Spring Security 如何像 QQ 一样,自动踢掉已登录用户(Spring Boot + Vue 前后端分离项目,如何踢掉已登录用户?),但是前面我们是基于单体应用的,如果我 ...

最新文章

  1. 云炬金融每日一题20211008
  2. VTK:AlignFrames对齐帧用法实战
  3. php Heredoc应用说明
  4. java 聚合_Java聚合
  5. php /usr/lib/libjpeg.so.62,linux PHP的装配
  6. js如何实现动态显示表格数据(点奇数显示奇数单元格内容)
  7. 让Python在Android系统上飞一会儿:第三节 在电脑上编写程序在手机上运行
  8. Spark的那些外部框架
  9. 07_封装丶静态和工具类
  10. 《C专家编程》笔记——第一章
  11. ssdp协议 upnp_【零知ESP8266】教程:SSDP简单服务发现协议示例
  12. 基于 Echarts 实现可视化数据大屏展示
  13. android实训总结ppt模板,ppt制作实训心得.docx
  14. No content to map to Object due to end of input
  15. html设计打地鼠游戏,js实现打地鼠小游戏
  16. 【青岛seo基础知识教程】SEO优化:10分钟制定一个超越竞争对手网站的方案
  17. dell t320 raid linux,Dell T320服务器阵列卡驱动下载
  18. 求矩阵的特征值和特征向量方法
  19. 前端学习-品优购实践
  20. hadoop SWAP交换空间

热门文章

  1. Python入门基础总结笔记——正则表达式
  2. css多种方法画四分之一圆曲线
  3. 微信开放平台开发(一)
  4. 第一篇 微信开发 准备工作(转载自walkingmanc的专栏)【转】
  5. 骨传导耳机品牌排行榜前十,目前最好用的几款推荐
  6. 功能模块图、业务流程图、处理流程图、ER图,数据库表图(概念模型和物理模型)画法...
  7. 接受密码和用户名,若用户名为‘admin‘,密码为‘‘123456‘则显示用户登录成功,否则一直登录
  8. 高中计算机操作题frontpage步骤,计算机一级Frontpage操作试题
  9. Postman之CSV或JOSN文件实现数据驱动(参数化)
  10. 电点国际化翻译系统,助力你开启海外项目之旅