TCP(三次握手)和UDP(面向无连接)的原理以及区别

news2024/11/29 10:57:40

TCP(三次握手)和UDP(面向无连接)的原理以及区别

网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议。

概述

📡TCP(Transmission Control Protocol)是一种网络协议,用于设备在互联网上进行通信,它通过三次握手等机制确保传输可靠性和完整性。它是TCP/IP协议套件中的主要协议之一,提供错误检测和纠正功能,被广泛应用于各种领域,包括Web浏览、电子邮件、文件传输等。

📡UDP(用户数据报协议)是一种无连接的协议,运行在IP(互联网协议)之上。与TCP不同,UDP在发送数据之前不建立连接。UDP是一种更简单、更快速的协议,它专注于发送数据包,而无需进行错误检查、重传或保证传输的可靠性,也就是说当报文发送之后,是无法得知其是否安全完整到达的。
在这里插入图片描述

🔧TCP和UDP之间的区别

TCP是面向连接的,而UDP是基于连接的,需要进行三次握手建立连接:

对于UDP协议是面向无连接的,也就是说不需要在正式传递数据之前先连接对方。然后UDP协议只是数据报文的搬运工,在传输过程中可能会出现丢包,不保证有序且不丢失的传递到对方,并且UDP也没有任何控制流量的算法,但正因为这些因素从而使它的传输速率更加的高效,体现了它的实时性

对于TCP是面向连接,它与UDP基本是反着来的,建立连接需要先进行握手,在数据传输过程中,通过各种算法保证数据传输的可靠性,但相对UDP,TCP的传输速率又慢了些。

🔮举个例子:

在我们生活中,我们需要把一堆零件移到另外一个地方的时候,如果我们使用UDP,那么就是直接使用铲车一次性把这些零件放过去,至于路上掉了多少它不管,只管把大部分零件送到,这样的UDP快速但不可靠;如果我们使用了TCP,那么我们会先把零件尽然有序的分类开,并依次打包发送,保证每一个零件通过专门的算法通道准确无误地到达目的地,如果路上掉了它还会通过算法去找,这样的TCP有序且可靠。
在这里插入图片描述
TCP与UDP头部的区别:
在这里插入图片描述
在这里插入图片描述
从两张图可以看出TCP的头部比UDP头部复杂的多。

🔆TCP的通信过程:

三次握手✋、确认传输📶、四次挥手✋,三次握手是建立连接的过程。

🌌三次握手

我们重点了解一下TCP重要的头部字段:

	Sequence number:这个序号保证了 TCP 传输的报文都是有序的,对端可以通过序号顺序的拼接报文
	Acknowledgement Number:这个序号表示数据接收端期望接收的下一个字节的编号是多少,同时也表示上一
	个序号的数据已经收到。
	Window Size:窗口大小,表示还能接收多少字节的数据,用于流量控制标识符。
	URG=1:该字段为一表示本数据报的数据部分包含紧急信息,是一个高优先级数据报文,此时紧急指针
	有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。
	ACK=1:该字段为一表示确认号字段有效。此外,TCP 还规定在连接建立后传送的所有报文段都必须把
	ACK 置为一。
	PSH=1:该字段为一表示接收端应该立即将数据 push 给应用层,而不是等到缓冲区满后再提交。
	RST=1:该字段为一表示当前 TCP 连接出现严重问题,可能需要重新建立 TCP 连接,也可以用于拒绝
	非法的报文段和拒绝连接请求。
	SYN=1:当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。当SYN=1,ACK=1时,表示当前
	报文段是一个同意建立连接的应答报文。
	FIN=1:该字段为一表示此报文段是一个释放连接的请求报文。

💬当客户端向服务端发起连接时,会先发一包连接请求数据,过去询问一下,能否与你建立连接?这包数据称之为SYN包,如果对端同意连接,则回复一包SYN+ACK包,客户端收到之后,发送一包ACK包,连接建立,因为这个过程中互相发送了三包数据,所以称之为三次握手。
在这里插入图片描述

首先假设主动发起请求的一端称为客户端,被动连接的一端称为服务端。不管是客户端还是服务端,TCP 连接建立完后都能发送和接收数据,所以 TCP 是一个全双工的协议。
起初,两端都为 CLOSED 状态。在通信开始前,双方都会创建 TCB。 服务器创建完 TCB 后便进入 LISTEN 状态,此时开始等待客户端发送数据。
🚀第一次握手
客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入SYN-SENT 状态。
🚀第二次握手
服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。
🚀第三次握手
当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入
ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。

第三次握手中可以包含数据,通过快速打开(TFO)技术就可以实现这一功能。其实只要涉及到握手的协议,都可以使用类似 TFO 的方式,客户端和服务端存储相同的 cookie,下次握手时发出 cookie 达到减少 RTT 的目的。

接下来我们思考一个问题:💎为什么 TCP 建立连接需要三次握手,明明两次就可以建立起连接。
原因:为了防止出现失效的连接请求报文段被服务器端接收的情况,产生错误。
🚩例子:
客户端发送了一个连接请求A,但是因为网络原因造成了超时,这时TCP会启动超时重传的机制再次发送一个连接请求B,此时请求顺利到达了服务器,服务端应答完就建立了请求,然后接收数据后释放了连接;
🚩假如说:这时候连接请求A在两端都关闭后才到达服务端,那么此时服务端会误以为又需要建立TCP连接,从而应答了请求A并进入了ESTABLISHED 状态,但是客户端却是CLOSED的状态,那么会导致服务端一直等待客户端响应,从而造成资源的浪费。
在这里插入图片描述🏮在建立连接中,任意一端掉线,TCP 都会重发 SYN 包,一般会重试五次,在建立连接中可能会遇到 SYNFlood 攻击。遇到这种情况你可以选择调低重试次数或者干脆在不能处理的情况下拒绝请求。

👐 四次解手

在这里插入图片描述
TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。
🍪第一次解手
若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。

🍪第二次解手
B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入CLOSE_WAIT 状态,此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A。
🍪第三次解手
B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进入 LAST-ACK 状态。
通过延迟确认的技术(通常有时间限制,否则对方会误认为需要重传),可以将第二次和第三次握手合并,延迟 ACK 包的发送。
🍪第四次解手
A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。
🎿为什么 A 要进入 TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态?
为了保证 B 能收到 A 的确认应答。若 A 发完确认应答后直接进入 CLOSED 状态,如果确认应答因为网络问题一直没有到达,那么会造成 B 不能正常关闭。

今天的分享就到这里啦,感谢大家的阅览,小江会一直与大家一起努力,文章中如有不足之处,你的支持是我前进的最大动力,请多多指教,感谢支持,持续更新中 ……

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

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

相关文章

YOLO V3 网络构架解析

YOLO V3(You Only Look Once version 3)是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升,成为计算机视觉领域的一个重要里程碑。本文将详细解析YOLO V3的网络架构&#x…

【Origin科技绘图】最新Origin2024中文版软件安装教程

Origin是由OriginLab公司开发的一个科学绘图、数据分析软件,支持在MicrosoftWindows下运行。Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计,信号处理,曲线拟合以及峰值分析。Origin中的曲线拟合是采用基Levernberg-Marquardt算法(LMA)的非线性最小二乘法拟合…

网站漏扫:守护网络安全的关键防线

网站漏洞扫描,简称漏扫,是一种针对网站进行漏洞检测的安全服务。网站漏洞扫描在网络安全中占据着至关重要的地位。 网站漏扫在及时发现和修复漏洞方面发挥着关键作用 通过对网站和系统的全面扫描,能够快速识别出各种潜在的漏洞,…

VMware ESXi 8.0U3 Huawei (华为) 定制版更新 OEM BIOS 2.7 支持 Windows Server 2025

VMware ESXi 8.0U3 Huawei (华为) 定制版更新 OEM BIOS 2.7 支持 Windows Server 2025 VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS Huawei (华为) 定制版 ESXi 8.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitach…

[实时计算flink]数据摄入YAML作业快速入门

实时计算Flink版基于Flink CDC,通过开发YAML作业的方式有效地实现了将数据从源端同步到目标端的数据摄入工作。本文介绍如何快速构建一个YAML作业将MySQL库中的所有数据同步到StarRocks中。 前提条件 已创建Flink工作空间,详情请参见开通实时计算Flink版…

基于SSM+小程序的就业管理系统(就业1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 学生实习与就业管理系统的设计与实现管理员、辅导员管理、企业管理、工作管理人、用户管理5个角色。 1、管理员实现了基础数据管理、辅导员管理、企业管理、工作管理人管理、公告信息管理…

2024.10.23 软考学习笔记(知识点)

刷题网站: 软考中级软件设计师在线试题、软考解析及答案-51CTO题库-软考在线做题备考工具

RTDETR 引入 MogaBlock | 多阶门控聚合网络 | ICLR 2024

本改进已集成到 YOLOv8-Magic 框架。 通过尽可能将卷积核的上下文扩展为全局,现代卷积神经网络(ConvNets)在计算机视觉任务中展现出了巨大的潜力。然而,最近在深度神经网络(DNN)中进行的多阶博弈论交互研究揭示了现代卷积神经网络的表示瓶颈,即随着卷积核大小的增加,复…

048_python基于Python的广东旅游数据分析

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

SQLite 3.47.0 发布,大量新功能来袭

SQLite 开发团队于 2024 年 10 月 21 日发布了 SQLite 3.47.0 版本,我们来了解一下新版本的改进功能。 触发器增强 SQLite 3.47.0 版本开始,触发器函数 RAISE() 的 error-message 参数可以支持任意 SQL 表达式。在此之前,该参数只能是字符串…

go 语言 Gin Web 框架的实现原理探究

Gin 是一个用 Go (Golang) 编写的 Web 框架,性能极优,具有快速、支持中间件、crash处理、json验证、路由组、错误管理、内存渲染、可扩展性等特点。 官网地址:https://gin-gonic.com/ 源码地址:https://github.com/gin-gonic/gi…

CMOS 图像传感器:像素寻址与信号处理

CMOS image sensor : pixel addressing and signal processing CMOS image sensor 对于寻址和信号处理有三种架构 pixel serial readout and processingcolumn parallel readout and processingpixel parallel readout and processing 其中,图 (b) column paralle…

从 Web2 到 Web3:区块链技术的演进与未来趋势

在互联网的发展历程中,我们正经历着从 Web2 向 Web3 的重大转变。这个转变的核心驱动力之一,便是区块链技术的不断演进。 Web2 时代,互联网上的社交媒体、在线购物、视频分享等平台蓬勃发展。用户可以便捷地获取信息、与他人交流互动&#x…

css模糊遮罩效果

原图&#xff1a; 模糊后的图片&#xff1a; html: <div class"bj"><div class"mengban"></div> </div> css: .bj {width: 750rpx;height: 643rpx;background-image:url(https://onlinekc.a.hlidc.cn/uploads/20241023/9e552fc…

如何快速解决游戏提示系统中的emp.dll缺失问题

emp.dll是一个动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;文件&#xff0c;这类文件在Windows操作系统中扮演着至关重要的角色。它们包含了可由多个程序同时使用的代码和数据&#xff0c;其主要目的是实现模块化&#xff0c;以便于程序的更新和动态链接。emp…

ECharts饼图-饼图34,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…

【毕业设计】基于SpringBoot的网上商城系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;非常合适作为大学的毕业设计&#xff0c;难以适中。 &#x1f525;采用技术&#xff1a;Sp…

Java项目-基于springboot框架的疫苗接种管理系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

huggingface的数据集下载(linux下clone)

1. 安装lfs sudo apt-get install git-lfs 或者 apt-get install git-lfs 2. git lfs install git lfs install 3. git clone dataset包 第2&#xff0c;3步骤的截图如下&#xff1a;

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题&#xff0c;国内用户请使用清华大学…