返回顶部
首页 > 资讯 > 后端开发 > Python >说说 TCP的粘包、拆包
  • 318
分享到

说说 TCP的粘包、拆包

tcp/ip网络网络协议 2023-09-05 06:09:51 318人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

分析&回答 拆包和粘包是在Socket编程中经常出现的情况, 在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。如果通讯的一端发送的数据包超过一次tcp

分析&回答

拆包和粘包是在Socket编程中经常出现的情况,

  • 在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包
  • 如果通讯的一端发送的数据包超过一次tcp报文所能传输的最大值时,就会将一个数据包拆成多个最大tcp长度的tcp报文分开传输,这就叫做拆包

MTU

泛指通讯协议中的最大传输单元。一般用来说明TCP/IP四层协议中数据链路层的最大传输单元,不同类型的网络MTU也会不同,我们普遍使用的以太网的MTU是1500,即最大只能传输1500字节的数据帧。可以通过ifconfig命令查看电脑各个网卡的MTU。

MSS

指TCP建立连接后双方约定的可传输的最大TCP报文长度,是TCP用来限制应用层可发送的最大字节数。如果底层的MTU是1500byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte。

TCP粘包/拆包发生的原因

问题产生的原因有三个,分别如下。

  • 应用程序write写入的字节大小大于套接口发送缓冲区大小;
  • 进行MSS大小的TCP分段;
  • 以太网帧的payload大于MTU进行IP分片。

粘包问题的解决策略

由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,可以归纳如下。

  1. 消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
  2. 在包尾增加回车换行符进行分割,例如FTP协议;
  3. 将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路为消息头的第一个字段使用int32来表示消息的总长度;
  4. 更复杂的应用层协议。

喵呜面试助手:一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

来源地址:https://blog.csdn.net/jjclove/article/details/127392357

--结束END--

本文标题: 说说 TCP的粘包、拆包

本文链接: https://lsjlt.com/news/394786.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 说说 TCP的粘包、拆包
    分析&回答 拆包和粘包是在socket编程中经常出现的情况, 在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。如果通讯的一端发送的数据包超过一次tcp...
    99+
    2023-09-05
    tcp/ip 网络 网络协议
  • Netty解决 TCP 粘包拆包的方法
    什么是粘包/拆包        一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。TCP通讯为何存在粘...
    99+
    2024-04-02
  • Netty如何解决TCP 粘包拆包
    小编给大家分享一下Netty如何解决TCP 粘包拆包,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是粘包/拆包    ...
    99+
    2023-06-20
  • php的tcp粘包和拆包怎么实现
    今天小编给大家分享一下php的tcp粘包和拆包怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。tcp 长链接模式下,使...
    99+
    2023-07-04
  • 分享一个php的tcp粘包/拆包例子
    本文给大家介绍一个例子,有关PHP的tcp 粘包/拆包,希望对需要的朋友有所帮助~tcp 长链接模式下,使用固定消息头长度的方式进行消息 拆包 ,解决 粘包 问题。 固定消息头协议将消息头的前 N 个字节固定为 消息长度位 ,结合业务场景,...
    99+
    2023-05-14
    php
  • go语言如何处理TCP拆包/粘包
    这篇文章主要讲解了“go语言如何处理TCP拆包/粘包”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言如何处理TCP拆包/粘包”吧!part 1最近在学习go自带的rpc,看完了一遍想着...
    99+
    2023-06-22
  • go语言处理TCP拆包/粘包的具体实现
    目录part 1part 2part 3part 1 最近在学习go自带的rpc,看完了一遍想着自己实现一个codec,也就是自定义消息的序列化和反序列化。消息的序列化和反序...
    99+
    2022-06-07
    GO go语言
  • 解决TCP粘包/拆包问题的方法及示例
    TCP粘包和拆包是网络编程中常见的问题,特别是在数据传输的过程中,可能会发生将多个数据包粘在一起或将一个数据包拆成多个数据包的情况,这可能会导致应用程序无法正确解析数据,从而造成数据错误或系统故障。本文将介绍TCP粘包和拆包的原因、解决方案...
    99+
    2023-09-25
    网络 服务器 tcp/ip c# 网络协议
  • Netty粘包拆包及使用原理详解
    目录为什么使用Netty框架Netty框架介绍Netty实战Netty编写服务器端Netty客户端粘包与拆包为什么使用Netty框架 NIO的类库和API繁杂,使用麻烦,你需要熟练掌...
    99+
    2022-11-13
    Netty 粘包拆包 Netty 原理
  • workerman 自定义的协议如何解决粘包拆包
    前言:         由于最近在使用 workerman 实现 Unity3D 联机游戏的服务端,虽然也可以通过 TCP 协议直接通信,但是在实际测试的过程中发现了一些小问题。         比如双方的数据包都是字符串的方式吗,还有就因...
    99+
    2023-09-07
    TCP粘包拆包 workerman unity3d PHP网游服务
  • Golang通过包长协议处理TCP粘包的问题解决
    目录tcp粘包现象代码重现tcp粘包问题处理方法tcp粘包产生的原因这里就不说了,因为大家能搜索TCP粘包的处理方法,想必大概对TCP粘包有了一定了解,所以我们直接从处理思路开始讲起...
    99+
    2024-04-02
  • workerman怎么自定义协议解决粘包拆包问题
    这篇“workerman怎么自定义协议解决粘包拆包问题”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“workerman怎么自...
    99+
    2023-07-04
  • oracle 11gR2 安装包说明
    ORACLE 11G 从官网上下载下来有7个包:第1,2两个包是oracle database 安装包,同时集成了oracle RAC . 在安装数据库时需要同时下载解压这两个包到一个目录。 第三...
    99+
    2024-04-02
  • Office兼容性包ServicePack2的说明
    Office兼容性包Service Pack 2是Microsoft Office套件的一个升级补丁,旨在增强Office软件与其他...
    99+
    2023-09-12
    Office
  • Office兼容性包SP3的说明
    Office兼容性包SP3是Microsoft Office软件的一项更新补丁,旨在提高Office软件与其他应用程序、操作系统和文...
    99+
    2023-09-12
    Office
  • MYSQL 各个安装包说明
    Enterprise Edition和Community Edition以下内容是一样的! Dependency relationships exist among some of the pack...
    99+
    2024-04-02
  • golang strings包的Replace的使用说明
    函数声明: func Trim(s string, cutset string) string 官方描述: 返回将 s 前后端所有 cutset 包含的 utf-...
    99+
    2024-04-02
  • golang 中signal包的Notify用法说明
    函数声明为: func Notify(c chan<- os.Signal, sig ...os.Signal) 官方描述: Notify函数让signal包将输入信号转...
    99+
    2024-04-02
  • Oracle内建包UTL_FILE使用说明
    在数据库的开发中,当PL/SQL语句很复杂的时候,我想写一些Log,就像java的Log4j那样。这样就可以很好的跟踪程序的运行情况。在网上找到的文章不是很好用,修改了一下。 1:在Oracle服...
    99+
    2024-04-02
  • Request的包装类HttpServletRequestWrapper的使用说明
    目录Request的包装类HttpServletRequestWrapper使用大致的意思是:上述方案解决了HttpServletRequestWrapper和HttpServlet...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作