| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> TCP粘包和分包问题 原因探究 及 解决办法 -> 正文阅读 |
|
[网络协议]TCP粘包和分包问题 原因探究 及 解决办法 |
处理办法一般在进行Socket开发时,都会遇到数据包粘包和分包的问题。 而解决该问题的办法需要分两种情况: 1. 对于可允许自定义协议的,可以在应用层自定义一个协议格式: 消息头部 + 消息长度 + 消息正文 + 消息校验 +消息尾部 2.?对于不允许自定义协议的,可以在应用层自定义一个比较大的缓冲区: 先将收到的数据包都放到缓冲区中,然后从该缓冲区中选取完整的数据包出来。该缓冲区的实现可以使用环形缓冲区进行优化,避免频繁的数据移动。 关于分包和粘包示例粘包:发送方分别发送两个字符串”hello”+”world”,接收方却一次性接收到了”helloworld”。 分包:发送方一次性发送字符串”helloworld”,接收方却接收到了两个字符串”hello”和”world”。 socket特性一般TCP协议能保证以下两点:
因此以上两点成为我们解决分包、黏包问题的关键。 TCP为什么会分包TCP是以段(Segment)为单位发送数据的,建立TCP链接后,有一个最大消息长度(MSS)。如果应用层数据包超过MSS,就会把应用层数据包拆分,分成两个段来发送。这个时候接收端的应用层就要拼接这两个TCP包,才能正确处理数据。 相关的,路由器(或以太网)有一个MTU( 最大传输单元),一般是在46-1500字节,除去IP头部20字节,留给TCP的就只有MTU-20字节。所以一般TCP的MSS为MTU-20=1460字节。 当应用层数据超过1460字节时,TCP会分多个数据包来发送。
TCP为什么会粘包有时候,TCP为了提高网络的利用率,会使用一个叫做Nagle的算法。该算法是指,发送端即使有要发送的数据,如果很少的话,会延迟发送。如果应用层给TCP传送数据很快的话,就会把两个应用层数据包“粘”在一起,TCP最后只发一个TCP数据包给接收端。 以下部分为转载:https://www.iteye.com/blog/zhaohuiopensource-1541270 备注: ?
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 23:37:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |