1. 粘包现象及产生原因

1)概念

TCP协议中,发送方发送的若干个包数据到接收方接收时粘成一包。发送方粘包:发送方把若干个要发送的数据包封装成一个包,一次性发送,减少网络IO延迟;接收方粘包:接收方接到的数据是若干个数据包个封装成的,而不是一个一个的数据包接收到。

一般实际开发中所说的粘包问题都是指接收方粘包现象。

2)原因分析

我们知道,我们写的应用程序是无法直接操作硬件,都是通过调用操作系统给应用程序封装的接口间接来操作硬件。

如上图所示,一个C/S系统,当你的程序要给要给远程发送数据时,其实是先把数据从用户态(程序内存)拷贝到内核态(系统内存)。为了提高传输效率,此时系统内存不会立即把数据发往接收端,TCP socket会根据优化算法(Nagle算法),将多个时间间隔较小且数据量较小的数据合并成大的数据块,然后封包,一次性从管道发出去。

对于接收方,操作系统内存会先接收到这个数据块,并缓存在内存中,然后应用程序从操作系统内存中提取数据。然而,由于应用程序不知道这个数据块中每个小数据包之间的界限,不知道一次性取多少数据合适,所以有可能这次只取了半个数据包,下次取了3个数据包,这就产生了粘包问题。

剩余的数据会继续存在缓存中,等待应用程序的下次拷贝。此时,发送方会继续从管道中发送数据过来,接收方收到后会与之前操作系统内存中的数据缓存在一起,等待应用程序提取。

TCP协议是面向流的协议,所以接收端接收到的数据是一个整体(可能由多个包合成),或着说是一个流,每个小数据包之间是无边界的,这也是容易出现粘包问题的原因。因此若要解决此问题,需提供科学的拆包机制,把一个大数据包中的小数据包一个个的解封出来。

网络编程-SOCKET开发之----2. TCP粘包现象产生分析的更多相关文章

  1. 第六章|网络编程-socket开发

    1.计算机基础 作为应用开发程序员,我们开发的软件都是应用软件,而应用软件必须运行于操作系统之上,操作系统则运行于硬件之上,应用软件是无法直接操作硬件的,应用软件对硬件的操作必须调用操作系统的接口,由 ...

  2. 网络编程——socket开发

    Socket套接字方法 socket 实例类(8-10分钟) socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) ...

  3. 网络编程-socket开发

    练习: 1.什么是C/S架构? 2.互联网协议是什么?分别介绍五层协议中每一层的功能? 3.基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手 4.为何基于tcp协议的通信比基于u ...

  4. 练习题|网络编程-socket开发

    1.什么是C/S架构? C指的是client(客户端软件),S指的是Server(服务端软件),C/S架构的软件,实现服务端软件与客户端软件基于网络通信. 2.互联网协议是什么?分别介绍五层协议中每一 ...

  5. TCP粘包拆包问题分析及应对方案

    粘包拆包问题是处于网络比较底层的问题,在数据链路层.网络层以及传输层都有可能发生.我们日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP ...

  6. 02网络编程( socket套接字+TCP粘包 )

    目录 02 网络编程 一.socket套接字编程 二.简易代码模板 2.1 服务端 2.2 客户端 三.通信循环及代码优化 四.黏包现象 五.struct模块 六.简易版本报头 七.上传文件数据 * ...

  7. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  8. 网络编程-SOCKET开发之----3. socket通信工作流程

    1. TCP的socket通信流程 服务端 1)socket----创建socket对象. 2)bind----绑定本机ip+port. 3)listen----监听来电,若在监听到来电,则建立起连接 ...

  9. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...

随机推荐

  1. MySql的Communications link failure解决办法

    在使用JDBC连接mysql时可能会遇到以下错误: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications li ...

  2. Tree POJ - 1741【树分治】【一句话说清思路】

    因为该博客的两位作者瞎几把乱吹(" ̄︶ ̄)人( ̄︶ ̄")用彼此的智慧总结出了两条全新的定理(高度复杂度定理.特异根特异树定理),转载请务必说明出处.(逃 Pass:anuonei, ...

  3. shell 批量修改较长字符串 字符串内容之间更换位置

    cat 1.txt src='http://img2.tgbusdata.cn/v2/thumb/jpg/MkY5Myw2NTUsMzAzLDksMywxLC0xLDAscms1MCwxOTIuMTY ...

  4. Sql server 用T-sql读取本地数据文件dbf的数据文件

    第一步启用Ad Hoc Distributed Queries  在SQLserver执行以下的语句: exec sp_configure 'show advanced options',1 reco ...

  5. C# - 引用类型

    引用类型(Reference Type) C#是一门使用OOP技术的编程语言(Object Oriented Programming 面向对象编程)面向对象最重要的特性就是接口.继承.多态 C#中所有 ...

  6. Linux服务器查看外网IP地址的命令

    可以直接输入如下几个命令:1.curl ifconfig.me2.curl cip.cc3.curl icanhazip.com4.curl ident.me5.curl ipecho.net/pla ...

  7. ARDUINO驱动LCD1602 (利用库函数)

    LCD 1602简介 工业字符型液晶,能够同时显示16x02即32个字符.(16列2行) 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母.数字.符号等的点阵型液晶模块.它由若干个5X7或 ...

  8. windows下Qt5.1 for android开发环境配置

    1.下载安装Qt 5.1.0 for Android (Windows 32-bit, 716 MB)   http://qt-project.org/downloads 2.打开Qt Creator ...

  9. 使用chrome开发者工具中的performance面板解决性能瓶颈

    前面的话 使用Chrome DevTools的performance面板可以记录和分析页面在运行时的所有活动.本文将详细介绍如何使用performance面板解决性能瓶颈 准备 [匿名模式] 匿名模式 ...

  10. ROS与C++

    构建工作空间 catkin_make 构建Catkin包 catkin_create_pkg # This is an example, do not try to run this # catkin ...