javaEE 初阶 — 传输层 TCP 协议中的异常情况与面向字节流的粘包问题

news2024/11/6 9:37:49

文章目录

  • 1 粘包问题
    • 1.1 什么是粘包问题
    • 1.2 如何解决粘包问题
  • 2 异常情况

TCP 的十个特性

确认应答机制

超时重传机制

连接管理机制

滑动窗口

流量控制与拥塞控制

延迟应答与捎带应答

1 粘包问题

1.1 什么是粘包问题


面向字节流引入了一个比较麻烦的粘包问题。




这里张三和小红进行了多次的交互,张三的接收缓冲区,其实是把刚才这里收到的多个数据都放到一起了。


如果应用程序调用 read 方法读取的时候,该读到那里才算是一个完整的应用层数据报呢?


由于 TCP 是字节流的,一次读一个字节或是读多个字节都是可以的。
这就导致一次读到数据有可能是半个应用层数据报,可能是一个应用层数据报,也有可能是多个应用层数据报。

就好比,过年吃饺子的时候,碗里如果没放饺子汤。过了一会儿,一碗饺子就会粘到一起了。
这个时候夹一筷子,就有可能夹到半个饺子,有可能夹到一个饺子,也有可能夹到多个饺子。
这个现象就叫做 粘包问题




应用程序调用 read 方法,此处的 read 方法就是InputStream 里的 read 方法。

如果读的是 6 个字节,此时就正好读到了 aaaaaa,这是一个完整的应用层数据报。
如果读的是 10 个字节,此时读到的是 aaaaaabbbb,此时读到的是 “一个半” 的应用层数据报。
如果读的是 4 个字节,此时读到的 aaaa ,此时读到的就是 半个应用层数据报。

在 TCP 层次中,没有 socket api 中告诉我们应该读几个字节和具体怎么读,这完全是程序猿自己决定的。

1.2 如何解决粘包问题


我们期望的当然是读到一个完整的应用层数据报,因为这样后续才好处理。

既然是应用层,约定好应用层协议即可,尤其是明确好应用层数据报个应用层数据报之间的边界就好了。

有两个方案:

1、约定好分隔符

2、约定好每个包的长度

这两种方法二者取一即可。

采取分隔符的方法就是,在一个完整的数据报末尾加上一个例如 \n 这样的符号来进行分割。
设计分割符的时候,不能是要发送的数据报包含的吗,这样会造成误读。



约定长度就是,提前算好每个数据报的长度。

2 异常情况


异常情况,也就是传输过程中出现了不可抗力。

这里分为四个情况:

1、进程崩溃了

如果是进程没了,对应的 PCB 就没了,对应的文件描述符表就释放了,相当于是 socket.close()。
此时内核会继续完成四次挥手,此时其实仍然是一个正常断开的流程。


2、主机关机(按照正常情况关机)

主机关机要先杀进程,然后才正式关机。(杀死进程的过程中,也是和上面一样触发四次挥手)


3、主机掉电

假设是接收方掉电了,发送方仍然在继续发数据,发完数据要等待 ACK ,不过肯定是等不到的。
这个时候引发超时重传,不过肯定再怎么重传也是收不到 ACK 的,重传几次后,还没有应答,此时尝试 重置 tcp 连接。
显然这个重置也会失败,此时就会放弃连接了。(单方面放弃了)

假设是发送方掉电了,接收方发现没数据了。
此时站在接收方的角度看待,没发数据是发送方挂了?还是发送方要组织下语言,稍等会再发?
接收方是不知道的,此时会先等会儿。接收方会周期性的给发送方发送一个消息确认下对方是否还是工作正常的。


给发送方周期性的发送一条消息的这个操作叫做 保活机制,发送的消息形象的称为心跳包,因为心跳也是周期性的,
如果心跳无了,说明就寄了。

心跳包来确认通信双方是处于正常的工作状态中。


4、网线断开

这个和主机掉电是一样的,只不过一个主机是接收方掉电了,作为发送方的主机会尝试超时重传,最后放弃连接。
另一个主机是发送方掉电了,会尝试心跳包的方式来确认对方是否还是正常工作的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BXC6332A第二代智能头盔方案助力电动车市场,为安全保驾护航

随着2020年6月1日起,公安部交管局在全国开展“一盔一带”安全守护行动,摩托车、电动车驾驶人乘车人按照规定正确使用头盔,是保障司乘安全的一道重要屏障,据统计,摩托车、电动自行车驾乘人员死亡事故中约80%为颅脑损伤致…

基于RK3588的嵌入式linux系统开发(三)——Uboot镜像文件合成

本章uboot镜像文件的合成包括官网必备文件rkbin下载和uboot镜像文件合成两部分内容,具体分别如下所述。 (一)下载rkbin文件包 以上uboot编译生成的uboot镜像不能直接烧录到板卡中运行,需要与atf、bl31、ddr配置文件等必备文件合成…

自动化测试工具_Jmeter

【课程简介】 接口测试是测试系统组件间接口的一种测试,接口测试天生为高复杂性的平台带来高效的缺陷监测和质量监督能力,平台越复杂,系统越庞大,接口测试的效果越明显。在接口测试大行其道的今天,测试工具也愈发重要,Jmeter作为一款纯 Java 开发的测试…

【刷题笔记】--二分查找binarysearch

当给一个有序的数组,在其中查找某个数,可以考虑用二分查找。 题目1: 二分查找的思路: 设置left和right指针分别指向要查找的区间。mid指针指向这个区间的中间。比较mid指针所指的数与target。 如果mid所指的数小于target&…

C语言——自定义类型:结构体,枚举,联合(详解)

1.结构体 1.1结构体类型的基础知识 结构体类型是一些值的集合,这些值被称为成员变量,成员变量可以是不同类型的变量。 1.2结构体类型的声明 结构体的声明格式如下: struct tag//tag表示标签名 {member-list;//成员列表//由1或者多个成员组成…

Hadoop01【尚硅谷】

大数据学习笔记 大数据概念 大数据:指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决,海量数据的存储…

iOS开发AppleDeveloper中给别人授权开发者权限后,对方一直显示不了我的开发账号team

在iOS开发经常出现多人协作开发的情况。这时我们通常要发邮件邀请别的用户为开发者或者app管理就可以开发我们自己的项目了。但是这次我给别人授权开发者权限后,发现别人权限中没有证书相关权限如图:并且别人登录该账号后,在xcode中只有一个看…

【办公类-16-09】“2022下学期 大班运动场地分配表-跳过节日循环排序”(python 排班表系列)

样例展示:跳过节日的运动场地循环排序表(8个班级8组内容 下学期一共20周)背景需求:上学期做过一次大班运动场地安排,跳过节日。2023.2下学期运动场地排班(跳过节日)又来了。一、场地器械微调二、…

雅利安人有多强悍?灭掉三个文明古国,为何败在殷商的脚下

转自:雅利安人有多强悍?灭掉三个文明古国,为何败在中国脚下 (baidu.com)这个民族民风彪悍;这个民族曾一度将四大文明古国中的三个——古埃及、古印度、古巴比伦尽数消灭;这个民族甚至被称为“文明粉碎机”;…

EasyExcel的使用

这里写目录标题先导入依赖最简单的写最简单的读項目开发中的一些操作xml一定要默認放先导入依赖 <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version><…

lombok的原理 和 使用

原理Lombok能以简单的注解形式来简化java代码&#xff0c;提高开发人员的开发效率。其实并没有改变字节码文件的任何内容&#xff0c;只是简化的程序员编写代码的方式。不使用lombok&#xff1a;使用lombok&#xff1a;lombok常用注解Setter &#xff1a;注解在类或字段&#x…

【面试总结】Linux篇·操作及原理篇

【面试总结】Linux篇原理篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型4.如何在Linux上配置一个IP地址5.Linux负载是什么&#xff1f;6.Linux中的软链接和硬链接有什么区别&#xff1f;1.介绍一下inode 硬盘的最小存储单位是扇区(Sector)&#xf…

2自由度悬架LQR控制

目录 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 1.3 路面激励 2.仿真分析 2.1simulink模型 2.2 仿真结果 2.3 结论 3. 总结 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 其中&#xff1a;x1为悬架动扰度&#xff0c;x2为车身加速度&#xff0c;x3为轮胎…

红黑树的历史和由来。

一个数组&#xff0c;1,2,3,4,5,...n; 一共n个数字。1、直接查找想要查询第n个数字&#xff0c;直接搜索&#xff0c;就是n次查询。ps:那么问题来了&#xff0c;这样查询也太慢了&#xff0c;有什么改进的呢&#xff1f;2、二分查找这个时候&#xff0c;二分查找更快。不过就是…

python中的.nc文件处理 | 04 利用矢量边界提取NC数据

利用矢量边界提取.nc数据 import osimport numpy as np import pandas as pd import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature import seaborn as sns import geopandas as gpd import earthpy as et import xarray as xr # …

渲染有问题?怎么办?6种方法让你渲染无忧

简单点&#xff0c;解决问题的方式简单点。 日常工作中我们总会遇到各种各样的问题&#xff0c;比如渲不出图&#xff0c;速度太慢或效率太低&#xff0c;各种噪点和黑图等等&#xff0c;烦不胜烦&#xff0c;今天我就针对6个常见的问题给大家说下方法&#xff0c;一家之言仅供…

ASP .NET(基于.NET 6.0)源码解读

这几天一直在琢磨在我现有技术认知基础上&#xff0c;未来如何做技术提升。 日思夜想&#xff0c;我整理出了我自己的一套学习规划方案&#xff0c;并希望在实施过程中能够不断调整学习方案与方式&#xff0c;以接近自我提升的效率最大化。 从以下几个大的方面来得到提升&…

特征检测之HOG特征算法详解及Opencv接口使用

1. HOG特征简介 特征描述符是图像或图像补丁的表示形式&#xff0c;它通过提取有用信息并丢弃无关信息来简化图像。 通常&#xff0c;特征描述符将大小W x H x 3&#xff08;通道&#xff09;的图像转换为长度为n的特征向量/数组。对于 HOG 特征描述符&#xff0c;输入图像的…

ChatGPT会让程序员失业?ChatGPT:“ 是友军,我不从事任何职业。

毫无疑问&#xff0c;ChatGPT“出圈”了。 它似乎无所不能。 许多人担忧它是否会取代自己的饭碗&#xff0c;唯恐自己的进步赶不上 AI 的发展。 然而&#xff0c;有人在试用几次之后&#xff0c;又算是松了口气&#xff1a;打工人我呀&#xff0c;工作算是保住啦~ 那么&…

Lesson5.3---Python 之 NumPy 统计函数、数据类型和文件操作

一、统计函数 NumPy 能方便地求出统计学常见的描述性统计量。最开始呢&#xff0c;我们还是先导入 numpy。 import numpy as np1. 求平均值 mean() mean() 是默认求出数组内所有元素的平均值。我们使用 np.arange(20).reshape((4,5)) 生成一个初始值默认为 0&#xff0c;终止…