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

2023.9.11 关于传输层协议 UDP和TCP 详解

目录

UDP协议

TCP协议

TCP十大核心机制 

确认应答

超时重传

连接管理(三次握手 四次挥手)

滑动窗口

流量控制

拥塞控制

延时应答

捎带应答

面向字节流

粘包问题

TCP 中的异常处理

经典面试题

对比 TCP 和 UDP 

如何使用 UDP 实现可靠传输


UDP协议

源端口:

  • 指发送方的端口号

目的端口:

  • 指接收方的端口号

注意:

  • 端口号都是用两个字节来表示的,也就是16个比特位,也就是能表示 0~65535 的端口号范围
  • 其中 0~1023 端口称为 知名端口号,这些端口号已经分配给了一些广泛使用的知名应用程序,所以当我们自己进行端口的绑定时,得从 1024 端口号开始!

UDP报文长度:

  • UDP报文 长度为 2 个字节,所以可以表示一个 UDP数据报 的长度范围为 0~65535 字节,也就是  0~64 KB 的数据

如果应用层数据报超过了 64KB 我们有两种方式解决!

  • 在应用层通过代码将应用层数据报进行手动分包,拆分成多个包,通过多个 UDP数据报  进行传输
  • 不用 UDP协议 进行传输,换成 TCP协议 传输,因为TCP是面向字节流的,无长度限制

建议使用第二种方式,因为第一种需要写大量代码进行分包,从而增加我们的工作量

校验和:

  • 网络传输的本质就是利用光信号或电信号所进行传播的
  • 不排除会受到一些物理环境的影响导致出现 1变0 抑或是 0变1 的比特翻转情况
  • 从而引入 校验和 来对数据内容进行校验,来验证数据是否传输出错

TCP协议

注意:

  • 这里的 端口号 与 UDP 一样
  • 这里的 校验和 与 UDP 一样
  • TCP报文长度 = TCP报头 + TCP载荷
  • TCP 报头长度是可变的,不像 UDP 固定为 8 个字节
  • 因为 选项 表示对 TCP报文 的一些属性进行解释说明,这个可有可无
  • 首都长度 描述TCP报头 具体多长
  • 选项之前的部分(绿框部分)是固定长度为 20个字节
  • 所以 首部长度 - 20字节 = 选项长度
  • 此处的 首部长度 为 4 bit位,表示范围为 0~15
  • 首部长度的单位为 4字节
  • 如果首部长度数值为 5,表示整个 TCP 报头为 20 字节,此时没有 选项
  • 如果首部长度数值为 10,表示整个 TCP 报头为 40 字节,此时 选项 长度为 20 字节
  • 这里 保留位(6位) 是为 TCP协议 未来可能进行关键字扩展而所保留位置

TCP十大核心机制 

确认应答

通俗解释:
  • 指 发送方在发送数据后等待接收方发送确认消息,以确保消息已经被正确接收

  • TCP将每个字节的数据进行了编号,也就是序列号


超时重传

通俗解释:
  • 指在规定的时间阈值内没有收到对应的 确认ACK 或 响应 ,发送方会认为数据包已丢失或损坏,并重新发送该数据包

注意:
  • 如果是 ACK 丢失,那么将会导致 主机A 传输重复数据给 主机B 
  • 当然 TCP 对于这种重复数据,是能够进行去重的
  • 因为 TCP 存在一个类似 接收缓冲区 的存储空间,为 接收方 操作系统内核的一段内存
  • 主机B 的网卡接收数据,将其放入 主机B 的接收缓冲区中
  • 后续程序使用 getInputStream 进行 read 操作,即从接收缓冲区中读取数据
  • 接收缓冲区 会更具接收到的数据序号进行重排序,保证 read操作 读取的数据为有序的
  • 这时便会根据数据的序号,来进行判重,如果序号重复,则后来的数据将被直接丢弃,保证 read 操作读取的数据一定不重复

当然如果连续重传达到一定次数时,就不会继续重传,而会认为网络出现故障,从而 TCP 将会断开重连,如果重连失败,则直接断开连接

总结:
  • 可靠传输时 TCP 最核心的部分
  • 确认应答为 TCP报文传输顺利的情况
  • 超时重传为 TCP报文传输出错的情况
  • 二者相互配合,保障了 TCP 的可靠性

连接管理(三次握手 四次挥手)

建立连接(三次握手)

基本知识:
  • 建立连接一般为 双方互相向对方申请建立连接 和 双发互相回应对方,这样看是四次交互,但是 TCP 建立连接的过程将其中两个进行了合并,从而变为三次交互

  • 之所以能够合并,是因为 主机B 发送 SYN 和 ACK 是同一时机的,是系统内核中完成的,应用程序无法感知,当 主机B 的系统内核 收到 SYN 之后,会立即发送 ACK 同时也会立即发送 SYN,从而能够合并发送

三次握手的意义:
  • 让通信双方各自建立对对方的认同(保存对方的信息)
  • 验证通信双方各自的发送能力和接收能力是否正常
  • 检查当前网络情况是否通畅(建立连接的过程不传输任何业务数据)
  • 同步双方的初始序列号,并在建立连接后基于这些序列号进行数据传输
  • 在握手的过程中,双方协商一些重要的参数,如窗口大小(用于流量控制和拥塞控制)

断开连接(四次挥手)

基本知识:
  • 四次挥手 是不能将 ACK 和 FIN 合并发送的!
  • 因为 合并发送的前提是 处于同一时机,因为 ACK是由系统内核控制的,当 主机B 收到 FIN 时,会立即发送 ACK,而 FIN 是由应用程序所控制,仅当调用到 socket 的 close 方法 抑或 进程退出,才会触发 FIN 的发送,所以 ACK 和 FIN 的发送并不处在同一时机,而是会有一段时间差,从而不能合并发送

注意:
  • 三次握手和四次挥手也会进行超时重传
  • 面试的时候尽量画图来进行说明,不要口头描述!

滑动窗口

  • 滑动窗口机制 的本质是 不等待的批量发送一组数据然后用一份时间来等待着一组数据的多个 ACK 从而降低了确认应答等待 ACK 消耗的时间

  • 可靠性 和 传输效率 是相互矛盾的,而滑动窗口机制 仅是保证可靠性的基础上,尽量的提高传输效率
丢包问题:

  • 快速重传 为 超时重传 的一种 特殊情况
  • 如果当前传输数据密集,按照滑动窗口的方式来传输,此时按照 快速重传 来处理丢包,只重传丢失了的数据,而不会在 1001~2000 数据发生丢包之后,将 主机A 传输给 主机B 如 2001~7000 的数据再重新传一遍,因为该部分数据 主机B 是接收到了的!
  • 如果当前传输数据稀疏,不按照滑动窗口的方式来传输,此时便按照之前的 超时重传 处理丢包
注意: 
  • 虽然窗口越大,传输效率就越高,但是窗口也不能无限大
  • 窗口无限大,也就相当于完全不等待 ACK 了,此时不能保证 TCP 的可靠性
  • 窗口过大,其所消耗的系统资源也会相应扩大
  • 窗口过大,导致发送数据过快,接收方处理速度跟不上来,相当于白发

流量控制

  • 一种干预发送窗口大小的机制

  • 发送窗口大小不是固定值,而是随着传输过程的进行,动态调整的


拥塞控制

  • 流量控制 和 拥塞控制 共同决定发送方的窗口大小(取二者的较小值)
  • 流量控制 考虑 接收方处理能力
  • 拥塞控制 考虑 传输过程中 中间节点 的 处理能力
基本思路:

具体思路:

  • 拥塞窗口不是固定数值,一直是动态变化的,随着时间的推移,逐渐达到平衡的过程

延时应答

  • 基于 流量控制,引入提高效率的机制

具体思路:
  • 窗口越大,网络吞吐量就越大,传输效率就越高,保证网络不拥塞的情况下尽量提高传输效率

理解示例:

  • 接收缓冲区大小为 1M,一开始接收到 600K 的数据,如果立即返回的窗口大小则为 400K
  • 但是如果 接收缓冲区 仅用 50ms 就将 600K 数据快速处理完毕,此时让 接收端 延迟一会再返回 ACK,则返回的窗口大小就变大为 1M
  • 扩大了窗口的大小,从而提高了传输效率

捎带应答

  • 基于 延迟应答,引入提高效率的机制

注意:

  • 能够合并传输的前提是 此处的 ACK 与 业务相应 处于 同一时机 发送
  •  延迟应答 将合并传输的概率提高

面向字节流

粘包问题

解决方案:

  • 约定 分隔符号,如 使用 " ;" 作为数据报的结束标志

  • 约定 每个包的长度,如 在数据包开头位置声明长度


TCP 中的异常处理

进程崩溃

  • 相当于进程没有了,对应的系统会回收系统资源,包括释放文件描述符 表,相当于 执行了 socket 的 close 方法 ,在内核执行 四次挥手 操作,正常断开连接

主机关机

  • 主机关机前需将 进程 删除,然后才正式关机,跟上述的进程崩溃的过程一样

主机掉电

  • 接收方掉电:发送方仍继续发送数据,发完等待 ACK ,等不到 ACK,进行 超时重传,仍然接收不到 ACK,则重置 TCP 连接(复位报文段:RST),重置连接失败,放弃连接
  • 发送方掉电:接收方等待接收数据,与此同时 接收方 会给 发送方 周期性地发送一个 心跳包 (该包不携带任何业务数据),以此来确认 通信双方 处在正常的工作状态之中,该机制称为 保活机制

网线断开

  • 同上述主机掉电

经典面试题

对比 TCP 和 UDP 

  • TCP 适合对可靠性有要求的场景
  • UDP 适合对可靠性要求不高 且 对传输效率要求高的场景(如 机房内网传输,对传输效率要求高,其本身不易丢包)

如何使用 UDP 实现可靠传输

思路:

  • 考察 TCP 保证可靠性的几大核心机制

具体答法:

  • 引入序列号 保障 数据顺序
  • 引入确认应答,保障 接收端 接收到了数据
  • 引入超时重传,保障 数据未被接收 仍能重新传输丢失数据
  • 等等

相关文章:

2023.9.11 关于传输层协议 UDP和TCP 详解

目录 UDP协议 TCP协议 TCP十大核心机制 确认应答 超时重传 连接管理(三次握手 四次挥手) 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 粘包问题 TCP 中的异常处理 经典面试题 对比 TCP 和 UDP 如何使用 UDP 实现可靠传…...

thinkphp8路由

thinkphp8已出来有好一段时间了。这些天闲来无事,研究了下tp8的路由。默认情况下,tp8的路由是在route\app.php的文件里。但在实际工作中,我们并不会这样子去写路由。因为这样不好管理。更多的,是通过应用级别去管理路由。假如项目…...

Python统计pdf中英文单词的个数

之前的文章提供了批量识别pdf中英文的方法,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文上。以及自动pdf英文转中文文档,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文下。    本文实现python统计pdf中英文字符的个数。 文章目录 一、要统计字符的pdf…...

Kindle电子书下载功能关闭怎么办,借助calibre和cpolar搭建私有的网络书库公网访问

Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说! 文章目录 Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网…...

ubuntu、linux in window安装docker教程

1、首先进入管理员权限。 2、更新软件源。 sudo apt update 3、安装一些依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 4、为系统添加Docker的密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-k…...

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记 反正都有学不完的技术,不如就学一学clickhouse吧 文章目录 clickhouse学习笔记clickhouse的特点1.列式存储2. DBMS 的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行 clickhouse安装1.关闭防火墙2.CentOS 取消打开文件数限制3.安装依…...

STM32 驱动

led 驱动 led头文件 #ifndef _LED_H #define _LED_Hvoid LED_Init(void); void LED_ON(void); void LED_OFF(void); void LED_Turn(void);#endifled代码 #include "stm32f10x.h" void LED_Init(void) {//START CLOCKRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO…...

JavaScript系列从入门到精通系列第五篇:JavaScript中的强制类型转换包含强制类型转换之Number,包含强制类型转换之String

文章目录 前言 一:强制类型转换 1:强制类型转换为String (一):方式一:调用被转换类型的toString()方法 (二):方式二:调用String函数 2:强制类型转换为Number (一):方式一&…...

动力节点老杜JavaWeb笔记(全)

Servlet 关于系统架构 系统架构包括什么形式? C/S架构B/S架构C/S架构? Client / Server(客户端 / 服务器)C/S架构的软件或者说系统有哪些呢? QQ(先去腾讯官网下载一个QQ软件,几十MB,然后把这个客户端软件安装上去,然后输入QQ号以及密码,登录之后,就可以和你的朋友聊…...

【微信小程序开发】宠物预约医疗项目实战-注册实现

【微信小程序开发】宠物预约医疗项目实战-注册实现 第二章 宠物预约医疗项目实战-注册实现 文章目录 【微信小程序开发】宠物预约医疗项目实战-注册实现前言一、打开项目文件二、编写wxss代码2.1 什么是wxss2.2 配置主程序全局样式 三. 在sign文件下的wxml文件中编写如下代码并…...

聚观早报 | 飞书签约韵达速递;蔚来首颗自研芯片“杨戬”量产

【聚观365】9月22日消息 飞书签约韵达速递 蔚来首颗自研芯片“杨戬”10月量产 靳玉志接任华为车 BU CEO 亚马逊发布全新Alexa语音助手 OpenAI推出图像生成器DALL-E 3 飞书签约韵达速递 近日,国内物流服务公司韵达快递宣布全员上飞书。飞书解决方案副总裁何斌表…...

zookeeper + kafka

Zookeeper 概述 Zookeeper是一个开源的分布式服务管理框架。存储业务服务节点元数据及状态信息,并负责通知再 ZooKeeper 上注册的服务几点状态给客户端 Zookeeper 工作机制 Zookeeper从设计模式角度来理解: 是一个基于观察者模式设计的分布式服务管理框架&…...

wordpress添加评论过滤器

给wordpress添加评论过滤器,如果用户留言包含 "http" (可以为任意字符串) 就禁止提交评论。 function filter_comment_content($comment_data) {$comment_contents $comment_data["comment_content"]; //获取评论表单的内容字段if (stripos($…...

工具篇 | Gradle入门与使用指南

介绍 1.1 什么是Gradle? Gradle是一个开源构建自动化工具,专为大型项目设计。它基于DSL(领域特定语言)编写,该语言是用Groovy编写的,使得构建脚本更加简洁和强大。Gradle不仅可以构建Java应用程序&#x…...

Wireshark TS | MQ 传输缓慢问题

问题背景 应用传输慢是一种比较常见的问题,慢在哪,为什么慢,有时候光从网络数据包分析方面很难回答的一清二楚,毕竟不同的技术方向专业性太强,全栈大佬只能仰望,而我们能做到的是在专注于自身的专业方向之…...

flink集群与资源@k8s源码分析-回顾

本章是分析系列最后一章,作为回顾,以运行架构图串联起所有分析场景 1 启动集群,部署集群(提交k8s),新建作业管理器组件 2 构建和启动flink master组件 3 提交作业,N/A...

学习心得09:C++新特性

现在语言越来越复杂,关键字也越来越多。所以我提出了关键字自动加标识的想法。 这些新特性也都是有用的,一般人也用不上。在这方面,我的主张是:除非你确实需要用到新特性,否则尽量不要用。保证了代码的可维护。 C很复杂…...

前端框架vBean admin

文章目录 引言I 数据库表设计1.1 用户表1.2 角色表1.3 菜单表II 接口引言 文档:https://doc.vvbin.cn/guide/introduction.html http://doc.vvbin.cn 仓库:https://github.com/vbenjs/vue-vben-admin git clone https://github.com/vbenjs/vue-vben-admin-doc 在线体验demo:…...

云原生周刊:Grafana Beyla 发布 | 2023.9.18

开源项目推荐 Komiser Komiser 是一个与云无关的开源资源管理器。它与多个云提供商(包括 AWS、Azure、Civo、Digital Ocean、OCI、Linode、腾讯和 Scaleway)集成,构建云资产库存,并帮助您在资源层面分解成本。 kr8s 这是一个用…...

C++ std::unique_lock 用法

文章目录 1.创建 std::unique_lock 对象2.自动加锁和解锁3.延迟加锁与手动加解锁4.尝试加锁5.配合条件变量使用6.小结参考文献 std::unique_lock 是 C11 提供的一个用于管理互斥锁的类,它提供了更灵活的锁管理功能,适用于各种多线程场景。 1.创建 std::u…...

Pytorch C++ 前端第二部分:输入、权重和偏差

本教程分为两部分 第 2.1 部分 – 基础知识速成课程。第 2.2 部分 – 使用 C++ 构建神经网络如果您已经了解神经网络的基础知识,那么无需阅读 Part-2.1 的内容,理解 Part-2.2 应该没有问题。我们试图通过动画 GIF 来可视化方程,从而使其简短而有趣。但请注意,我们根据在解释…...

面试题:RocketMQ 如何保证消息不丢失,如何保证消息不被重复消费?

文章目录 1、消息整体处理过程Producer发送消息阶段手段一:提供SYNC的发送消息方式,等待broker处理结果。手段二:发送消息如果失败或者超时,则重新发送。手段三:broker提供多master模式,即使某台broker宕机…...

uniapp打包安卓后在安卓屏上实现开机自启动

实现开机自启动(使用插件) 打开插件地址安卓开机自启动 Fvv-AutoStart - DCloud 插件市场 使用方法 选择你要开启自启动的项目 在项目的manifest.json中app-plus下写入以下代码 注意需要替换 android_package_name 为自己的,不然无法进行安卓apk打包 "nativePlugins&q…...

浅谈KNX总线智能照明控制系统在北京南站房中的应用

安科瑞 华楠 摘要:本文简要介绍了i-bus EIB/KNX智能建筑控制系统的基本原理及在北京南站房中的成功应用。阐述了这一系统强大的系统功能、灵活的控制方式节能效果。 关键词:i-bus智能建筑控制;控制系统;节能 1、工程概况 北京新…...

深入了解Java的核心库

掌握Java的核心库是成为一名优秀的Java开发者的关键。Java提供了丰富的核心库和API,包括集合框架、输入输出、多线程、异常处理等等。熟悉并掌握这些库的使用,可以提高编程效率和代码质量。在本文中,我们将深入讨论Java的核心库,并…...

嵌入式:驱动开发 Day9

作业:通过platform总线驱动实现 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变(按键中断) 例如number0 按下按键number1 ,再次按下按键number0 d.在按下按键的时候需要同时…...

【ComfyUI】安装 之 window版

文章目录 序言步骤下载comfyUI配置大模型和vae下载依赖组件启动 生成图片解决办法 序言 由于stable diffusion web ui无法做到对流程进行控制,只是点击个生成按钮后,一切都交给AI来处理。但是用于生产生活是需要精细化对各个流程都要进行控制的。 故也…...

iMazing 2 .17.9最新官方中文版免费下载安装激活

iMazing 2 .17.9最新版是一款帮助用户管理IOS手机的应用程序,iMazing2最新版能力远超iTunes提供的终极的iOS设备管理器。IMazing与你的iOS设备(iPhone、 iPad或iPod)相连,使用起来非常的方便。作为苹果指定的iOS设备同步工具。 mazing什么意思 iMazing…...

Postman应用——Pre-request Script和Test Script脚本介绍

文章目录 Pre-request Script所在位置CollectionFolderRequest Test Script所在位置CollectionFolderRequest Pre-request Script(前置脚本):可以使用在Collection、Folder和Request中,并在Request请求之前执行,可用于…...

vue2中年份季度选择器(需要安装element)

调用 <!--父组件调用--><QuarterCom v-model"quart" clearable default-current/> 组件代码 <template><div><span style"margin-right: 10px">{{ label }}</span><markstyle"position:fixed;top:0;bottom:0…...

wordpress third主题/最权威的排行榜网站

1、谈理想&#xff1a;希望公司对人类社会进步有贡献 我们希望阿里巴巴是这么一家公司&#xff0c;希望在中国这个土地上诞生一家对世界经济发展、人类社会进步有贡献的公司。所以我们希望招聘进来的员工&#xff0c;大家都充满这个使命&#xff0c;大家都充满着这个理想&…...

常见网站安全漏洞/杭州明开seo

转载请注明&#xff1a;http://blog.csdn.net/xinzhangyanxiang/article/details/9774135 本篇笔记针对ML公开课的第七个视频&#xff0c;主要内容包括最优间隔分类器&#xff08;Optimal Margin Classifier&#xff09;、原始/对偶问题&#xff08;Primal/Dual Problem&#x…...

免费观看电视剧网站/网站发布平台

详细报错信息&#xff1a; Exception in thread “main” org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘bookServiceImpl’ available 报错原因&#xff1a; Service实现类里忘了加注解:Service 代码&#xff1a; 修改前&#xff1a;…...

广州网站设计推荐刻/百度商城官网

NotabilityGoodNotes今天是封面及模板的对比&#xff0c;这点各有优缺点&#xff0c;对我来说都有可取之处。6笔记封面比较上次说goodnotes是可以自己新建笔记本的&#xff0c;这点就比notability更灵活&#xff0c;毕竟很多童鞋不只用它来记笔记 还可以做手账&#xff0c;不过…...

深圳横岗做网站的/app推广策略

转载&#xff1a;https://blog.csdn.net/u011762993/article/details/40898871 一、使用方法 假设创建的对话框的类名是CMyDlg&#xff0c;具体过程如下&#xff1a; 步骤一&#xff1a;在CMyDlg对话框界面单击右键进入对话框的属性设置界面&#xff0c;将Border设置为Resiz…...

JAVA做论坛网站的源代码/百度竞价排名案例分析

NIPS 2000 经典论文翻译。 摘要 非负矩阵分解&#xff08;NMF&#xff09;是一种可以有效处理多变量数据的方法。本文介绍、分析了两种不同的 NMF 算法&#xff0c;这两种算法仅在更新规则&#xff08;update rule&#xff09;中使用的乘性因子&#xff08;multiplicative fact…...