【TCP】粘包问题 以及 异常处理

2023-09-18 22:40:08

粘包问题 以及 异常处理

一. 粘包问题

注意:不仅 TCP 存在粘包问题,其他面向字节流的机制也存在粘包问题

  • 首先要明确,粘包问题中的 “包” ,是指的应用层的数据包
  • 在TCP的协议头中,没有如同UDP一样的 “报文长度” 这样的字段。
  • 站在传输层的角度,TCP是一个一个报文过来的。按照序号排好序放在接收缓冲区中。
  • 接着传输层对报文进行分用,意味着把 TCP 报文进行解析,取出其中的应用层数据,放到缓冲区中,以备应用层来取。
  • 站在应用层的角度,看到的只是一串连续的字节数据
  • 那么应用程序看到了这么一连串的字节数据,就不知道从哪个部分开始到哪个部分,是一个完整的应用层数据包,这就是 粘包问题。

那么如何避免粘包问题呢?归根结底就是一句话,明确两个包之间的边界

  • 对于定长的包,保证每次都按固定大小读取即可;

  • 对于变长的包,可以在包头的位置,约定一个包总长度的字段,从而就知道了包的结束位置;
    在这里插入图片描述

  • 对于变长的包,还可以在包和包之间使用明确的分隔符(应用层协议,是程序猿自己来定的,只要保证分隔符不和正文冲突即可);

在这里插入图片描述

TCP 报头中不是有说明数据长度的字段么 ?

  1. 首先,TCP 报头中没有说明数据长度的字段,TCP 报头中只有首部的长度,TCP 报文 - 首部长度 就能得到数据的长度,所以传输层能够准确的取出数据。
  2. 虽然 传输层能够 知道数据的长度,但是 应用层去取数据的时候,数据已经被分用了,不带 TCP 报头了,从应用层看就是 一串连续的字节数据, 所以有粘包问题。
    (粘包问题实际上是应用层的问题。)

思考:对于UDP协议来说,是否也存在 “粘包问题” 呢?

  • 对于UDP,如果还没有上层交付数据,UDP的报文长度仍然在。同时,UDP是一个一个把数据交付给应用层。就有很明确的数据边界。
  • 站在应用层的站在应用层的角度,使用UDP的时候,要么收到完整的UDP报文,要么不收。不会出现"半个"的情况。

二. TCP异常情况

  • 进程终止:进程终止会释放文件描述符,仍然可以发送FIN。和正常关闭没有什么区别。
    因为 建立的 TCP 连接,是通过 Socket 建立的,Socket 本质上是进程打开的一个文件,文件就存在于 进程的 PCB 里面的一个文件描述符表,直接杀死进程,PCB 也就没了,此处的 文件相当于自动关闭了,这个过程其实和 手动调用 socket.close() 一样,都会触发 四次挥手。

  • 机器关机/重启:和进程终止的情况相同。因为机器关机 / 重启,会杀死所有的进程。

  • 机器掉电/网线断开:
    操作系统没有任何反应时间,更不会有任何处理措施。
    接收端认为连接还在,一旦接收端有写入操作,接收端发现连接已经不在了,就会进行reset。
    即使没有写入操作,TCP自己也内置了一个保活定时器,会定期询问对方是否还在。如果对方不在,也会把连接释放。

在这里插入图片描述

另外,应用层的某些协议,也有一些这样的检测机制。例如HTTP长连接中,也会定期检测对方的状态。例如QQ,在QQ断线之后,也会定期尝试重新连接。

好啦! 以上就是对 TCP 粘包问题 以及 异常处理的讲解,希望能帮到你 !
评论区欢迎指正 !

更多推荐

<图像处理> Harris角点检测

Harris角点检测原理Harris角点检测是一种计算机视觉中常用的角点检测算法,用于在图像中检测出角点特征。角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。Harris角点检测算法是最常用且最基础的角点检测算法之一。Harris角点检测算法的原理是通过计算图像中每个像素点的响

spring security auth2.0实现

OAuth2.0的认证/授权流程jwt只是认证中的一步4中角色资源拥有者(resourceowner)、客户端(client第三方)、授权服务器(authorizationserver)和资源服务器(resourceserver)。AuthorizationCode(授权码模式):OAuth2的授权模式,客户端先将用户

【STM32学习】I2C通信协议 | OLED屏

🐱作者:一只大喵咪1201🐱专栏:《STM32学习》🔥格言:你只管努力,剩下的交给时间!今天需要将代码烧录到开发板中,本喵默认大家都会创建工程,以及进行基本的外设配置。I2C通信协议|OLED屏😽I2C协议🙈数据格式🙈I2C信号时序🙈I2C驱动代码😽OLED显示🙈SSD1306🙈SSD1306的I2

Vue的插值、指令、过滤器、计算属性及监听属性,包涵所有基础技术

目录一、插值1.1讲述1.2实例二、指令2.1概述2.2案例三、过滤器3.1讲述3.2实例四、计算属性&监听属性(1)计算属性(2)监听属性(3)购物车案例带给我们的收获一、插值1.1讲述Vue的插值是一种将数据动态绑定到HTML模板中的方式。通过插值,可以将Vue实例中的数据直接显示在HTML模板中,实现数据与视图的

图像相似度识别算法aHash|dHash|PHash

图像相似度识别算法aHash|dHash|PHashaHash算法基本原理优缺点python实现dHash算法基本原理优缺点python代码实现aHash\pHash\dHash是常用的图像相似度识别算法,原理简单、实现方便。aHash算法Hash算法进行图片相似度识别的本质,就是将图片进行Hash转换,生成一组二进制

Docker安装MongoDB

1、查看当前可用版本dockersearchmongo#通过该命令查看可用的MongoDB版本2、获取最新的mongodb镜像dockerpullmongo3、查看镜像dockerimages4、在宿主机上创建需要挂载的文件#创建文件mkdir-p/docker/mongodb/{data,logs}#在准备挂载的目录

【Mysql】MySQL 设计开发规约

MySQL设计开发规约以下规范在大型互联网公司经过了充分的验证,尤其适用于并发量大、数据量大的业务场景。安全无小事,很多公司都曾经因为数据泄露导致用户损失惨痛,所以将安全规范放到了第一位。一、安全规范1.【强制】禁止在数据库中存储明文密码,需把密码加密后存储。说明:对于加密操作建议由公司的中间件团队基于如mybatis

2023年8月京东美妆工具行业数据分析(京东数据运营)

近日,随着李佳琦为花西子品牌怒怼网友一事持续发酵,消费者的目光逐渐转移到这个国货美妆品牌昂贵的单克价格上。“一克眉笔价格高于一克黄金”,引发了不少消费者的讨论与吐槽。花西子眉笔事件尚未平息,在9月12日,一网友晒出之前自己买的花西子化妆刷,实付款919元。套刷是玉石化妆刷(5件套),人造纤维毛,目前官方旗舰店已没有售卖

设计模式之职责链模式

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这些系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。ConcreteHandler

将自己的代码发布成可以pip安装的包

要将自己的Python代码打包并通过pip进行安装,可以按照以下步骤进行操作:创建一个新的文件夹,并将您的Python代码放入其中。确保您的代码结构是标准的Python包结构,即包含__init__.py文件和其他可能的模块文件。结构示例:your_package_name/__init__.pymodule1.pym

2023世界元宇宙大会进行时,智汇云舟携视频孪生技术与产品亮相

9月20日-22日,由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办的“2023第二届世界元宇宙大会”在上海隆重举行。智汇云舟作为探索元宇宙前沿科技的优秀企业代表受邀参会,并携视频孪生技术与产品在特装展区惊艳亮相。图:大会现场智汇云舟展位本届大会以“虚实相生、产业赋能”为主题,邀请到110多位国内外专家、院士和

热文推荐