IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP粘包半包问题和解决,成为阿里P7Android架构师到底有多难 -> 正文阅读

[网络协议]TCP粘包半包问题和解决,成为阿里P7Android架构师到底有多难

什么是TCP粘包半包?

首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,传输层,应用层。其中TCP在传输层,IP在网络层,我们一般的应用程序如浏览器,使用的HTTP协议则工作在应用层。

在TCP/IP规范里,数据是分包发送的,每一层都有自己的分包格式和大小。比如我们通过浏览器上网时,在我们这边会发生什么事情呢?

网络中传输的数据包由两部分组成:一部分是本层协议所要用到的首部,另一部分是上一层传过来的数据。首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。于是在通信上,我们发出的任何一个请求都要经过以下几步:

① 应用程序处理
首先浏览器会将数据进行编码处理,编码为HTTP协议所规定的报文格式。

② TCP 模块的处理
TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。

③ IP 模块的处理
IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,根据路由控制表决定接受此 IP 包的路由或主机。

④ 网络接口(以太网驱动)的处理
从 IP 传过来的 IP包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
经过层层转发后,服务器就会收到我们的请求报文,经过4-3-2-1的顺序将网络上传递的数据包再变成我们服务端程序可以处理的数据,整个过程如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVDG36xk-1630586587732)(TCP粘包半包问题和解决\数据包发送流程.png)]

但是在实际发送时有可能发生所谓的粘包和半包这种现象,比如:

假设客户端分别发送了两个数据包D1和D2给服务端,可能存在以下4种情况。

(1)服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和半包;

(2)服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;

(3)服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP半包;

(4)服务端分两次读取到了两个数据包,第一次读取到了D1包的部分内容D1_1,第二次读取到了D1包的剩余内容D1_2和D2包的整包,这样同时存在着TCP粘包和TCP半包。

TCP粘包半包产生的原因

从前面的描述我们知道,TCP/IP每一层都有自己的分包格式和大小,每一层都存在着将上一层发给自己的报文按本层格式进行拆分的可能。

所以,细分起来,原因包括:

1、进行MSS大小的TCP分段。MSS是最大报文段长度的缩写,它是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。

2、如果IP层有一个数据包要传,而且数据的长度比链路层的大,那么IP层就会进行分片,把数据包分成若干片,以方便链路层进行传输。注意,分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

【附】相关架构及资料

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

tps://codechina.csdn.net/m0_60958482/android_p7)**

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:18:17  更:2021-09-03 12:18:33 
 
开发: 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年12日历 -2024/12/28 21:32:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计