【UDP报文和TCP协议特性】

news2024/11/28 10:36:09

目录

  • 1.UDP报文
    • 1.1报文长度
    • 1.2校验和
  • 2.TCP协议特性
    • 2.1确认应答
    • 2.2超时重传
    • 2.3连接管理
      • 2.3.1三次握手
      • 2.3.2四次挥手
    • 2.4滑动窗口
    • 2.5流量控制
    • 2.6拥塞控制
    • 2.7延时应答
    • 2.8捎带应答
    • 2.9面向字节流
    • 2.10异常情况
  • 3.小结
    • 3.1tcp小结
    • 3.2tcp和UDp应用场景的差异
  • 4.寄语

1.UDP报文

udp是传输层最重要的协议之一。
我们先来看一下udp报文的格式
在这里插入图片描述
一个完整的udp应用层数据报其实就是后面的UDP载荷部分
每个端口号在UDP报文里面,取值范围在0-65535,不过< 1024的端口,称为知名端口,给一些名气较大的协议使用的,这部分端口咋们日常中不应该使用。
在这里插入图片描述

源ip
源端口:数据从哪里来
目的ip
目的端口:数据到哪里去

在这里插入图片描述

1.1报文长度

报文长度 大小是两个字节,表示的范围 0-65535=》64kB
那么UDP豹纹的最大长度就是64KB!!!

那么64KB是大还是小?
在以前64KB算是大的,但是现在很小很小。那么我们如果准备传输一个比较大的数据怎么办?
(1).把一个大数据拆分成多个部分,使用多个udp数据报来传输,但是比较复杂。
(2).不用udp,直接使用tcp,就没有限制了

注意:使用udp编程的时候,要注意udp数据报不能太长,否则会有问题。

1.2校验和

网络传输中,并非是很稳定的,可能会出现问题。

那我们怎么判断是否出现错误呢? 这个时候就需要使用“校验和”,我们传输是通过网线传输的,也就是电信号,电信号使用高低电平表示0 1。
但是如果数据在传输过程中遭到外部环境干扰,例如强磁场之类的,就会导致 低电平->高电平 高电平->低电平。

校验和,存在的意义,就是判定一下,当前传输的数据是否出错了。
如果校验和不对,此时的数据一定不对
但是如果校验和对,但是数据也有一定的概率是错误的。
所以为了让校验和能够识别率高一点,计算的时候通常会以数据内容作为参数来进行计算,数据内容发生变化,校验和也会变化。

校验和往往是取内容一部分通过一些算术运算/数学公式变换,得到一个值
在这里插入图片描述
发送方,把载荷数据,带入校验和算法中,计算得到一个校验和结果,设为sum1,发送方就将这一串数据发给接收方,接收方得到的既有载荷还有校验和的值,接收方就可以把载荷按照同样的方法,在计算一遍校验和,得到sum2。我们对比sum1和sun2是否相同,如果不相同,数据就会有问题。(咋们一般使用CRC算法)。

2.TCP协议特性

TCP协议特点:
有连接
可靠传输:tcp存在的初心,最核心的机制
面向字节流
全双工

可靠传输:不是说100%能传过去,而是说尽可能传过去,如果传不过去,发送方至少能知道自己传没传过去。
核心机制:在于不管是否收到都会有个应答

2.1确认应答

实现可靠传输的核心机制。
发送方发送一个请求,接受方接收到以后,就会发出一个应答报文(ACK)
在这里插入图片描述
但是有的时候不一定会正确的对应上,可能会出现先发后至的情况。
在这里插入图片描述
为了解决上述问题,就需要针对消息进行编号!!给发送的消息分配一个“序号”,同时应答报文给出“确认序号”。
真实的TCp数据传输就是引入了序号和确认号。
在这里插入图片描述
TCP将每个字节都进行了编号,即为序列号
在这里插入图片描述
在这里插入图片描述

注意:确认序号的规则 不是说发送方的序号是啥,确认序号是啥 而是取得是发送方发来的所有数据,最后一个直接的在一个字节序号

在这里插入图片描述

确认序号1001的含义:
1.<1001的数据,我已经收到了
2.发送方接下里需要发送从1001开始的数据。
接收方就可以通过ack的确认序号,告诉发送发那些数据已经收到了。

2.2超时重传

如果一切顺利,那么就可以直接应答了,但是有的时候会发生丢包,丢包,也是网络上非常典型的情况。

那么为什么会丢包呢? 发送方和接收方之间是有很多节点的,任何一个节点出错都会导致丢包。每个中间设备都会承担很多转发任务,一旦任务过多,达到上限(上面的流量达到峰值)就会导致数据丢包。
如果包丢了,接收方就收不到数据,自然不会返回ack

在这里插入图片描述
发送方等待一段时间后,迟迟接收不到ack,那么发送方就视为数据报丢了,就会重发一遍。

丢包的判定:
1.数据直接丢了,接收方没收到,自然就不会发ack
2.接收方收到数据了,返回的ack丢了
发送方区分不了这两种情况,所以都会重传。
如果是返回的ack丢了,B会受到重复的数据,不过tcp帮助咋们解决了这个问题,接收方会在缓冲区,根据收到的数据,自动去重,保证了应用程序读到的数据只有一份。
在这里插入图片描述

TCp针对多个包丢失,处理思路是超时重传,但是每一次丢都会导致,超时等待时间,连续多个重传,无法得到ack就会尝试重置连接,如果重置连接也失败,TCp就会关闭连接,放弃通信了(能重传就重传,重传不了就关闭连接,尽最大可能完成传输)。

tcp怎么实现可靠性的:
确认应答
超时重传

2.3连接管理

连接管理:(tcp最核心的考点)
tcp建立连接:
三次握手 tcp
释放连接:四次挥手
上述这两个过程 和 可靠性 多少有一点关系,但不是最主要的

2.3.1三次握手

握手(handshake)指的是通信双方,进行一次网络交互,相当于客户端和服务器之间。进行了三次交互,建立了连接关系。
syn称为同步报文段,意思就是一方向另一方,申请建立连接
在这里插入图片描述
上述过程是内核自动完成的,应用程序干预不了,等连接完成了,服务器accept把建立好的连接从内核拿到应用程序。

那么设么样子的报文属于同步保温呢?
大家观察tcp报文的格式,其中有六个特殊的比特位,这几位默认是为0.
如果变为1,就是有特殊的含义
第二位ACK如果为1,表示当前tcp数据报是一个应答报文
第五位SYN如果为1,表示当前tcp数据报是一个同步报文
如果第二位和第五位都是1,那么这个报文就是ack+syn

在这里插入图片描述

三次握手本质上就是验证客户端和服务器,各自发送消息的能力和接受能力是否正常。
这个角度看,三次握手和可靠性,有一点关系(但是没有确认应答和超时重传重要)

2.3.2四次挥手

四次挥手就是断开连接,通信双方,各自给对方发送一个FIN(结束报文),在各自给对方返回ACK~~

在这里插入图片描述
建立连接,一般是客户端先发起的
释放连接,客户端和服务端都有可能发起

为啥三次握手,能合并,四次挥手为啥不能合并?
三次握手,ack和syn都是在同一时机触发的(内核完成的)
四次挥手,ack和fin,是在不同时机触发的,ack是在内核完成的,在收到fin的时候第一时间返回~~,fin则是在应用程序控制的,再调用到socket的close方法的时候才能触发fin

最后一个比特FIN就是代表结束报文
在这里插入图片描述

这个图片就很好的表达了,三次握手和四次挥手
在这里插入图片描述

2.4滑动窗口

tcp要保证不仅仅是可靠性还有效率,提高可靠性就代表要损失效率
在这里插入图片描述
如上图这样A这边就需要花费给大量的时间等待ACK,想要缩短时间就要批量发送数据,一次发送多条数据,一次等多个ack。
这就是批量发送四次数据,发完以后,统一等待ack,每次收到一个ack就立即发送下一条,使用一份时间,等待多个ack,等待时间短了,效率就高了。

UDP的效率更高,tcp再怎么提高效率,也没有UDp快。
tcp的效率机制本质就是让性能折损少一点。

在这里插入图片描述
上述批量传输数据的过程就称为滑动窗口
批量发送不是无限发送,是发送到一定程度就等待ack,不等待直接发送的数据是有上限的。而且是回来一个ack就立即发下一条,相当于总的要批量发送等待的数据是一致的。

批量发送的大小,就称为窗口大小

如果批量发送的过程中丢包了怎么办?
情况1:数据包到达了,ack丢了
这种情况啥事也没有,确认好的含义,就是该序列号之前的数据都收到了,后一个ack能涵盖前一个ack得意思。
就比如1-1000这个数据收到了,但是1001这个ack丢失了,但是2001这个ack收到了,那么就代表1-1000这个数据收到了,1001ack也相当于收到了。
如果最后一个ack丢包了,那么就超时重传就可以了。
在这里插入图片描述
情况2:数据丢了
由于1-1000这个数据丢了,所以接收方依然索要1001,不是说收到了2001-3000就返回3001,接下来的几次数据的ack都是1001,确认号都是1001,B反复向A索要1001这个数据,A连续几次收到1001之后就会知道1-1000这个数据丢了,接收方没收到,A就重传了这个数据。(这个重传过程也称为快速重传)
当A重新发送数据,B收到以后,返回的确认号是7001,而不是2001,因为中间的数据都已经收到了。
在这里插入图片描述

2.5流量控制

流量控制也是保证可靠性的机制

滑动窗口,窗口越大,相当于批量发送的数据就越多,但是 是越多越好吗? 如果发的太快,瞬间把接收方缓冲区给填满了,那么接下来发送就会丢包。
所以我们就会通过流量控制,本质是让接收方来限制一下发送方速度

具体怎么控制呢?让ack报文中,携带一个“窗口大小”这样的字段
当ack为1的时候,此时窗口大小字段就会生效,这里的值就是建议发送方发送的窗口大小。

那接收方怎么确定窗口大小呢?
很简单,直接拿缓冲区的剩余空间作为“窗口大小”

在这里插入图片描述
接收缓冲区初始剩余3000,所以发送方就会发送大小3000的数据,这个时候接收方缓冲区满了,发送方就发送不了了,等待一会(应用程序会从socket这里读取数据,读取到的数据就会从缓冲区删除,这样就腾出了空间),会发送一个窗口探测,如果发现这里不是0,就继续发送。

这个过程类似阻塞队列
在这里插入图片描述

2.6拥塞控制

滑动窗口的大小=流量控制+拥塞控制
流量控制:衡量了接收方得处理能力
拥塞控制:衡量了传输路径的处理能力

很明显如果传输路径上任何一个设备有问题,对整个传输速率都是有影响的。
拥塞控制就是要衡量中间节点,传输的能力

那么怎么衡量呢?我们通过实验的方式,找到一个合适的发送速率。
开始的时候,按照一个小的速率发送,如果不丢包就可以提高一下速率(扩大窗口大小),如果出现丢包,就立即把速率调小。每一次重复上述过程。

在这里插入图片描述
拥塞窗口:(拥塞控制,试验出来的窗口)
流控窗口:流量控制的窗口

实际发送发的窗口大小=min(拥塞窗口,流控窗口)
在这里插入图片描述
当开始是一个很小的值,开始增长,指数增长,为了让窗口大小,短时间达到一个比较大的值,接近于当前网络传输路径的能力瓶颈。
然后增长到一定的阙值,机会线性增长,为了避免突然超过上限太多,增长到一定的程度,丢包了,认定当前窗口大小,已经达到了路径的上限。这个时候就会把窗口大小回归到比较小的值,重复上述过程。

2.7延时应答

延时应答:提高传输效率
tcp可靠性的核心,是确认应答
ACK要发,但不是立即发,而是稍微等一会再发
在这里插入图片描述
发送发发送一个数据,正常是立即返回一个ack,ack里面有一个窗口大小,为n,
但是如果等一会在返回ack,那么里面的窗口大小,大概率会比n大
这是因为应用程序不断从缓冲区读取数据,导致缓冲区里面的数据不断减小,空间就大了。

延时应答的效果,就是通过这个延时,让应用程序多读取一些缓冲区数据,这样返回的窗口大小就会更大,发送方的发送速率就会快一些。

2.8捎带应答

捎带应答是基于延时应答的

客户端服务器 通信模型:
一问一答:绝大多数服务器都是
多问一答:上传大文件
一问多答:下载大文件
多问多答:游戏串流

在这里插入图片描述
正常来说,A发送完数据以后,B会立即返回一个ack,随后B通过程序write写数据,在返回到A,由于这两个时机不一样,不能一起返回,不过因为延时应答就可以让ack稍微等一会,等数据一起返回,两个合并为一个,效率更高了。

为啥四次挥手,有可能三次就挥手完???同理,捎带应答的原理

2.9面向字节流

粘包问题!!!
所谓一句话,就相当于一个应用层数据报
当A给B连续发送多个应用层数据报以后,这些数据就会积累在B的缓冲区中,仅仅挨在一起,此时B读取数据的时候,难以区分那到哪里是一个完整的数据报,很容易读出半个包/一个半包。

那么怎么解决呢?
1.定义分隔符:每说完一句话就以一个符号结尾,这样接受者读的时候就知道了
21.约定长度:约定数据的前四个字节表示整个数据报

2.10异常情况

1.进程关闭/进程崩溃

进程没了,socket是文件,随之被关闭,虽然进程没了,但是链接还在,依然可以继续四次挥手

2.主动关机(正常流程关机)

先杀死所有的用户进程,也会触发四次挥手,如果发挥完,更好。没有发挥完,比如对方的fin发来了,咋们还没来得及ack就关机了。
这个时候对端就会重传fin,几次过后发现没有ack传过来,就会尝试重新连接,如果还不行就会释放连接。

3.主机掉电(拔电源)
机器瞬间就关了,来不及任何操作
1)对端是发送发
对端收不到ack=》超时重传=》重置链接=》释放连接
2)对端是接收方
对端没办法立即知道,你这边是还没来得及发送数据,还是直接没了
TCp内置心跳包,保活机制
a)周期性
b)如果心跳没了,挂了~~
虽然对端是接收方,对端会定期给咱们发一个心跳包~~(ping)咱们返回一个(pong)

如果每个ping都有及时的pong,这个时候说明当前对端的状态良好如果ping过去之后,没用pong,说明心跳没了,怕是这边挂了~~

3.小结

3.1tcp小结

在这里插入图片描述

3.2tcp和UDp应用场景的差异

tcp可靠传输,效率没那么高:绝大多数情况下,都可以使用tcp

udp不可靠传输,效率高:对于效率高但是对于可靠性吗,没那么高(例如:同一个机房的内网之间数据传输)

如果需要效率高并且可靠的话我们就会用到其他的协议

4.寄语

本篇文章到这里就结束了,概念很多,大家可以收藏下来,慢慢理解,同时有很多干货是我们在面试的时候会考的。希望大家的支持。💞💞💞

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

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

相关文章

【Android】之【内存管理】

一、Android内存运行是如何运行的&#xff1f; 物理内存即移动设备上的ram&#xff0c;当启动一个android程序时&#xff0c;会启动一个dalvik vm进程&#xff0c;系统会给它分配固定的内存空间【16m,32m,64m,不定&#xff0c;没有统一标准&#xff0c;每个虚拟机会有堆内存阈…

【Minecraft开服教程】使用 MCSM 面板一键搭建我的世界服务器,并内网穿透公网远程联机

文章目录前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址7. 使用固定公网地址远程联机前言 MCSManager是一个开源…

C++ float 数据的保存格式

总体上&#xff0c;在计算机中&#xff0c; float 数据的的保存按照如下转换逻辑&#xff1a;10进制数 >二进制数>科学计数法二进制数>c 条件下下浮点数在内存中的保存格式&#xff08;这里面有个转换算法&#xff0c;需要理清楚&#xff09;。 下面举出一个案例&…

Python+selenium自动化测试实战项目(全面,完整,详细)

前言 之前的文章说过&#xff0c; 要写一篇自动化实战的文章&#xff0c; 这段时间比较忙再加回家过清明一直没有更新&#xff0c;今天整理一下实战项目的代码共大家学习。&#xff08;注:项目是针对我们公司内部系统的测试&#xff0c;只能内部网络访问&#xff0c;外部网络无…

使用fetch()异步请求API数据实现汇率转换器

任务8 https://segmentfault.com/a/1190000038998601 https://chinese.freecodecamp.org/news/how-to-master-async-await-with-this-real-world-example/ 跟随上面的指示&#xff0c;理解异步函数的编写&#xff0c;并且实现这个汇率转换器。 第一步&#xff1a;在工作区初始…

AI失业潮来袭,某些部门裁员过半

历史的车轮滚滚向前&#xff0c;每次生产力的大幅跃进&#xff0c;都会造成一批失业潮。想当年&#xff0c;纺纱机的出现让无数手工作坊的织布师傅失业。如今&#xff0c;在AI技术的催化下&#xff0c;同样的事正在互联网行业的各个领域重演。疯狂的裁员浪潮 “AI15秒做的&…

图神经网络汇总和总结

下面所有博客是个人对EEG脑电的探索&#xff0c;项目代码是早期版本不完整&#xff0c;需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上)&#xff1a;研究数据集选取和介绍SEED 相关论文阅读分析&#xff1a; 1、EEG-SEED数据集作者的—基线论文阅读和…

LeetCode——二叉树的层序遍历

102. 二叉树的层序遍历 I 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]…

超级详解MySQL执行计划explain

1、什么是MySQL执行计划 要对执行计划有个比较好的理解&#xff0c;需要先对MySQL的基础结构及查询基本原理有简单的了解。 MySQL本身的功能架构分为三个部分&#xff0c;分别是 应用层、逻辑层、物理层&#xff0c;不只是MySQL &#xff0c;其他大多数数据库产品都是按这种架构…

窗函数的总结

1. 为什么要加窗 每次FFT变换只能对有限长度的时域数据进行变换&#xff0c;因此&#xff0c;需要对时域信号进行信号截断。即使是周期信号&#xff0c;如果截断的时间长度不是周期的整数倍&#xff08;周期截断&#xff09;&#xff0c;那么&#xff0c;截取后的信号将会存在泄…

C++算法初级10——动态规划

C算法初级10——动态规划 文章目录C算法初级10——动态规划最优化问题动态规划分析流程和条件最优化问题 生活中我们常常遇到这样一些问题&#xff1a; 看到上面的例子&#xff0c;我们发现这些问题都是在最大化&#xff08;或者最小化&#xff09;某个指标&#xff1a;最小化…

leetcode重点题目分类别记录(三)动态规划深入与素数理论

文章目录动态规划背包问题01背包抽象出求解目标尝试进程子问题拆分基本情况根据拆分过程定义dp数组与转移方程遍历顺序与状态压缩模板归纳题目应用变种提升组合问题多维01背包有特殊限制的01背包完全背包尝试进行子问题拆分转移方程题目应用变种提升-求组合/排列数打家劫舍变种…

二维数组的总结

一、时间复杂度和空间复杂度 时间复杂度和空间复杂度是衡量算法效率的两个重要指标。时间复杂度是指算法执行所需的时间&#xff0c;而空间复杂度是指算法执行所需的内存空间。 计算时间复杂度和空间复杂度需要分析算法中各个操作的执行次数和内存使用情况。具体的计算方法可以…

【matlab代码】提取任意多边形内的nc数据--以海洋温度为例子

【matlab代码】提取任意多边形内的nc数据–以海洋温度为例子 本文来源于对象想提取一个矩形内的温度数据,从而求平均能看出时间序列变化。 由于平时我们矩形是和经纬度平行,我们可以直接使用lon,lat进行寻找。 例子如图: 图片 这样的水平图,大家都会,直接: find(lon…

数据库作业合集

目录[TOC](目录)数据库作业第七章&#xff08;1&#xff09;习题7关系模式&#xff08;2&#xff09;习题8关系模式数据库作第三章34数据库作第二章6数据库作业第三章59数据库作业第八章&#xff08;1&#xff09;统计离散数学的成绩分布情况&#xff0c;即按照各分数段统计人数…

ROS--URDF集成Gazebo仿真小车和rviz结合

ROS–URDF集成Gazebo仿真小车 实现流程: 需要编写封装惯性矩阵算法的 xacro 文件为机器人模型中的每一个 link 添加 collision 和 inertial 标签&#xff0c;并且重置颜色属性在 launch 文件中启动 gazebo 并添加机器人模型工作目录 1.编写封装惯性矩阵算法的 head.xacro 文件…

【MySQL】B+树索引——InnoDB 中的索引方案;MylSAM 中的索引方案 和 InnoDB 中的索引方案 对比

一、InnoDB 中的索引方案 1. 聚簇索引 聚簇索引 有两个特点&#xff1a; 使用记录主键值的大小进行记录和页的排序&#xff0c;这包括3方面的含义. &#xff08;1&#xff09;页〈包括叶子节点和内节点〉内的记录按照主键的大小顺序排成一个单向链表&#xff0c;页内的记录被…

MongoDB 介绍和基本操作

一、MongoDB数据库 1、MongoDB是一种非关系型数据库&#xff0c;是用C语言编写的。其特点是高性能、易部署、易使用&#xff0c;存储数据方便。 2、MongoDB特点&#xff1a; 面向集合存储&#xff0c;易于存储对象类型数据&#xff1b;支持动态查询&#xff0c;支持完全索引&…

灌区量测水系统

1)灌区量测水 灌区量测水是水资源管理的基础&#xff0c;是推进节水农业和水价改革的重要手段。常规在主要水闸处&#xff0c;监测闸前和闸后水位及闸门开启状态(闸位)&#xff0c;通过实时监测数据&#xff0c;计算过闸流量。要实现全灌区水资源动态配置、精准灌溉&#xff0…

C语言小项目 -- 通讯录完整代码(登陆系统+动态开辟 + 文件操作)

目录 &#x1f4f0;0. 项目介绍 &#x1f4f0;1. 开发环境及框架 &#x1f4f0;2. 通讯录账户模块功能分析实现&#xff1a; &#x1f4f1;2.1 通讯录账户菜单界面及数据结构设计 &#x1f4f1;2.2 通讯录账户注册功能实现 &#x1f4f1;2.3 通讯录账户登录功能实现 &am…