当前位置: 首页 > news >正文

为什么说Tcp是面向字节流的以及(Tcp粘包问题、TCP/UDP对比、listen函数的backlog参数的意义)

为什么说Tcp是面向字节流的:

Tcp通信的本质是创建一个tcp的socket,同时就会对应的创建一个发送缓冲区和接收缓冲区。

  • 调用write时, 数据会先写入发送缓冲区中;
  • 如果发送的字节数太长, 会被拆分成多个TCP的数据包发出
  • 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去
  • 接收数据的时候, 数据也是从网卡驱动程序到达内核的接收缓冲区;然后应用程序可以调用read从接收缓冲区拿数据;
  • 另一方面, TCP的一个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这一个连接, 既可以读数据, 也可以写数据. 这个概念叫做 全双工
  • 而其中的缓冲区,因为本质就是数组,而从数组上进行读、写操作,和河流比较像在流中进行数据的读取和写入!

Tcp协议的粘包问题

tcp协议将数据都放到了缓冲区中,而缓冲区中具体有几个报文是不确定的(因为发送的数据可大可小,可能一次报文就能把数据全部发过来,也可能一次只能发送半个 。。。),所以就类似于粘着的样子,对此我们就需要将数据分出来
对此就需解决上述问题,方案:

  1. 对于变长的包, 还可以在包和包之间使用明确的分隔符(应用层协议, 是程序猿自己来定的, 只要保证分隔符不和正文冲突即可在。报文特殊字符(\r\n)。
  2. 对于定长的包, 保证每次都按固定大小读取即可; 例如上面的Request结构, 是固定大小的, 那么就从缓冲区从头开始按sizeof(Request)依次读取即可。定长报文(确定报文长度)。
  3. 通过组合的策略解决问题
  4. 而对于UDP来说就不会有这种问题,因为UDP有明确的数据边界,并且站在应用层来看使用UDP的时候要么收到完整报文,要么不收。

TCP/UDP对比

  • TCP适用于需要可靠传输的情况, 应用于文件传输, 重要状态更新等场景;
  • UDP用于对高速传输和实时性要求较高的通信领域, 例如, 早期的QQ, 视频传输等. 另外UDP还可以用于广播
  • 各自有各自的优点,TCP的可靠性是中性词表示着它们适用于不同的场景。

用UDP如何实现可靠传输(经典面试题)

其实就是参考TCP协议实现可靠性的办法

  1. 超时重传,若隔一段时间后没收到应答,就重发数据
  2. 序列号,确保数据顺序,以及去除重复的数据
  3. 确认应答,确认数据确实发送过去

连接其他机器指令:telnet

telnet + ip + port

TCP层面相关实验理解listen的第二个参数backlog

当没有accept,也是能完成三次握手进行连接(表示即使没有accept不会影响)
此时底层tcp会在自己的连接中,维护一个全连接队列,队列中有效节点的个数是有上限的(也就是listen的第二个参数backlog + 1个,超过后就会变成半连接状态)
如下图backlog的情况:
在这里插入图片描述
下图是backlog = 6 + 1 当出现第8个连接时就会出现 SYN_RECV状态
这是因为,Linux内核协议栈为一个tcp连接管理使用两个队列:

  1. 半链接队列(用于保存处于SYN_SENT和SYN_RECV状态的请求)
  2. 全链接队列(Accept队列)用于保存established状态,但是应用层没有调用accept取走的请求

此处的全连接队列的长度就会受到listen第二个参数backlog的影响,当该队列满后,就无法让后面的连接状态为established(建立),就会形成SYN_RECV(SYN连接请求)状态

在这里插入图片描述
该半连接状态并不会持续很久,它会等待一会尝试连接,当有全连接状态退出时,就能变成全连接状态,否则就会消失

相关文章:

为什么说Tcp是面向字节流的以及(Tcp粘包问题、TCP/UDP对比、listen函数的backlog参数的意义)

为什么说Tcp是面向字节流的: Tcp通信的本质是创建一个tcp的socket,同时就会对应的创建一个发送缓冲区和接收缓冲区。 调用write时, 数据会先写入发送缓冲区中;如果发送的字节数太长, 会被拆分成多个TCP的数据包发出如果发送的字节数太短, 就会先在缓冲…...

Flink PostgreSQL CDC源码解读:深入理解数据流同步

目录 一、PostgreSQL的数据捕获和复制机制 二、WAL日志格式 三、Debezium部署架构 3.1 Kafka Connect With Debezium 3.2 Debezium Server ​编辑3.3 作为嵌入式引擎 四、Flink Postgres CDC源码解读 4.1. 如何捕捉数据和更新快照 4.2. 捕获的数据怎么从Postgres SQL…...

系统架构设计师 软件架构的定义与生命周期

软件架构的定义 通过一系列的设计活动,以满足系统的功能性需求和符合一定的非功能性需求与质量属性有相似含义的软件系统框架模式。在软件体系结构设计过程中,主要考虑的是系统的非功能性需求 软件体系结构设计经验的总结与重用是软件工程的重要目标之一…...

从零开始使用Surya-OCR最新版本0.6.1——最强文本检测模型:新添表单表格检测识别

目录 一、更新概述 二、环境安装 1.基础环境配置 2.模型参数下载 3.参数地址配置——settings.py 三、指令使用 1.命令指令运行 一、更新概述 surya项目Github地址:https://github.com/VikParuchuri/surya 号称今年最强OCR的surya近期迎来新的更新,Vik…...

linux中级wed服务器(https搭建加密服务器)

一。非对称加密算法: 公钥:公共密钥,开放 私钥:私有密钥,保密 1.发送方用自己的公钥加密,接受方用发送方的私钥解密:不可行 2.发送方用接受方的公钥加密,接受方用自己的私钥解密…...

聊一聊为什么企业数字化转型总是三天热度

听到“数字化转型”,是不是脑子里立马蹦出各种炫酷词汇:AI、大数据、物联网、区块链……瞬间觉得公司马上就要起飞?可惜,现实往往是:转型刚刚起步时大家热血沸腾,结果没过多久一哄而散。最终,这…...

2025年NPDP产品经理认证考试时间和报考条件

在报考2025年NPDP认证考试前,了解NPDP相关考试信息是非常重要的,可以帮助我们更好地制定备考计划,提高学习效率。 NPDP考试时间 NPDP考试每年举办两次,分别在5月和11月进行,且考试一般安排在周末,以便在职的专业人士…...

微信小程序文字转语音播报案例

插件申请 在小程序官方申请同声传译插件,地址: mp.weixin.qq.com 引入插件 在app.json中加入 "plugins": {"WechatSI": {"version": "0.3.6","provider": "wx069ba97219f66d99"}},封装…...

QT SSDP 局域网检测支持扫描通信

一. 什么是SSDP? 简单服务发现协议(SSDP,Simple Service Discovery Protocol)是一种应用层协议,简单服务发现协议是在HTTPU和HTTPMU的基础上实现的协议。简单服务发现协议(SSDP)提供了在局域网里面发现设备的机制。客户端可以通过使用SSDP,根据自己的需要,在局域网查找特…...

python_学习2(仅为本人学习记录)

二、变量与字符串 1、变量的声明和赋值 a.变量在使用前必须要先赋值 b.删除变量,可以通过del语句删除。 a123 del a c.链式赋值 xy123 相当于 x123;y123 d.解包赋值 a,b,c1,2,3 相当于 a1 b2 c3 使用解包赋值给变量交换值:a,b3,4 a,bb,a 2、基本…...

手动将python的flask程序打包成exe在windows上执行

1、安装pyinstaller工具 (venv) PS D:\django\locallibrary> pip install pyinstaller Collecting pyinstallerDownloading pyinstaller-6.11.0-py3-none-win_amd64.whl.metadata (8.4 kB) Requirement already satisfied: setuptools>42.0.0 in d:\django\locallibrary…...

老生常谈,MySQL事务隔离级别

在 MySQL 关系型数据库中,事务隔离级别主要有以下四种: 1)读未提交(READ UNCOMMITTED): 这是最低的隔离级别,在该级别下,一个事务可以看到另一个事务尚未提交的数据修改。这可能会…...

百度翻译以及另外三款翻译工具推荐!!!

在这个全球化的时代,翻译工具已经成为我们生活中不可或缺的一部分。我们需要使用翻译工具来克服语言障碍,无论是出国旅行、商务谈判还是学术研究。那么,市场上有各种各样的翻译工具。有哪些好用的在线翻译软件呢?别担心&#xff0…...

Redis JSON介绍和命令大全

Redis JSON介绍和命令大全 Redis JSON先说说JSON是什么再说说JSON Path先推荐两个网站JSONPath JAVA clents Redis JSON 安装内存json命令语法命令url命令解释JSON.ARRAPPENDJSON.ARRINDEXJSON.ARRINSERTJSON.ARRLENJSON.ARRPOPJSON.ARRTRIMJSON.CLEARJSON.DEBUG MEMORYJSON.DE…...

yolo自动化项目实例解析(八)自建UI-键鼠录制回放

项目中关于键鼠的操作,不像我们之前自动化那样一步一步去定义的,而是用C写了一个记录键鼠的操作,通过回放的方法来实现的 一、通讯系统 1、创建websocket服务器 首先通过事件循环asyncio 和websockets,创建一个持久化的服务端进程…...

C++ 面向对象知识汇总(超详细)

学习交流:0voice GitHub 1.什么是类? 在C中,类(Class) 是一种用户定义的数据类型,用来描述具有相同特征和行为的一组对象。类是面向对象编程(OOP)的核心概念,它通过将…...

stm32使用SIM900A模块实现MQTT对接远程服务器

SIM900A模块是一种GSM/GPRS无线通信模块,它可以通过SIM卡连接移动通信网络,并通过串口或USB接口与微控制器或计算机进行通信。 SIM900A驱动代码如下: #include "stm32f10x.h" #include "stdio.h" #include "stdlib.h" #include "sim900a…...

MATLAB Simulink (一)直接序列扩频通信系统

MATLAB & Simulink (一)直接序列扩频通信系统 写在前面1 系统原理1.1 扩频通信系统理论基础1.1.1 基本原理1.1.2 扩频通信系统处理增益和干扰容限1.1.3 各种干扰模式下抗干扰性能 1.2 直接序列扩频通信系统理论基础1.2.1 基本原理1.2.2 物理模型 2 方…...

标准数字隔离器主要特性和应用---腾恩科技

在现代电子系统中,不同电路部分之间需要可靠的隔离,尤其是在高压环境或必须保持敏感信号完整性的情况下。一种这样的解决方案是使用标准数字隔离器。这些组件在电路的不同部分之间提供电气隔离,确保安全、降噪和可靠的信号传输。本文深入探讨…...

Spring事务的七种传播行为

Spring事务的七种传播行为 1.事务的传播行为是什么?2.具体传播行为2.1 REQUIRED ,默认,存在事务则加入该事务,不存在则新建一个事务2.2 REQUIRES_NEW,每次新开启事务,新老事务相互独立2.3 NESTED&#xff0…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【2025年】解决Burpsuite抓不到https包的问题

环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...