接触Socket通信的过程中,遇到了各种有关数据包的问题。这里做一下记录。

一、Socket粘包

1、什么是粘包?
答:顾名思义,其实就是多个独立的数据包连到一块儿。

2、什么情况下需要考虑粘包?
答:实际情况如下:

1、如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题。

2、如果发送的数据无结构,比如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包。

3、如果双方建立连接,需要在连接后一段时间内发送不同结构数据,如连接后,有好几种结构:
1)”good good study”
2)”day day up”
那这样的话,如果发送方连续发送这个两个包出去,接收方一次接收可能会是”good good studyday day up” 这样接收方就傻了,因为协议没有规定这么奇怪的字符串,所以要把它分包处理,至于怎么分也需要双方组织一个比较好的包结构,所以一般可能会在头加一个数据长度之类的包,以确保接收。

所以说:Tcp连续发送消息的时候,会出现消息一起发送过来的问题,这时候需要考虑粘包的问题。

3、粘包出现的原因 (在流传输中,UDP不会出现粘包,因为它有消息边界。)

1、发送端需要等缓冲区满才发送出去,造成粘包 (发送端出现粘包)

2、接收端没有及时接收缓冲区包数据,造成一次性接收多个包,出现粘包 (接收端出现粘包)

4、解决粘包

1、缓冲区过大造成了粘包,所以在发送/接收消息时先将消息的长度作为消息的一部分发出去,这样接收方就可以根据接收到的消息长度来动态定义缓冲区的大小。(这种方法就是所谓的自定义协议,这种方法是最常用的)

2、对发送的数据进行处理,每条消息的首尾加上特殊字符,然后再把要发送的所有消息放入一个字符串中,最后将这个字符串发送出去,接收方接收到这个字符串之后,再通过特殊标记操作字符串,把每条消息截出来。(这种方法只适合数据量较小的情况)

注:要记住这一点:TCP对上层来说是一个流协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片的,其间是没有分界线的,也就是没有包的概念。所以我们必须自己定义包长或者分隔符来区分每一条消息。

二、Socket的封包、拆包

1、为什么基于TCP的通信程序需要封包、拆包?
答:TCP是流协议,所谓流,就是没有界限的一串数据。但是程序中却有多种不同的数据包,那就很可能会出现如上所说的粘包问题,所以就需要在发送端封包,在接收端拆包。

2、那么如何封包、拆包?
答:封包就是给一段数据加上包头或者包尾。比如说我们上面为解决粘包所使用的两种方法,其实就是封包与拆包的具体实现。

————————————-本文到此结束—————————————

Socket封包、拆包、粘包相关推荐

  1. Netty粘包拆包问题说明、演示拆包粘包情况代码以及解决

    概述 TCP传输协议是面向连接的,面向流提供高可靠的服务.收发两端(服务端和客户端)都要有一一成对的socket,因此,发送端为了将多个发给接收端的包,更有效地发给对方,使用了优化算法(Nagle算法 ...

  2. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 发 ...

  3. TCP协议中的核心知识点,SYN Flood?ISN?滑动窗口?数据重传?拆包粘包?单tcp连接多请求?拥塞管理?(个人收藏学习笔记)

    TCP协议中的核心知识点,滑动窗口?数据重传?拆包粘包?单tcp连接多请求? 1.前言 2.TCP/IP四层结构 3. TCP 3.1 TCP 协议头 3.2 TCP通信过程 3.2.1 建立连接的三 ...

  4. socket编程 TCP 粘包和半包 的问题及解决办法

    socket编程 TCP 粘包和半包 的问题及解决办法 参考文章: (1)socket编程 TCP 粘包和半包 的问题及解决办法 (2)https://www.cnblogs.com/panchang ...

  5. IO系列学习总结八:以Netty的聊天室程序为例,再聊聊拆包粘包的解决方案

    前言 在上篇文章:IO系列学习总结七:从官网Factorial协议的视角来理解出站.入站及数据碎片化(粘包拆包)中,针对Factorial协议做了一些解析,其中包含netty的入站出站处理顺序以及粘包 ...

  6. Netty之拆包粘包原理分析

    1. 什么是拆包粘包? TCP传输协议是基于数据流传输的,而基于流化的数据是没有界限的,当客户端向服务端发送数据时,可能会把一个完整的数据报文拆分成多个小报文进行发送,也可能将多个报文合并成一个大报文 ...

  7. 自定义封包协议c语言,Socket分包,封包,粘包

    一.简单了解TCP 二.为什么要分包? 这里的分包我表示的是两层意思,第一层意思:比如我们定义每一次发送的数据大小为8k(因为在真正的项目编程中基本都是要进行封装的,所以发送的大小基本固定),那如果我 ...

  8. 关于TCP封包、粘包、半包

    关于Tcp封包 很多朋友已经对此作了不少研究,也花费不少心血编写了实现代码和blog文档.当然也充斥着一些各式的评论,自己看了一下,总结一些心得. 首先我们学习一下这些朋友的心得,他们是: http: ...

  9. SOCKET/串口通信粘包问题处理,附带详细代码

    UDP TCP或者串口通信中有可能会出现粘包问题.具体解决办法有以下几种 1.自定义包体格式包含包头+包体长度 2.加大读取缓冲区buffer 本文介绍第一种方法的 socket通信中我们一般开启一个 ...

  10. socket,与粘包

    1,socket(套接字) socket层 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口 server端 import socket sk = socket.socket ...

最新文章

  1. 赋能RPA时代,微软发布通用文档理解预训练模型LayoutLM
  2. indesign排版标点挤压_我於\LaTeX 中文直排实践中所感受的排版需求
  3. Spring Boot中使用LDAP来统一管理用户信息
  4. hdu3074 线段树求区间乘积(单点更新)
  5. javascript中的this讲解
  6. 事件分发机制 事件拦截 滑动冲突 MD
  7. linux进入别人电脑,怎么进入别人电脑--局域网【详解】
  8. ISO-IEC 系列 国际标准组织官方标准文档 下载地址直达
  9. 华为云 搭建 Zabbix监控服务
  10. [软件更新]vidalia 0.2.0.32
  11. 如何解决“App开发者需要更新此App以在此iOS版本上正常工作”
  12. 华为薪资等级结构表_2019年华为新员工薪酬 华为薪酬等级工资表
  13. java安装好了打不开机_Java安装以后为什么打不开?java打不开一闪而过如何解决?...
  14. 入门板绘又应该注意什么呢? 板绘初学者怎么练线稿
  15. vue中遍历呈现数据
  16. COMP0037 Coursework
  17. 全球工业网络安全收入预计2028年达到244.7亿美元
  18. CTF Misc 题目基础
  19. Spark Machine Learning(SparkML):机器学习(部分二)
  20. 采集数据用云服务器与公司网站,网络爬虫软件,企业版,大企业,采集内网数据,私有云部署-集搜客GooSeeker...

热门文章

  1. 《全民小镇》UI资源
  2. 一起来看看这份集齐vue2.0/vue3.0面试通杀秘籍(2021版) PDF,面试官问的源码问题绝对稳了!
  3. JAVA隐藏手机号码中的部分号码
  4. mysql里hdr是什么的缩写_HDR 是什么?有哪些具体介绍?
  5. python程序设计杨柏林pdf_Python程序设计教程 PDF 下载
  6. Expected space or tab after '//' in comment
  7. java计算机毕业设计云端小区物业智能管理系统源码+系统+mysql数据库+lw文档+部署
  8. 跟随CSDN走进微软
  9. js兼容IE,谷歌的下载方法
  10. python的缩进规则