1、TCP粘包问题的产生(发送端)

  由于TCP协议是基于字节流并且无边界的传输协议,因此很容易产生粘包问题。TCP的粘包可能发生在发送端,也可能发生在接收端。发送端的粘包是TCP协议本身引起的,TCP为了提高传输效率,发送方经常要收集到足够多的数据后才发送一个TCP段;若连续多次需要send()的数据都很少,此时TCP会根据优化算法将这些数据整合成一个TCP段后在发送,但接收方并不知道要一次接收多少字节的数据,此时就产生发送端的TCP粘包,具体图示如下:

  2、粘包问题产生的原因

  (1)套接字本身有缓冲区大小的限制(发送缓冲区、接收缓冲区)

  (2)TCP传送的端MSS大小有限制

  (3)链路层也有MTU大小限制,如果数据包大小>MTU,在IP层进行分片,导致数据分割

  (4)TCP的流量控制和拥塞控制,也可导致粘包

  (5)TCP延迟确认机制

  3、解决方案

  (1)定长包

  (2)包尾加\r\n

  (3)报文长度+报文内容,自定义包结构

  (4)复杂的应用层协议

查漏补缺:socket编程:TCP粘包问题和常用解决方案(上)的更多相关文章

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

    一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...

  2. Socket编程--TCP粘包问题

    TCP是个流协议,它存在粘包问题 产生粘包的原因是: TCP所传输的报文段有MSS的限制,如果套接字缓冲区的大小大于MSS,也会导致消息的分割发送. 由于链路层最大发送单元MTU,在IP层会进行数据的 ...

  3. python/socket编程之粘包

    python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...

  4. Python全栈-网络编程-TCP粘包

    一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...

  5. TCP粘"包"问题浅析及解决方案Golang代码实现

    一.粘"包"问题简介 在socket网络编程中,都是端到端通信,客户端端口+客户端IP+服务端端口+服务端IP+传输协议就组成一个可以唯一可以明确的标识一条连接.在TCP的sock ...

  6. TCP 粘包问题浅析及其解决方案

    最近一直在做中间件相关的东西,所以接触到的各种协议比较多,总的来说有TCP,UDP,HTTP等各种网络传输协议,因此楼主想先从协议最基本的TCP粘包问题搞起,把计算机网络这部分基础夯实一下. TCP协 ...

  7. TCP 粘包 - 拆包问题及解决方案

    目录 TCP粘包拆包问题 什么是粘包 - 拆包问题 为什么存在粘包 - 拆包问题 粘包 - 拆包 演示 粘包 - 拆包 解决方案 方式一: 固定缓冲区大小 方式二: 封装请求协议 方式三: 特殊字符结 ...

  8. socket编程解决粘包和丢包问题

    ##socket 丢包粘包解决方式 采用固定头部长度(一般为4个字节),包头保存的是包体的长度 header+body 包头+包体 下面的例子不是按照上图中规定的格式编写的,但是思路都是一样的,先读出 ...

  9. 【游戏开发】网络编程之浅谈TCP粘包、拆包问题及其解决方案

    引子 现如今手游开发中网络编程是必不可少的重要一环,如果使用的是TCP协议的话,那么不可避免的就会遇见TCP粘包和拆包的问题,马三觉得haifeiWu博主的 TCP 粘包问题浅析及其解决方案 这篇博客 ...

随机推荐

  1. ant design vue 时间选择器只能到最大日期

    <a-date-picker :disabledDate="disabledEndDate"  style="width: 100%" placehold ...

  2. windows之anaconda导入torch失败和pip install命令执行read time out

    昨天用jupyter导入torch还好好的呢,今天用就不行了,先是ImportError: DLL load failed: 找不到指定的模块.再是No such comm target regist ...

  3. pandas(一)

    pandas.io 1.概述,主要从txt,json,pkl,csv,excel中读取数据,读取的数据最终转化为pandas.core.frame.DataFrame类型的df 先来看总的api fr ...

  4. [HNOI2019]序列(单调栈+二分)

    通过打表证明发现答案就是把序列划分成若干段,每段的b都是这一段a的平均数.50分做法比较显然,就是单调栈维护,每次将新元素当成一个区间插入末尾,若b值不满足单调不降,则将这个区间与单调栈前一个区间合并 ...

  5. XEN 3166

    XEN 3166 这题原题是spj,校oj上只用判断yes no,不过也差不多 题意分析之后就是求两个东西: 字典序最小的长度为m的子序列 同时这个字典序严格大于某个字符串 用序列自动机 先尽量相同, ...

  6. Linux保护机制

    RELRO(RELocation Read Only) 在Linux中有两种RELRO模式:"Partial RELRO" 和 "Full RELRO".Lin ...

  7. ac_查看每个用户登陆服务器所使用的时间

    ac 如果你想知道每个用户登录服务器所使用的时间,你可以使用 ac 命令.这个命令需要你安装acct 包(Debian)或 psacct 包(RHEL,Centos). 如果我们想知道所有用户登陆服务 ...

  8. JavaScript之Date常用知识点

    1.new Date(dateStr) :把字符串转换为Date对象 参数: ①dateStr {string} :可转换为Date对象的字符串(可省略时间):字符串的格式主要有两种: 1) yyyy ...

  9. [LC] 767. Reorganize String

    Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...

  10. 47)PHP,数据库多表连接

    https://www.w3cschool.cn/mysql/56ik1sqv.html