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

news2024/11/7 15:39:35

为什么说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连接请求)状态

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

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

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

相关文章

92.【C语言】数据结构之单向链表的查找,中间插入和删除,销毁

目录 1.链表的查找函数 2.链表的修改函数 3.链表的中间插入函数 1.在pos之前插入:SLTInsertBefore函数 1.借助头指针pphead 示意图 代码示例(写入SList.c) 头文件添加SLTInsertbefore的声明 main.c的部分代码改为 1.测试中间插入 2.测试头部插入 3.测试pos为NULL的…

无人机救援系统基本组成

无人机救援系统基本组成 1. 源由2. 组成2.1 无人机载具2.1.1 多旋翼2.1.2 垂起固定翼2.1.3 智能避障2.1.4 物资投递 2.2 智能吊舱2.2.1 云台2.2.2 高清摄像2.2.3 红外热成像2.2.4 激光测距2.2.5 目标跟踪 2.3 通讯链路2.3.1 超长距离通信2.3.2 长距离通信2.3.3 中等距离通信 2.…

普通高考预报名上传蓝底证件照手机自拍方法详解

普通高考预报名过程中,上传一张合规的蓝底证件照是必不可少的一步。本文将详细介绍如何使用手机自拍并使用工具来制作符合要求的蓝底证件照。注意,目前仅有广东等个别省份允许特定类型考生使用自拍照上传(例如普高预报名阶段、学考报名&#…

linux 原子操作

首先是为什么要有 原子操作 网上的截图: 不能从C语言来看,要从汇编来看 但是实际的情况有可能是这样。 A进程没有得到想要的结果。 然后是 原子操作的 底层实现 最终会是这段代码,当然只是一个 加一的操作。 static inline void atomic_a…

ComfyUI新神器ComfyUI-Detail-Daemon:一键提升AI绘画细节,Flux模型画质再升级

近日,一款名为ComfyUI-Detail-Daemon的革命性插件正在AI绘画圈引起轰动。这款由Jonseed开发的工具,巧妙地将sd-webui-Detail-Daemon移植到ComfyUI平台,为创作者们带来了前所未有的细节优化体验。 这款插件最引人注目的特点是其强大的细节增强…

Qt/C++地图导航app/支持qml/手机运行/输入起点终点规划路径/模拟轨迹移动

一、前言说明 搞Qt地图开发这块,随着研究的深入,用户的需求变化,最近又需要在手机上运行,由于本地图组件依赖浏览器控件,而手机安卓上的Qt并没有带qwebengine控件,怎么办呢,不断的努力验证下&a…

优优嗨聚集团:正确了解个人债务过多的危害

在当今社会,随着消费观念的转变和金融产品的多样化,个人债务问题日益凸显。许多人为了追求更高的生活质量或应对突发情况,不自觉地陷入了债务的泥潭。然而,个人债务过多不仅会影响个人的财务状况,还可能对生活和心理产…

Pycharm,2024最新版Pycharm现在安装环境配置汉化详细教程!

码(文末附带精品籽料): K384HW36OBeyJsaWNlbnNlSWQiOiJLMzg0SFczNk9CIiwibGljZW5zZWVOYW1lIjoibWFvIHplZG9uZyIsImxpY2Vuc2VlVHlwZSI6IlBFUlNPTkFMIiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IiIsIm…

聚水潭数据集成MySQL:高效组合装商品查询案例

聚水潭数据集成到MySQL:组合装商品查询案例分享 在现代企业的数据管理中,如何高效、准确地实现不同系统之间的数据集成是一个关键问题。本文将聚焦于一个具体的技术案例:将聚水潭的组合装商品数据集成到MySQL数据库中,以便在BI狄…

MYSQL多表查询、函数、索引和事务思维导图

MySQL多表查询和函数 MySQL窗口函数 MySQL循环、游标、索引、事务

Vue3 学习笔记(八)Vue3 语法-Class 与 Style绑定详解

在 Vue.js 中,动态地绑定 CSS 类和样式是一项常见的需求。Vue 提供了几种不同的方法来实现这一点,包括对象语法、数组语法和组件的作用域插槽。 以下是这些方法的详细说明: 一、Class 绑定 1、对象语法 对象语法允许根据表达式的真值动态地切…

头歌——人工智能(机器学习 --- 决策树2)

文章目录 第5关:基尼系数代码 第6关:预剪枝与后剪枝代码 第7关:鸢尾花识别代码 第5关:基尼系数 基尼系数 在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益率…

WPF+Mvvm案例实战(五)- 自定义雷达图实现

文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造:2、按钮添加:3、依赖注入 3、运行效果4、源代码获…

【CSS】——基础入门常见操作

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:CSS引入 二:CSS对元素进行美化 1:style修饰 2:选…

Jmeter基础篇(19)JSR223预处理器

前言 JSR223预处理器是Apache JMeter中的一个组件,它允许用户使用任何支持Java Scripting API (JSR 223) 的脚本语言来执行预处理任务。这个功能非常强大,因为它让测试人员能够利用如Groovy、JavaScript(Nashorn引擎)、BeanShell…

Github 2024-10-24 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Solidity项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:…

从0到1,用Rust轻松制作电子书

我之前简单提到过用 Rust 做电子书,今天分享下如何用Rust做电子书。制作电子书其实用途广泛,不仅可以用于技术文档(对技术人来说非常方便),也可以制作用户手册、笔记、教程等,还可以应用于文学创作。 如果…

私有化视频平台EasyCVR视频汇聚平台接入RTMP协议推流为何无法播放?

私有化视频平台EasyCVR视频汇聚平台兼容性强、支持灵活拓展,平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、平台级联等视频能力。 有用户反馈,项目现场使用RTMP协议接入EasyCVR平台,但是视频却不…

51单片机应用开发(进阶)---外部中断(按键+数码管显示0-F)

实现目标 1、巩固数码管、外部中断知识 2、具体实现:按键K4(INT1)每按一次,数码管从0依次递增显示至F,再按则循环显示。 一、共阳数码管 1.1 共阳数码管结构 1.2 共阳数码管码表 共阳不带小数点0-F段码为&#xff…

【简道云 -注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…