UDP协议与TCP协议详解

news2024/11/18 8:25:53

 UDP协议详解

UDP,即User Datagram Protocol,用户数据报协议

UDP协议的特点:无连接,不可靠传输,面向数据报,全双工

无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接;

不可靠传输:没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息;

面向数据报:应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;

例如用UDP传输100个字节的数据:如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节;而不能循环接收10次,每次接收10个字节。

全双工:UDP允许通信双方的应用进程在任何时候都能发送数据,UDP的socket既能读,也能写

UDP协议格式:

 

源/目的端口号:表示数据是从哪个进程来,到哪个进程去;

UDP长度:16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大容量,一个UDP报文最多就只能有64KB,如果需要使用UDP传输一个比较大的数据,就需要考虑进行拆包

校验和:校验和就是为了检查数据是否出错了(网络传输过程中,受到一些干扰,是容易导致传输的数据出错的)

UDP校验和使用了一个比较常见的CRC算法(循环冗余校验):把UDP报文中的每个字节都进行累加,和也放到一个两个字节的数字中(加的过程中如果溢出了就溢出),最终得到的结果就是校验和

发送方发送数据的时候,就先计算一个校验和,接收方接收的时候,按照同样的规则再算一次校验和,最后看一下两次校验和是不是一样的(这里出现问题的概率还是比较小的)

TCP协议详解

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。

TCP协议的特点:有连接,可靠传输,面向字节流,全双工

有连接:TCP协议使用时必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。

可靠传输:可靠传输就是数据传输过去之后,发送方知道数据发送的成功与否,如果失败会尝试再次发送

面向字节流:应用层交给TCP的报文,整个报文可能会被操作系统分组成多个的 TCP 报文,也就是一个完整的TCP报文被拆分成多个 TCP 报文进行传输

例如用TCP传输100个字节的数据:如果发送端一次发送100个字节,那么接收端可能会循环接收10次,每次接收10个字节。

全双工:TCP允许通信双方的应用进程在任何时候都能发送数据

可靠传输原理

1、确认应答机制(可靠机制):每次发送数据之后,通过收没收到回复报文来确定发送成功与否,这样传输就变得可靠了,回复的报文称之为"应答报文",也称之为"ack报文"

接收方成功接收数据的话,会向发送方发送一个应答报文表示数据成功接收,应答报文中的标志位ACK就会被置为1(之前为0),表示数据成功接收了。并且应答报文中还会携带确认序号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。

 2、超时重传机制(可靠机制):主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发;

但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了;因此主机B会收到很多重复数据。那么TCP协议需要用到序列号识别出那些包是重复的包,并且把重复的丢弃掉。

超时重传的时间间隔是会逐渐变大的(因为连续的超时重传是极小概率事件),如果重传一定次数之后仍然无法传输,就会尝试重置TCP连接(断开重连),如果还是连不上,此时就直接释放连接(彻底放弃)

3、连接管理机制(可靠机制):在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接

三次握手图示:

ACK和SYN都是系统内核负责的,会在收到请求之后,立即就返回

三次握手的意义:检查一下当前网络情况是否畅通、检查通信双方的发送能力和接收能力是否正常、协商一些重要参数

四次挥手图示:

ACK是系统内核负责的,会在收到请求之后,立即就返回,而FIN是应用程序负责的(代码中主动调用close),取决于我们的代码,因此B给A返回的ACK+FIN有一定几率会合并~~

4、滑动窗口(效率机制):TCP希望能够在保证可靠性的前提下,尽可能的提高传输效率,因此可以使用滑动窗口来提升效率

滑动窗口:每次批量发送一波数据,然后再等一波ACK,再发一波数据。我们把每次批量发送的数据的量称之为"窗口大小"~~

注意:接收方是收到一个数据就发送一个ACK,而不是等所有数据都到了才统一发下一组;发送方也是收到一个ACK就继续发一条数据,而不是等所有ACK都到了才统一发下一组~~

白色窗口就表示哪些数据在等待确认,也就是在等待数据到达与接收应答报文这个过程准确无误的完成:

情况一:数据包已经抵达,ACK被丢了。

这种情况下,部分ACK丢了并不要紧,因为可以通过后续的ACK进行确认;

情况二:数据包就直接丢了。

当某一段报文段丢失之后,发送端会一直收到 1001 这样的ACK,就像是在提醒发送端 "我想要的是 1001" 一样

如果发送端主机连续三次收到了同样一个 "1001" 这样的应答,就会将对应的数据 1001 - 2000 重新发送;

这个时候接收端收到了 1001 之后,再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已经收到了

这种机制被称为 "快速重传机制",它是搭配了滑动窗口机制的"超时重传"。

 

5、流量控制(可靠机制):在滑动窗口的基础之上,对发送速率做出限制的机制,也就是限制发送方的窗口大小不要太大(要合适)

接收端处理数据的速度是有限的。如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。

接收方使用接收缓冲区的剩余空间大小,来作为发送方发送速率(窗口大小)的参考数值

接收方将自己可以接收的缓冲区大小放入 TCP 首部中的 "窗口大小" 字段,通过ACK通知发送方;

接收方一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送方;发送方接受到这个窗口之后,就会减慢自己的发送速度;

如果接收方缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收方把窗口大小告诉发送方。

6、拥塞控制(可靠机制):也在滑动窗口的基础之上,对发送速率做出限制的机制,也就是限制发送方的窗口大小不要太大(要合适)

TCP引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;

每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小(也就是和流量控制)做比较,取较小的值作为实际发送的窗口

7、延迟应答(效率机制):

延迟应答的作用就是让窗口大小在不影响接收方与发送方的处理能力的前提下尽量的大一些

如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小

假设接收端缓冲区为1M。一次收到了500K的数据;如果立刻应答,返回的窗口就是500K;但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了;在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M;

一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高。我们的目标是在保证网络不拥塞的情况下尽量提高传输效率;

那么所有的包都可以延迟应答么?肯定也不是:

数量限制:每隔N个包就应答一次;

时间限制:超过最大延迟时间就应答一次;

 8、捎带应答(效率机制):本来ACK是系统内核负责的,会在收到请求之后,立即就返回,但是由于延迟应答机制会稍微等一会返回,这一等正好业务上也要返回内容,此时内核就可以把两个报文合二为一

9、面向字节流的"粘包问题":

A应用程序,需要从接收缓冲区中读取收到的数据,由于是面向字节流的,A无法确定从哪到哪是一个完整的应用层数据报

想要解决"粘包问题",只要定义应用层数据协议的时候,明确包和包之间的"边界"(比如约定使用;作为结束标记),就可以了

TCP异常情况:

1、程序崩溃:进程异常退出,操作系统会回收进程的资源,包括释放文件描述符表,这样的释放操作,就相当于调用了对应socket的close,执行close就会触发FIN报文,进一步开始四次挥手~~

2、正常关机:关机的时候,系统会强制结束所有的用户进程;之后的步骤与上述程序崩溃一样

3、主机掉电:非常突然,猝不及防的~~

掉电的是接收方:发送方是不知道对面挂了的,继续发数据(没有ack),之后触发超时重传,重传几次之后仍没有应答,尝试重置链接(也会失败,触发复位报文段RST),最后只能放弃连接

掉电的是发送方:此时接收方就等着,等一阵之后就会发送一个"心跳包",如果对方不返回"心跳包",就说明对方挂了

"心跳包"是周期性触发的,只是一个简单的不携带任何业务数据的包,存在的意义就是确认一下对方是否还在

4、网线断开:情况同主机掉电一样,只不过通信双方的主机都好着呢,这两端各自按照上述两种情况分别进行~~

TCP协议格式:

16位源/目的端口号:表示数据是从哪个进程来,到哪个进程去;

32位序号/32位确认号:32位序号针对请求数据进行的编号,32位确认序号针对应答报文(ACK报文)进行的编号。每一个ACK报文都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发。

4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60字节

TCP报头前20个字节是固定的,后面是留给选项的,选项可有可无(它是可变的),选项可以是0个字节,最多是40个字节(什么是选项不做讨论)

6位保留位:现在虽然不用,先占个位置,以后可能会用,也就是留下的可扩展空间

6个特殊标志位(6位):

1、URG:紧急指针是否有效

2、ACK:在数据通信中,接收方发给发送方的一种传输类控制字符,表示发来的数据已确认接收无误。如果接收方成功的接收到数据,那么这一位会被置为1,也就是应答报文(ack报文)这一位置为1。

ACK是系统内核负责的,会在收到请求之后,立即就返回

3、PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走

4、RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段

5、SYN:请求建立连接;我们把携带SYN标识的称为同步报文段;SYN这一位如果为1说明这是一个同步报文段(尝试和对方建立连接)

SYN是系统内核负责的,会在收到请求之后,立即就返回

6、FIN:通知对方本端要关闭连接了,我们称携带FIN标识的为结束报文段;FIN这一位如果为1说明这是一个结束报文段(通知对方本端要关闭连接了)

FIN是应用程序负责的(代码中主动调用close),何时返回取决于我们的代码

16位窗口大小:存放当前接收方接收缓冲区的剩余大小,这个字段得是在ACK为1的时候(应答报文的时候)才有效,窗口大小是动态的(实时改变)

窗口大小最大不是64kb(也就是16位的最大值),选项中有窗口大小扩展因子来表示更大的值

16位校验和:校验和就是为了检查数据是否出错了(网络传输过程中,受到一些干扰,是容易导致传输的数据出错的),此处的检验和不光包含TCP首部,也包含TCP数据部分。

TCP校验和使用了一个比较常见的CRC算法(循环冗余校验):把TCP报文中的每个字节都进行累加,和也放到一个两个字节的数字中(加的过程中如果溢出了就溢出),最终得到的结果就是校验和

发送方发送数据的时候,就先计算一个校验和,接收方接收的时候,按照同样的规则再算一次校验和,最后看一下两次校验和是不是一样的(这里出现问题的概率还是比较小的)

16位紧急指针:标识哪部分数据是紧急数据;

40字节头部选项:暂时忽略;

 

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

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

相关文章

深入讲解Linux中断子系统--Workqueue

说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 概述 Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制;Workqueue工作队列可以用作中…

以前的互联网时代,其实就是一个以互联网技术为主导的年代

事实上,以往,我们所经历的那个互联网玩家频出的年代,其实就是一个以互联网技术为主导的年代。在那样一个年代里,互联网技术几乎是解决一切痛点和难题的万能解药,几乎是破解一切行业痛点和难题的杀手锏。任何一个行业&a…

使用Python读取网易邮箱大师客户端的所有邮件

文章目录1. 前言2. 效果3. 探究过程3.1. 找到本地存储的数据库3.2. 使用Python读取数据库3.2.1. 代码4. 探究结果4.1. 函数4.1.1. 找到特定邮~箱的最新一条邮件4.1.2. 找到特定邮箱的最新一次验证码4.1.3. 通过命令行调用Python代码找到特定邮箱的最新的验证码1. 前言 现在绝大…

中科大FPGAOL使用方法

1.中科大的FPGA在线平台提供了一个非常好用的功能,将bit文件上传到远程FPGA开发板上加以功能验证,而且可以游客的身份访问。 Login - FPGA Onlinehttp://fpgaol.ustc.edu.cn/ 2.系统采用的硬件平台是赛灵思的Nexys4 DDR开发板(xc7a100t-csg324)&#x…

RocketMQ学习(五):分布式事务

一、分布式事务 事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C或Java)…

『Java课设』JavaSwing+MySQL实现医院智慧点餐系统

👨‍🎓作者简介:一位喜欢写作,计科专业大三菜鸟 🏡个人主页:starry陆离 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 『Java课设』JavaSwingMySQL实现医院智慧点餐系统1.功能介…

设计模式:责任链模式的应用场景及源码应用

一、概述 责任链模式(Chain of Responsibility Pattern)是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个…

AI代码实时生成工具teleportHQ

来源:投稿 作者:ΔU 编辑:学姐 今天给大家分享一款AI代码实时生成工具teleportHQ,teleportHQ本质上是一个低代码开发平台,但是首次将计算机视觉应用到低代码开发上,teleportHQ允许用户通过熟悉的设计工具界…

JSX的基本使用

JSX的基本使用1.JSX简介1.1 JSX是react的核心内容1.2 createElement的问题1.3 createElement的问题1.4 JSX注意点2 使用prettier插件格式化react代码3 JSX中嵌入JavaScript表达式4 条件渲染5 列表渲染6 样式处理1.JSX简介 JSX是JavaScript XML的简写,表示了在Javas…

Linux 下 rpm管理包

一、 .rpm的文件格式 以.rpm格式发布的软件里面封装的都是经过编译过的二进制形式的软件,可以直接安装。.rpm格式的文件又称为rpm软件包,简称rpm包。 二、 rpm文件名的格式 三、 rpm命令的使用与软件的安装 Linux中安装rpm软件包有3种方法&#xff1…

新手小白入门之泛型

一、背景 JAVA推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常…

嵌入式书籍推荐

现在嵌入式软件工程师的数量需求方面是越来越旺盛,但是在人才供给方面却出现了缺口,个大公司对于嵌入式开发工程师职位出现供不应求的局面,正是有很多人看到这了大好的环境,纷纷选择开始学习嵌入式开发,学习的方式也是…

第十六讲:神州交换机访问控制列表的配置

访问控制列表ACL(Access Control Lists)数据定义工具,基于用户自行定义的数据的参数区分不同的数据流,是在交换机和路由器上经常采用的一种防火墙技术,它可以对经过网络设备的数据包根据一定规则进行过滤。它有以下一些…

CloudFlare 的路由拦截

因为腾讯需要对网站进行校验。 校验的方法是使用一个 tencent18250331897192314951.txt 文件,在这个文件中放入腾讯指定的内容。 我们使用的是 Discourse 这个社区系统,这个社区系统对这种问题的响应比较头痛。 解决方案 解决方案就是从域名服务商哪…

NX 系统环境 python3.6 部署 PPOCR 报错记录

NX 系统环境 python3.6 部署 PPOCR 报错记录 前言(这环境,就硬配) 问:为什么要用系统环境,不用 conda?答:因为 conda 的 ARM 端 python 最低只支持 3.7,而 paddlepaddle 提供的 Je…

c#入门-系统特性

特性 特性可以给成员添加元数据。这有两个作用: 这是一个元数据,可以利用反射获取到如果编译器认识这个特性,那么可以与特性进行交互。 第一点涉及到反射的内容,先略过。 而第二点要求的编译器认实这个特性,就仅限于…

在Linux上安装和使用ZFS

真正的文件系统终极者 ZFS 文件系统的英文名称为 ZettabyteFileSystem,也叫动态文件系统,是第一个 128 位文件系统。最初是由 Sun 公司为 Solaris10 操作系统开发的文件系统。作为 OpenSolaris 开源计划的一部分,ZFS 于 2005 年 11 月发布&a…

《MySQL 8从零开始学(视频教学版)》简介

#好书推荐##好书奇遇季#《MySQL 8从零开始学(视频教学版)》,定价89元,京东当当天猫都有发售。本书面向MySQL 8数据库初学者,是MySQL数据库畅销入门书。 配套资源 本书配套400个实例和14个综合案例的源码、PPT课件、近2…

/etc/passwd详解

目录 一、统一性和标准化 二、功能和权限 三、内容详解 1、/etc/passwd为按行记录的文本文件,每行记录一个用户的信息 2、每行信息内容 四、参考文献 一、统一性和标准化 各版本的Linux操作系统的/etc/passwd功能和内容格式基本相同。 (1&#xf…

Spark环境搭建(Stand alone模式)

Sand alone 架构 Standalone模式是Spark自带的一种集群模式,不同于前面本地模式启动多个进程来模拟集群的环境,Standalone模式是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理…