前端开发之TCP与UDP

上一篇👉: 前端开发之性能优化

TCP与UDP

三次握手

1. 初始状态:

  • 客户端开始时处于CLOSED状态,表明没有活动的连接。
  • 服务器监听特定端口,处于LISTEN状态,等待连接请求。

2. 第一次握手(SYN_SENT状态):

  • 客户端随机生成一个初始序列号(ISN_c),并向服务器发送一个SYN标志置位的报文段。这标志着客户端试图建立连接,此时客户端状态变为SYN_SENT,表示客户端正在等待服务器的确认。

3.第二次握手(SYN_RECEIVED状态):

  • 服务器接收到客户端的SYN报文,如果同意连接,会生成自己的初始序列号(ISN_s),并将ISN_c + 1作为确认号(Acknowledgment Number)包含在回应报文中,同时设置SYNACK标志位。服务器状态变为SYN_RECEIVED,表示服务器已发送了SYN+ACK且等待客户端的最后确认。

4.第三次握手(ESTABLISHED状态):

  • 客户端接收到服务器的SYN+ACK报文后,会向服务器发送一个ACK报文作为应答,确认号设置为ISN_s + 1。此时,客户端进入ESTABLISHED状态,表示连接已经建立,可以开始传输数据。服务器在收到这个ACK后,也会进入ESTABLISHED状态。此时,双方以建立起了链接。

序列号(ISN)的动态性ISN的动态生成是为了防止单纯递增的序列号被预测,增强连接的安全性,防止重放攻击。

数据携带问题:三次握手中,前两次握手主要用于连接的建立和确认,不携带数据以最小化初始连接建立的复杂性,防止恶意利用。第三次握手时,理论上客户端可以携带数据,因为连接已基本建立,但实践中通常不这么做,以减少网络拥塞和重传风险。

半连接队列与全连接队列:这是服务器端的两种队列管理机制,用以应对连接请求的处理压力。半连接队列存储了处于SYN_RECEIVED状态的连接请求,全连接队列则存储了已完成三次握手的连接。队列的大小配置影响着服务器对并发连接的处理能力。

SYN-ACK重传:这一机制体现了TCP的健壮性,通过逐步延长的重传时间间隔,有效平衡了连接建立的效率与资源消耗,防止恶意SYN泛洪攻击。

三次握手的作用

  1. 连接的可靠性验证:三次握手过程确保了客户端和服务端双方都具备发送和接收数据的能力。通过这个过程,双方确认了对方的存在并且有能力进行通信,从而建立了可靠的连接基础。
  2. 同步序列号:在握手过程中,客户端和服务端都会交换各自的初始序列号(ISN)。这个序列号在后续的数据传输中用于数据包的排序和确认,保证数据包按序到达且无遗漏。
  3. 防止旧连接请求的冲击:通过使用不同的ISN,可以防止来自旧连接的迟到数据包干扰新连接。即使旧的数据包在网络中延迟到达,由于其序列号与当前连接的期望不符,会被直接丢弃。
  4. 设定通信参数:握手期间,双方还可以协商TCP连接的参数,比如最大报文段大小(MSS),选择性确认(SACK)等选项,为后续的数据传输优化条件。
  5. 防止资源浪费:通过三次握手,服务器可以避免为那些无响应的连接请求分配资源。如果客户端没有响应服务器的SYN+ACK,服务器就不会为这个连接分配过多资源。
  6. 提供安全性基础:虽然三次握手本身不直接提供加密或身份验证,但它为后续可能的安全措施(如TLS握手)奠定了基础,确保双方准备好进行安全的数据交换。

总之,三次握手是一个精心设计的过程,旨在建立一个稳定、可靠、且双方都已准备好的通信环境,为后续的数据传输打下坚实的基础。

四次挥手

四次挥手是TCP连接断开的过程,确保了数据的可靠传输直至连接关闭,具体步骤及状态变迁如下:

1. 第一次挥手(客户端发起断开请求):

  • 客户端发送一个FIN报文给服务器,请求关闭连接。报文中会包含一个序列号,表明客户端希望断开连接。此时,客户端进入FIN_WAIT_1状态,等待服务器的确认。

2.第二次挥手(服务器确认客户端请求):

  • 服务器接收到客户端的FIN报文后,会发送一个ACK报文作为应答,确认序列号为客户端FIN报文的序列号加1,表明服务器已收到关闭请求。服务器此时可能还有数据需要发送,因此状态变为CLOSE_WAIT,即等待应用程序关闭连接并完成数据发送。

3.第三次挥手(服务器请求关闭):

  • 当服务器准备好关闭连接时,它会向客户端发送一个FIN报文,请求关闭其方向上的连接。服务器状态变为LAST_ACK,等待客户端的最终确认。

4.第四次挥手(客户端确认服务器请求):

  • 客户端收到服务器的FIN报文后,发送ACK报文作为响应,确认序列号同样为服务器FIN报文的序列号加1。此时,客户端进入TIME_WAIT状态,等待足够的时间(通常是2倍的最大段生存时间,MSL)以确保服务器收到了ACK,防止最后的ACK丢失而需要重新发送FIN。服务器收到ACK后,关闭连接,进入CLOSED状态。
  • TIME_WAIT状态的重要性:这一状态是为了确保网络中的延迟报文或者丢失的ACK报文不会引起连接的混淆。如果服务器没有收到最后的ACK,它会重发FIN,而TIME_WAIT状态下的客户端能够重新发送ACK,保证连接的正确关闭。

5.状态简述:

  • LISTEN:服务器等待连接请求。
  • SYN_SENT:客户端已发送SYN,等待服务器确认。
  • SYN_RECEIVED:服务器接收到SYN,等待客户端的ACK。
  • ESTABLISHED:连接建立,数据传输可以进行。
  • FIN_WAIT_1:客户端已发送FIN,等待服务器的ACK。
  • FIN_WAIT_2:客户端收到服务器的ACK,等待服务器的FIN。
  • CLOSE_WAIT:服务器接收到FIN,但还未发送自己的FIN。
  • CLOSING:客户端接收到服务器的FIN,同时自己的FIN也在路上。
  • LAST_ACK:服务器已发送FIN,等待客户端的最后ACK。
  • TIME_WAIT:客户端等待足够时间确保最后的ACK被服务器收到。
  • CLOSED:连接完全关闭,双方均无状态。

这一过程确保了连接的双方都能明确知道连接何时关闭,且所有数据都被正确传输,无数据丢失。

POST与GET区别

1.使用场景: GET 用于获取资源,而 POST 用于传输实体主体。

  • GET 通常用于请求服务器发送某个资源,比如请求一个网页或图片。它适合用于获取数据,不应有副作用。
  • POST 用于向服务器提交数据,常用于表单提交、上传文件或创建新资源。它可以包含更多的数据,且对数据格式没有限制。

2.参数处理:

  • GET 将参数附加在URL中,作为查询字符串。由于URL长度有限制(通常不超过2048字符),这限制了GET能携带的数据量。
  • POST 将参数放在请求正文中,因此可以传输大量数据,且不显示在URL中,适合敏感信息的传输。尽管如此,通过网络监控工具仍可能被截获,因此不绝对安全。

3.安全性

  • GET 请求可被浏览器缓存、保存在浏览历史中,且可能在Referrer头部中暴露给第三方站点。它被认为是安全的,因为它不修改服务器状态。安全的方法除了 GET 之外还有:HEADOPTIONS
  • POST 的目的是传送实体主体内容,经常用于提交数据到服务器,可能涉及数据的创建或修改,比如向数据库插入一条新的记录,因此具有改变服务器数据或状态的能力。这种潜在的改变状态的特性使得POST不被视为安全方法。。不安全的方法除了 POST 之外还有 PUT、DELETE。

3.幂等性

  • GET 是幂等的,多次请求具有相同效果,不会产生额外的副作用。
  • POST 不是幂等的,多次请求可能导致多次资源创建或其他副作用。

4.可缓存

  • GET 请求默认可被浏览器和代理服务器缓存,除非通过Cache-ControlExpires等头部信息指明不缓存。
  • POST 请求通常不会被缓存,因为它们可能改变服务器状态。

5.XMLHttpRequest与Ajax

  • GETPOST 都可用于Ajax(异步JavaScript和XML)请求,通过XMLHttpRequest实现。但两者在发送数据的时机上有别:POST先发送Header再发送Data,而GET同时发送HeaderData,尽管不同浏览器可能有细微差别。

GET和POST各有优势和局限,选择时应考虑数据敏感性、数据量、是否需要幂等性以及缓存需求等因素。GET适合简单数据获取,而POST用于提交数据或执行可能改变服务器状态的操作。

TCP与UDP的区别

TCPUDP作为传输层的两大协议,各自有着显著的特点和适用场景

TCP协议的主要特点及机制

1.面向连接:TCP连接的建立需要经过三次握手,确保双方都准备好进行数据传输。
2.可靠性:通过序列号、确认应答、重传机制、校验和等策略确保数据可靠传输。
3.流量控制:使用滑动窗口协议,根据接收方的处理能力调整发送速度,避免数据溢出。
4.拥塞控制:通过慢启动、拥塞避免、快速重传和快速恢复等策略动态调整发送速率,以缓解网络拥塞。
5.全双工通信:支持数据的同时发送和接收。
6.面向字节流:TCP将数据视为无边界的字节流,不保留应用层数据的原始边界。

UDP协议的特点

1.无连接:UDP通信不需要预先建立连接,减少了建立连接的开销,但也不保证数据的到达。
2.尽最大努力交付:不保证数据的可靠传输,可能丢包、乱序。
3.面向报文:保持应用层数据的边界,适合一次性传输小数据包。
4.头部开销小:UDP头部仅8字节,相比TCP的20字节头部更轻量。
5.支持多播和广播:TCP基于一对一的连接,而UDP可以实现一对多的通信。

TCP与UDP的区别总结

  • 可靠性:TCP提供可靠传输,UDP不保证数据的可靠到达
  • 连接性:TCP是面向连接的,UDP是无连接的。
  • 传输模式:TCP是面向字节流,UDP是面向报文的。
  • 速度与开销:TCP由于校验、确认等机制,传输速度相对较慢,开销较大;UDP因简单快速,适合对实时性要求高的应用。
  • 应用场景:TCP适用于文件传输、网页浏览等对数据完整性和准确性要求较高的场景;UDP适用于实时音视频通信、在线游戏等对实时性要求高,能容忍少量丢包的场景。

TCP重传机制

  • 超时重传:TCP发送数据后启动定时器,若在规定时间内未收到确认ACK,则认为数据丢失或损坏,进行重传。超时时间动态调整,初试超时后,下次超时时间翻倍,以此类推。
  • 快速重传:接收方收到失序的数据段时,会立即发送重复的ACK,若发送方连续收到三个或更多相同的ACK,无需等待超时,立即重传丢失的报文段。

TCP拥塞控制机制

  • 慢启动:连接建立初期,拥塞窗口(cwnd)从小到大逐步增加,以探测网络拥塞情况,初始cwnd=1,每次收到ACK,cwnd翻倍。
  • 拥塞避免:当cwnd达到慢启动阈值(ssthresh),转为线性增长,每经过一个往返时间(RTT)增加1个MSS(最大报文段大小)。
  • 快速重传与快速恢复:快速重传机制触发后,ssthresh设置为当前cwnd的一半,cwnd重置为1,然后执行拥塞避免算法,快速恢复到之前的传输速率。

TCP流量控制

  • 滑动窗口:接收方通过在ACK中包含窗口大小信息告知发送方其还能接收多少数据,发送方据此调节发送速率,避免数据溢出接收方缓冲区。当接收方缓冲满时,会发送窗口更新为0的ACK,发送方需暂停发送,等待接收方窗口重新开放。

TCP的可靠传输机制

TCP的可靠传输基于一系列机制,包括:

  • 序列号和确认应答:确保数据有序且无丢失。
  • 重传机制:未收到确认时,重传数据包。
  • 校验和:检查数据在传输过程中是否有误。
  • 累积确认:接收方对按序到达的数据进行累积确认,减少确认报文数量。

这些机制共同保障了TCP协议的高可靠性,尽管牺牲了一定的传输效率,但在大多数需要高度可靠性的网络应用中,TCP是首选的传输协议。

下一篇👉: 前端开发之WebSocket通信

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

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

相关文章

LLoCO技术:突破大型语言模型处理长文本的局限

在自然语言处理领域,大型语言模型(LLMs)虽然在众多任务上展现出了卓越的能力,但在处理长文本上下文时却遭遇了瓶颈。由于自注意力机制导致的计算和内存开销随序列长度呈二次方增长,使得这些模型在面对长文本时力不从心…

[Qt的学习日常]--常用控件2

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、widget的…

ALTER TABLE 语句来添加字段或修改列的注释。

在 Apache Flink SQL 中,字段(也称为列)和注释(也称为元数据或描述)的管理通常与 Flink 使用的底层数据源(如 Kafka、JDBC 数据库、Hive 等)紧密相关。Flink SQL 本身不提供直接修改数据源中字段…

《STM32 HAL库》RCC 相关系列函数详尽解析—— HAL_RCC_OscConfig()

观前提示:函数完整代码在文末,本文梳理了函数HAL_RCC_OscConfig()的主要逻辑和实现方法f105时钟树详解图 HAL_RCC_OscConfig() 函数介绍: 此函数是一个用于初始化RCC(Reset and Clock Control)振荡器(Osc…

【JAVA】SpringBoot + skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上

【JAVA】SpringBoot skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上 1.下载SkyWalking APM https://skywalking.apache.org/downloads/ jdk8 不支持 SkyWalking APM 9.3.0以上版本,所以这里我们下载 9.3.0版本 2.下载 Java Agent …

MySQL----事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如,在学校管理系统中,我们删除一个学生,既需要删除学生的基本资料,也要删除和该学生相关的信息,如班级,考试成绩等等,这样&#…

python基础:字符集和编码

1.字符集 简单来说,字符集就是一套文字符号及其编码的概述。从20世纪60年代美国标准化组织ANSI发布了第一个计算机字符集ASCII开始,为了处理不同的文字,各大计算机公司,各国政府,以及各种标准化组织发明了几百种字符集…

GPT_AI高速发展中什么是Prompt提示词?

提示词(Prompt)是给大语言模型(以下简称模型)的输入文本,用于指定模型应该执行什么样的任务并生成什么样的输出。 提示词发挥了“提示” 模型 应该做什么的作用。设计高质量的提示词需要根据目标任务和模型能力进行精…

Eigen::Isometry3d变换矩阵的常用方法

文章目录 Eigen::Isometry3d变换矩阵的常用方法一、基本定义二、操作方法三、与四元数和平移向量的转换四、左乘与右乘 Eigen::Isometry3d变换矩阵的常用方法 一、基本定义 变换矩阵本质是一个4*4的矩阵 Eigen::Isometry3d T_imu_to_lidar Eigen::Isometry3d::Identity()二、…

分数限制下,选好专业还是选好学校?

1.专业解析 探讨不同专业的优势和未来挑战(课程学习、就业等维度)。结合个人专业选择的经验和思考过程,自定义实际场景并给出不同场景下的“专业VS学校”选择方案。 当探讨不同专业的优势和未来挑战时,需要根据具体的专业领域和市…

手把手教你使用OpenCV和KNN算法进行手写数字识别

手把手教你使用OpenCV和KNN算法进行手写数字识别 在这篇博客中,我将向大家介绍如何使用OpenCV和KNN算法编写一个手写数字识别程序。我们将一步一步地解释每个步骤,确保大家能理解代码的每个细节。我们将通过一个具体的实例来演示,如何从图像…

【Python】 Stacking: 强大的集成学习方法

我们都找到天使了 说好了 心事不能偷藏着 什么都 一起做 幸福得 没话说 把坏脾气变成了好沟通 我们都找到天使了 约好了 负责对方的快乐 阳光下 的山坡 你素描 的以后 怎么抄袭我脑袋 想的 🎵 薛凯琪《找到天使了》 在机器学习中,单…

vscode 终端无法正常执行脚本命令如何解决

我们经常需要在vscode的中安装第三方依赖包,npm是前端目前最大的Node.js模块化管理系统,它能帮助开发者管理和发布Node.js模块。但很多时候我们在vscode的终端中执行npm install命令时经常会报以下错误: 但是在Windows的cmd命令提示符中执行n…

JavaScript妙笔生花:打造沉浸式中国象棋游戏体验

前言 随着信息技术的飞速发展,Web开发领域也出现了翻天覆地的变化。JavaScript作为前端开发中不可或缺的编程语言,其重要性不言而喻。而当我们谈论到利用JavaScript打造一款沉浸式的中国象棋游戏体验时,我们不仅仅是在开发一个游戏&#xff0…

在 Linux/Debian/Ubuntu 上安装 LAMP: Linux、Apache、MySQL 和 PHP

在 Linux/Debian/Ubuntu 上安装 LAMP LAMP 代表 Linux、Apache、MySQL 和 PHP,是一种流行的开源 Web 开发平台,可以提供强大的服务器环境来运行动态网站和 Web 应用程序。本文将详细介绍如何在 Ubuntu 系统上安装和配置 LAMP。 步骤 1: 更新系统 在开…

微信分销商城小程序源码系统在线搭建 前后端分离 带完整的安装代码包以及搭建教程

系统概述 本微信分销商城小程序源码系统采用先进的前后端分离架构设计,前端使用Vue.js框架开发,后端则基于Spring Boot构建,确保了系统的高可维护性、扩展性和性能。系统集商品展示、在线交易、会员管理、分销推广、订单处理、数据统计等功能…

AIoT设备新一代高性能处理器瑞芯微RK3576,东胜物联RK3588等核心板定制开发

随着物联网、人工智能和嵌入式技术的不断发展,智能设备应用对芯片处理器的性能需求越来越高,以满足复杂的数据处理需求、实时性要求、复杂的算法运算和多任务处理能力。高性能的芯片可以为智能设备提供更强大的计算能力和更快速的响应速度,从…

Camtasia Studio 2024软件下载附加详细安装教程

amtasia Studio 2024是一款功能强大的屏幕录制和视频编辑软件,由TechSmith公司开发。这款软件不仅能够帮助用户轻松地记录电脑屏幕上的任何操作,还可以将录制的视频进行专业的编辑和制作,最终输出高质量的视频教程、演示文稿、培训课程等。 …

【Android】RecyclerView纵向倾斜滑动,触发ViewPage2横向滑动而导致的滑动冲突问题

问题描述 场景ViewPage2FragmentRecyclerView(我的项目里RecycleView外层还套了一层SmartRefreshLayout) 因ViewPage2滑动太灵敏,RecyclerView纵向倾斜滑动,触发ViewPage2横向滑动而导致的滑动冲突问题 解决方案: …

Google Earth Engine(GEE)——导出影像video到自己的Google硬盘当中

函数: Export.video.toDrive(collection, description, folder, fileNamePrefix, framesPerSecond, dimensions, region, scale, crs, crsTransform, maxPixels, maxFrames) Creates a batch task to export an ImageCollection as a video to Drive. The collection must on…