UDP/TCP协议全解
目录
一. UDP协议
1.UDP协议概念
2.UDP数据报格式
3.UDP协议差错控制
二. TCP协议
1.TCP协议概念
2.三次握手与四次挥手
3.TCP报文段格式(重点)
4.流量控制
5.拥塞控制
一. UDP协议
1.UDP协议概念
当应用层的进程1要向进程2传输报文,会将报文转给传输层处理;UDP会在报文前加上一个UDP首部(只占8字节),组成一个UDP数据包;最后再发到网络层,网络层再加上一个IPV4首部,根据这个首部信息找到目的地址;然后主机B收到这个IP数据包以后,进行逆操作
- UDP首部很小,只占8B
- UDP会拒绝过大的报文,因为它每次只能传输一个完整报文,不支持拆分、重装
- UDP无连接、不可靠的(无报错确认机制,由应用层完成),不支持拥塞控制(路由器过载运作,传输数据报的速度不会慢下来)
- UDP支持一对一+一对多(一对一封装成单播IP数据报,一对多封装成广播、多播IP数据报)
UDP一对一的方法与TCP相同
一对多是通过目的IP为 255.255.255.255 (广播IP,往目的网络所有的主机进行数据发送),然后后面加上一整个UDP协议下的数据报。UDP能支持广播很重要的一个原因在于:不需要进行拆分、重装,可以一次性全部传输完;同时,UDP是通过UDP首部中设置目的端口号来寻找目标主机,然后对目的端口的所有主机进行数据传输(TCP也是通过目的端口寻找目标主机,但找到一众目标主机后只能与其中之一进行连接),所以可以通过端口号一次性找到多台目标主机(如下图,主机A要向目的网络的所有端口为711的主机发送消息)
2.UDP数据报格式
UDP长度:声明数据报大小,固定只有16比特(即65535字节,2^15+2^14+……+2^0 = 65535);由于一个IP数据报可以运输的最大数据量是65515字节,因此UDP协议下的数据报最大只能是65535字节;UDP长度应该是UDP首部+报文的大小,不是单指报文大小
UDP校验和:由发送方计算并输入,接收方检验是否错误,全0代表无需校验
3.UDP协议差错控制
检验信息的生成与使用:若有32bit数据信息,相加以后逐位取反;此时数据相加的结果,与取反以后的检验和相加,应该正好为全1(数据为0的地方,检验和肯定为1;数据为1的地方,检验和肯定为0);接收方只要看检验和与数据相加以后是否为全1,如果为全1就代表没出差错;如果最高位产生进位,就需要“回卷”加到最低位
UPD检验的过程:生成检验和前,先在UDP首部前生成一个伪首部;把伪首部、UDP首部与数据部分分以16bit为一组,进行检验和生成;生成了以后去除掉伪首部,通过网络层传输以后,接收方接受了以后也需要生成伪首部,然后判断相加是否为1(具体流程如下图)
IP协议的首部检验和方法与UDP大致相同,只是IP检验和数据部分不参与,UDP检验和要将数据部分也算上;同时,IP进行校验和时不需要添加伪首部
二. TCP协议
1.TCP协议概念
UDP与TCP之别
TCP首部很大且大小可变,要有20字节~60字节;TCP可以对报文进行分组、重装传输,因此可以传输大的报文(类比成分组交换);TCP需要连接(类似于电路交换),且会发送接受成功、接受错误信息 -> 可靠,并且能够进行流量控制,并且只能一对一;TCP传输内容叫做报文段(面向字节流),UDP传输内容叫做数据报(面向整体报文)
TCP特点
n个TCP报文段可能乱序到达接收方,但TCP协议会按序向应用层递交;每次建立TCP连接以后,可以双向传输多个报文;MSS是由通信双方决定的报文段最大段长,TCP不要求报文段满载,只要别超过MSS即可
2.三次握手与四次挥手
注:挥手操作A、B两端谁先结束,谁先释放连接
三次握手
握手1、握手2不能携带数据,但是仍要消耗一个序号;握手3可以携带数据,不携带数据就不消耗序号,此处的序号指的是ack、seq后面的数字;接收端的序号与发送端的区号是可以不一样的,可以理解成两端发送的数据不一样
客户端、服务器进程TCP状态变化如下图所示
四次挥手
挥手1、挥手3即使不携带数据,也要消耗1个序号;挥手2可以携带数据,挥手4不可以携带数据
客户端、服务器进程TCP状态变化如下图所示。MSL指的是最长报文段寿命,1MSL指800ms,2MSL代表1600ms过后客户端才会真正关闭连接
3.TCP报文段格式(重点)
序号(seq):用于标记数据部分第一个字节在原始字节流的位置,起始序号由发送方自己设置(不一定从0开始)
确认号(ack或者ack_seq):用于反馈,表示序号在该确认号之前的所有字节都已正确收到;ACK = 0 时,ack 无效,ACK = 1 时,ack 有效;只有第一次挥手时,ack会是无效的,其他情况下ack都应该有效(若无效则说明出现了差错,例如报文段丢失)
数据偏移(data offset):表示TCP首部长度,以4字节为单位(比如现在的tcp首部只有3字节,那么此时就需要通过后面的填充部分加上1字节),表示形式是字节实际存储用的是比特位
保留:暂时没用,通常全设置为0
填充:被用来解决数据偏移问题,凑足4字节的整数倍
URG(紧急位):只占1bit,为1时表示是紧急数据要尽快插队发送;当该位为1时,会让紧急指针有效,紧急指针存放了紧急数据专用序号
PSH(推送位):为1时希望接收方尽快回复
RST(复位位):为1时表示出现严重差错(例如主机崩溃),必须释放连接;或者需要拒绝一个非法报文段(例如恶意的黑客攻击)
SYN(同步位):为1时表示这是一个连接请求或连接接受报文;只在握手1、握手2中,SYN = 1
FIN(终止位):为1时表示请求释放连接报文;只在挥手1、挥手3中,FIN = 1
窗口(rwnd或者rcvwnd):用作流量控制,假设现在的接受缓冲区还剩下500B空间,那么此时的rwnd = 500(即接收方还能接受多少数据)
检验和:和UDP原理一样
选项(长度可变):协商决定了在握手1、握手2当中,MSS字段大小多少
4.流量控制
窗口大小与MSS大小不一的原因:接受发送的端口,主机的处理能力不一样
如果缓存区域大小为3000字节,那么滑动窗口大小为3000字节,当被占满以后处理了2000字节,此时的滑动窗口大小为2000字节。不同的滑动窗口大小,在回复信息时的rwnd大小都不一样,同时为0时的ACK主要是告诉发送方接受成功。
5.拥塞控制
cwnd是针对发送方而言的,一个限制性的滑动窗口
超时:如果发送了当前窗口大小的数据量,在规定的时间内没有接收到接收方发来的确认好,那么就会超时重传;发送超时重传以后,慢开始的下限值会变成当前滑动窗口的一半大小,然后又开始进入到慢开始阶段
3-ACK:收到了一条数据的三次确认信息,说明有该数据发送失败了;此时停止发送,然后将传输失败的数据快重传;因为并非由于数据过多而导致的传输失败,因此不用进行慢开始;变一半同超时
相关文章:

UDP/TCP协议全解
目录 一. UDP协议 1.UDP协议概念 2.UDP数据报格式 3.UDP协议差错控制 二. TCP协议 1.TCP协议概念 2.三次握手与四次挥手 3.TCP报文段格式(重点) 4.流量控制 5.拥塞控制 一. UDP协议 1.UDP协议概念 当应用层的进程1要向进程2传输报文ÿ…...
nginx 服务启动失败问题记录
背景和问题 systemctl status nginx.service 查看报错信息,显示如下: nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol) nginx: configuration file /etc/nginx/nginx.conf test failed问题分析 这个错误通常…...

Duix.HeyGem:以“离线+开源”重构数字人创作生态
在AI技术快速演进的今天,虚拟数字人正从高成本、高门槛的专业领域走向大众化应用。Duix.HeyGem 数字人项目正是这一趋势下的杰出代表。该项目由一支拥有七年AI研发经验的团队打造,通过放弃传统3D建模路径,转向真人视频驱动的AI训练模型,成功实现了低成本、高质量、本地化的…...

ubuntu22.04安装megaton
前置 sudo apt-get install git cmake ninja-build generate-ninja安装devkitPro https://blog.csdn.net/qq_39942341/article/details/148388639?spm1001.2014.3001.5502 安装cargo https://blog.csdn.net/qq_39942341/article/details/148387783?spm1001.2014.3001.5501 …...
风机下引线断点检测算法实现
风机下引线断点检测算法实现 1. 算法原理 该检测系统基于时域反射法(TDR)原理: 在引线起点注入高压纳秒级脉冲脉冲沿引线传播,遇到阻抗不连续点(断点)产生反射采集反射信号并计算时间差通过小波变换进行信号去噪和特征提取根据传播速度计算断点位置:距离 = (传播速度 时间…...

Windows应用-GUID工具
下载本应用 我们在DirectShow和媒体基础程序的调试中,将会遇到大量的GUID,调试窗口大部分情况下只给出GUID字符串,此GUID代表什么,我们无从得知。这时,就需要此“GUID工具”,将GUID字符串翻译为GUID定义&am…...

vue+element-ui一个页面有多个子组件组成。子组件里面有各种表单,实现点击enter实现跳转到下一个表单元素的功能。
一个父组件里面是有各个子组件的form表单组成的。 我想实现点击enter。焦点直接跳转到下一个表单元素。 父组件就是由各个子组件构成 子组件就像下图一样的都有个el-form的表单。 enterToTab.js let enterToTab {}; (function() {// 返回随机数enterToTab.addEnterListener …...
Spring Boot 启动流程及配置类解析原理
Spring Boot 是一个基于 Spring 框架的开源框架,旨在简化 Spring 应用的配置和部署。通过提供约定优于配置的原则,Spring Boot 大大降低了 Java 企业级应用的开发复杂度。本文将详细介绍 Spring Boot 的启动流程及其配置类的解析原理,帮助开发…...

Vehicle HAL(5)--vhal 实现设置属性的流程
目录 1. ard11 vhal 设置属性的时序图 CarService > vhal > CarService 2. EmulatedVehicleHal::set(xxx) 的实现 本文介绍ard11的vhal属性设置流程图。 1. ard11 vhal 设置属性的时序图 CarService > vhal > CarService 2. EmulatedVehicleHal::set(xxx) 的实现…...

WebRTC中的几个Rtp*Sender
一、问题: webrtc当中有几个比较相似的类,看着都是发送RTP数据包的,分别是:RtpPacketToSend 和RtpSenderVideo还有RtpVideoSender以及RTPSender,这说明什么呢?首先,说明我会很多连词࿰…...

代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、栈与队列总结
150. 逆波兰表达式求值--后缀表达式 力扣题目链接(opens new window) 根据 逆波兰表示法,求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给…...
Java编程课(一)
Java编程课 一、java简介二、Java基础语法2.1 环境搭建2.2 使用Intellij IDEA新建java项目2.3 Java运行介绍2.4 参数说明2.5 Java基础语法2.6 注释2.7 变量和常量一、java简介 Java是一种广泛使用的高级编程语言,最初由Sun Microsystems于1995年发布。它被设计为具有简单、可…...

IDEA202403 设置主题和护眼色
文章目录 背景一、设置主题二、设置背景豆沙绿三、设置控制台颜色 背景 在用IDEA进行开发时,长时间对着屏幕,不费眼是及其重要 一、设置主题 默认的主题是 Dark 暗黑,可更改为其他,如Light 高亮 位置:编辑栏【files…...

无人机螺旋桨平衡方法详解
螺旋桨平衡对于优化无人机性能、可靠性和使用寿命至关重要。不平衡的螺旋桨会产生过度振动,导致推力效率降低、噪音增大,并加速轴承和传感器的磨损。 螺旋桨平衡可通过三种方式实现:静态平衡、动态平衡和气动平衡。 静态与动态平衡是通过在…...
VUE混合开发用哪个PHP框架好?
在 Vue.js 主导前端的混合开发浪潮中,一个强大、灵活的后端 API 提供者至关重要。PHP 作为经久不衰的服务器端语言,拥有众多优秀框架。但哪个才是 Vue 混合开发的黄金搭档?本文将深入分析主流 PHP 框架的优劣,帮你找到最适合的那个…...

基于51单片机的车内防窒息检测报警系统
目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体实现功能: (1)检测车内温度及二氧化碳浓度并用lcd1602实时显示。 (2)当人体红外传感器检测到车内有人,且温度或二氧化碳浓度…...

Flask-Babel 使用示例
下面创建一个简单的 Flask-Babel 示例,展示如何在 Flask 应用中实现国际化和本地化功能。这个示例将包括多语言支持(中文和英文)、语言切换功能以及翻译文本的使用。 项目结构 我们将创建以下文件结构: 1. 首先,创…...
Android 轻松实现 增强版灵活的 滑动式表格视图
表格视图组件,支持: 1. 无标题模式:只有数据行也可以正常滑动 2. 两种滑动模式:固定第一列 或 全部滑动 3. 全面的样式自定义能力 4. 智能列宽计算 1. 无标题模式支持 设置无标题:调用 setHeaderData(null) 或 …...
寄存器模型生成:从手工到自动化
写代码这件事,总是充满了矛盾。你想要完美控制每一个细节,但又希望能够批量生产。寄存器模型的生成,恰恰体现了这种矛盾。 手工编写的局限性 我们完全可以手工编写一个寄存器模型。代码写出来,功能也能实现,看起来一切…...

国标GB28181视频平台EasyGBS视频实时监控系统打造换热站全景可视化管理方案
一、方案背景 在城市供热体系中,换热站作为连接热源与用户的核心枢纽,其运行稳定性直接影响供热质量。面对供热规模扩大与需求升级,传统人工巡检模式暴露出效率低、响应慢、监测不足等问题。基于GB28181协议的EasyGBS视频实时监控系统&…...

docker生命周期
进入容器里面 docker pull ubuntu # 获取ubtuntu镜像 docker run ubtuntu # -i 交互式命令操作,-t 开启一个终端 bash 进入容器后,执行的命令 docker run -it ubtuntu bash...

鸿蒙缺少WMIC missing WMIC
在DecEco Studio中选择模拟器的时候会弹出“可能会导致设备管理功能失效。请检查并安装 WMIC”。 在启动鸿蒙模拟器时报:missing WMIC missing WMIC lt may cause the device management function to fail. Please check and install WMIC. 解决方案:…...
25.6.5学习总结
归并排序(Merge Sort) 1. 概述 归并排序是一种基于分治思想的排序算法。它通过递归的方式,将待排序的数组不断分割成两半,直到每个子数组只剩一个元素(自然排序);然后,将这些子数组…...

Spring Boot 使用 SLF4J 实现控制台输出与分类日志文件管理
概述 在日常的 Java 项目开发中,日志是最重要的调试与排查手段之一。为了便于开发时实时查看,同时在生产中追踪问题,我们通常希望实现以下日志管理目标: ✅ 控制台实时输出日志,方便开发调试✅ 日志根据级别分类保存…...

linux_centos7.x的ifconfig命令显示内容详解
这是一段在Linux系统中执行 ifconfig 命令后得到的网络接口信息输出。ifconfig 命令用于显示或配置网络接口的参数。以下是对输出中各个网络接口信息的详细解释: 1. ens33 接口 状态标志:flags4163<UP,BROADCAST,RUNNING,MULTICAST> 表示…...

CentOS 7 如何pip3安装pyaudio?
CentOS 7 如何pip3安装pyaudio? # 先将yum软件源改为阿里云镜像源 http://mirrors.aliyun.com/centos-vault/7.9.2009/ bash <(curl -sSL https://linuxmirrors.cn/main.sh) # 基于一键换源脚本,全部回车即可# pip3安装模块是从源码构建(…...
6.5本日总结
一、英语 复习默写list8list21,订正翻译07年第二篇阅读 二、数学 学习线代第一讲 三、408 学习计组2.2,写计组习题 四、总结 这篇阅读全对,整体题目不算难,但是对文意的翻译差点,后续要多练习句子翻译 五、明日…...

【个人笔记】数据库原理(西电)
第一章 ER图和关系分解见课本p69 ER图是常用的 概念模型 方形:实体圆形:属性菱形:关系 常用的逻辑模型 说白了:增删改查 几种数据模型的基本概念 层次模型:树状结构【只能处理一对多的关系,只有沿着从根…...

嵌入式学习之系统编程(十)网络编程之TCP传输控制协议
目录 一、网络模型 1、服务器/客户端模型 2、C/S与B/S区别 3、P2P模型 二、TCP(传输控制协议) (一)TCP概述 (二)TCP的特征(面问高频问题) 1、有链接 三次握手:建…...

【react+antd+vite】优雅的引入svg和阿里巴巴图标
1.安装相关包 由于是vite项目,要安装插件来帮助svg文件引入进来,否则会失败 npm下载包 npm i vite-plugin-svgr vite.config.ts文件内: import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …...