辽宁教育网站建设费用/网销平台排名

辽宁教育网站建设费用,网销平台排名,id wordpress,外贸公司电话文章目录 前言一、三次握手1.1 三次握手流程1.2 tcp为什么需要三次握手建立连接? 二、四次挥手2.1 四次挥手流程2.2 为什么是四次,不是三次?2.3 为什么要等待2msl?2.4 TCP的保活计时器 前言 TCP和UDP是计算机网络结构中运输层的两…

文章目录

  • 前言
  • 一、三次握手
    • 1.1 三次握手流程
    • 1.2 tcp为什么需要三次握手建立连接?
  • 二、四次挥手
    • 2.1 四次挥手流程
    • 2.2 为什么是四次,不是三次?
    • 2.3 为什么要等待2msl?
    • 2.4 TCP的保活计时器

前言

TCPUDP是计算机网络结构中运输层的两个协议。

  • 传输控制协议 TCP(Transmission Control Protocol):提供面向连接的,可靠的数据传输服务(它通过三次握手建立连接,通过四次挥手终止连接)。
  • 用户数据协议 UDP(User Datagram Protocol):提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
  • 序列号(Sequence Number):TCP报文段中的一个字段,用于标识数据流中的每个字节,确保数据的有序传输。
    确认号(Acknowledgment Number):TCP报文段中的一个字段,用于确认接收方已成功接收到的数据,并指示发送方可以继续发送后续数据。
    SYN标志(Synchronize Sequence Numbers):同步序列号标志,用于建立连接时同步双方的初始序列号。
    ACK标志:确认标志,用于确认接收到的数据。
    FIN标志:结束标志,用于终止连接时表示不再发送数据。

一、三次握手

1.1 三次握手流程

如图:
三次握手

第一次握手

  • 客户端发送SYN报文:客户端向服务器发送一个带有SYN标志的TCP报文段,报文中包含客户端选择的初始序列号seq=x(序列号是随机的),TCP规定,SYN报文请求不能携带数据,但需要消耗一个序列号。此时客户端进入SYN_SENT状态。
  • 作用:客户端向服务器表明自己希望建立连接,并告知服务器自己的初始序列号,以便后续数据传输时进行同步。

第二次握手

  • 服务器响应SYN+ACK报文:服务器收到客户端的SYN报文后,TCP服务器收到请求报文后,如果同意连接,则向客户端发送一个带有SYNACK标志的报文段。报文中包含服务器选择的初始序列号seq=y,以及对客户端序列号的确认号ack=x+1。这个报文也不能携带数据,但是同样要消耗一个序号。此时服务器进入SYN_RCVD状态。
  • 作用:服务器向客户端确认已收到其连接请求,并告知客户端自己的初始序列号,同时确认客户端的序列号,确保双方的序列号同步。

第三次握手

  • 客户端发送ACK报文:客户端收到服务器的SYN+ACK报文后,向服务器发送一个带有ACK标志的报文段,报文中包含对服务器序列号的确认号ack=y+1,TCP规定,ACK报文段可以携带数据,但是如果不携带数据的话则不消耗序号。此时客户端和服务器都进入ESTABLISHED状态,连接建立成功。
  • 作用:客户端确认已收到服务器的SYN报文,并确认服务器的序列号,确保双方的序列号完全同步。

连接正式建立,双方可以开始数据传输。

1.2 tcp为什么需要三次握手建立连接?

三次握手的原因

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费

原因一:避免历史连接

简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱

我们考虑一个场景,客户端先发送了 SYN(seq = 90)报文,然后客户端宕机了,而且这个 SYN 报文还被网络阻塞了,服务器端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了 SYN(seq = 100)报文(注意!不是重传 SYN,重传的 SYN 的序列号是一样的)。

看看三次握手是如何阻止历史连接的:
在这里插入图片描述

客户端连续发送多次 SYN(都是同一个四元组)建立连接的报文,在网络拥堵情况下:

  • 一个旧 SYN 报文最新的 SYN报文早到达了服务端,那么此时服务端就会回一个 SYN + ACK 报文给客户端,此报文中的确认号是 91(90+1)
  • 客户端收到后,发现自己期望收到的确认号应该是 100 + 1,而不是 90 + 1,于是就会回 RST 报文。
  • 服务端收到 RST 报文后,就会释放连接。
  • 后续最新的 SYN 抵达了服务端后,客户端与服务端就可以正常的完成三次握手了。

上述中的旧 SYN 报文称为历史连接,TCP 使用三次握手建立连接的最主要原因就是防止历史连接初始化了连接。

如果是两次握手连接,就无法阻止历史连接,那为什么 TCP 两次握手无法阻止历史连接呢?

主要是因为在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费

在两次握手的情况下,服务端在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据,但是客户端此时还没有进入 ESTABLISHED 状态,假设这次是历史连接,客户端判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,而服务端在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。
在这里插入图片描述
可以看到,如果采用两次握手建立 TCP 连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,又白白发送了数据,妥妥地浪费了服务端的资源。

因此,要解决这种现象,最好就是在服务端发送数据前,也就是建立连接之前,要阻止掉历史连接,这样就不会造成资源浪费,而要实现这个功能,就需要三次握手

所以,TCP 使用三次握手建立连接的最主要原因是防止历史连接初始化了连接。

原因二:同步双方初始序列号

TCP 协议的通信双方, 都必须维护一个序列号, 序列号是可靠传输的一个关键因素,它的作用:

  • 接收方可以去除重复的数据;
  • 接收方可以根据数据包的序列号按序接收;
  • 可以标识发送出去的数据包中, 哪些是已经被对方收到的(通过 ACK 报文中的序列号知道);

可见,序列号在 TCP 连接中占据着非常重要的作用,所以当客户端发送携带初始序列号SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,那当服务端发送初始序列号给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。
在这里插入图片描述

四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了三次握手。

而两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收。

原因三:避免资源浪费

如果只有两次握手,当客户端发生的 SYN 报文在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN由于没有第三次握手,服务端不清楚客户端是否收到了自己回复的 ACK 报文,所以服务端每收到一个 SYN 就只能先主动建立一个连接,这会造成什么情况呢?

如果客户端发送的 SYN 报文在网络中阻塞了,重复发送多次 SYN 报文,那么服务端在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费。
在这里插入图片描述

即两次握手造成消息滞留的情况下,服务端重复接受无用的连接请求 SYN 报文,而造成重复分配资源。

二、四次挥手

2.1 四次挥手流程

如图:
在这里插入图片描述
第一次挥手

  • 客户端发送FIN报文:客户端向服务器发送一个带有FIN标志的TCP报文段,表示客户端已经没有数据要发送了,但仍然可以接收数据。报文中包含一个序列号seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时客户端进入FIN_WAIT_1状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序列号。
  • 作用:客户端主动关闭连接,通知服务器自己已经完成数据发送,等待服务器的确认。

第二次挥手

  • 服务器响应ACK报文:服务器收到客户端的FIN报文后,向客户端发送一个带有ACK标志的报文段,确认号为ack=u+1,并且带上自己的序列号seq=v。此时服务器进入CLOSE_WAIT状态,TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
    客户端收到该报文后进入FIN_WAIT_2状态。
  • 作用:服务器确认已收到客户端的FIN报文,但此时服务器可能还有数据需要发送,因此不会立即关闭连接。

第三次挥手

  • 服务器发送FIN报文:当服务器完成数据发送后,向客户端发送FIN=1,ack=u+1报文,表示服务器也没有数据要发送了。报文中还包含一个序列号seq=w,此时服务器进入LAST_ACK状态。
  • 作用:服务器通知客户端自己已经完成数据发送,等待客户端的最终确认。

第四次挥手

  • 客户端响应ACK报文:客户端收到服务器的释放连接的FIN报文后,向服务器发送确认报文ACK=1,确认号为ack=w+1,自己的序列号是seq=u+1此时客户端进入TIME_WAIT状态,服务器收到该报文后进入CLOSED状态。
  • 作用:客户端确认已收到服务器的FIN报文,连接正式关闭。客户端进入TIME_WAIT状态,等待一段时间(2MSL)后,确保服务器已收到最终的ACK报文,然后进入CLOSED状态。

2.2 为什么是四次,不是三次?

tcp是全双工通信,服务端和客服端都能发送和接收数据。
tcp在断开连接时,需要服务端和客服端都确定对方将不再发送数据。

  • 第1次挥手:由客户端向服务端发起,服务端收到信息后就能确定客户端已经停止发送数据。
  • 第2次挥手:由服务端向客户端发起,客户端收到消息后就能确定服务端已经知道客户端不会再发送数据。
  • 第3次握手:由服务端向客户端发起,客户端收到消息后就能确定服务端已经停止发送数据。
  • 第4次挥手:由客户端向服务端发起,服务端收到信息后就能确定客户端已经知道服务端不会再发送数据。

为什么不是3次挥手?

在客服端第1次挥手时,服务端可能还在发送数据,所以第2次挥手和第3次挥手不能合并。

2.3 为什么要等待2msl?

为什么需要等待

  1. 为了保证客户端发送的最后一个 ACK 报文段能够到达服务端。 这个 ACK 报文段有可能丢失,因而使处在 LAST-ACK 状态的服务端就收不到对已发送的 FIN + ACK 报文段的确认。服务端会超时重传这个 FIN+ACK 报文段,而客户端就能在 2MSL 时间内(超时 + 1MSL 传输)收到这个重传的 FIN+ACK 报文段。接着客户端重传一次确认,重新启动 2MSL 计时器。最后,客户端和服务器都正常进入到 CLOSED 状态。

  2. 防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。

为什么等待的时间是 2MSL

MSLMaximum Segment Lifetime报⽂最⼤⽣存时间,它是任何报⽂在⽹络上存在的最⻓时间,超过这个时间报⽂将被丢弃。

TIME_WAIT 等待 2 倍的 MSL,⽐较合理的解释是:⽹络中可能存在来⾃发送⽅的数据包,当这些发送⽅的数据包被接收⽅处理后⼜会向对⽅发送响应,所以⼀来⼀回需要等待 2 倍的时间。
在这里插入图片描述

⽐如如果被动关闭⽅没有收到断开连接的最后的 ACK 报⽂,就会触发超时重发 FIN 报⽂,另⼀⽅接收到 FIN 后,会重发 ACK 给被动关闭⽅, ⼀来⼀去正好 2 个 MSL

2.4 TCP的保活计时器

除时间等待计时器外,TCP 还有一个保活计时器(keepalive timer)。

设想这样的场景:客户已主动与服务器建立了 TCP 连接。但后来客户端的主机突然发生故障。显然,服务器以后就不能再收到客户端发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就需要使用保活计时器了。

服务器每收到一次客户端的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时都没有收到客户端的数据,服务端就发送一个探测报文段,以后则每隔 75 秒钟发送一次。若连续发送 10 个探测报文段后仍然无客户端的响应,服务端就认为客户端出了故障,接着就关闭这个连接。
在这里插入图片描述

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

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

相关文章

科普|无人机专业术语

文章目录 前言一、飞控二、电调三、通道四、2S、3S、4S电池五、电池后面C是什么意思?六、电机的型号七、什么是电机的KV值?八、螺旋桨的型号九、电机与螺旋桨的搭配 前言 无人机飞控系统控制飞行姿态,电调控制电机转速,遥控器通道控制飞行动作。电池C…

和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设

气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连,发挥着不可替代的重要作用。人工智能技术的迅猛发展,为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息,助力人类更精准地把握自然规律&am…

Redis缓存一致性难题:如何让数据库和缓存不“打架”?

标题:Redis缓存一致性难题:如何让数据库和缓存不“打架”?(附程序员脱发指南) 导言:当数据库和缓存成了“异地恋” 想象一下:你刚在美团下单了一份麻辣小龙虾,付款后刷新页面&#…

委托者模式(掌握设计模式的核心之一)

目录 问题: 举例: 总结:核心就是利用Java中的多态来完成注入。 问题: 今天刷面经,刷到装饰者模式,又进阶的发现委托者模式,发现还是不理解,特此记录。 举例: ​老板​…

[密码学实战]Java实现SM4加解密(ecb,cbc)及工具验证

前言 在现代信息安全领域,数据加密技术是保障数据安全的核心手段之一。SM4作为中国国家密码管理局发布的对称加密算法,因其高效性和安全性,广泛应用于金融、政务、通信等领域。本文将详细介绍如何使用Java实现SM4的加解密操作,并深入探讨SM4的几种常见加密模式及其原理。 …

动态规划刷题

文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示:dp[i],表示dp表中i下标位置的值 2. 状态转移方程:以i位置位置的状态,最近的一步来划分问题,比如可以将状态拆分成前状态来表示现状态,dp[i] …

Vue 3 搭建前端模板并集成 Ant Design Vue(2025)

目录 一、环境安装 二、创建项目 三、前端工程化配置 四、引入组件库 五、选择 API 风格 1、选项式 API (Options API)​ 2、组合式 API (Composition API)​ 六、页面信息修改 七、通用布局选择 1、基础布局结构 2、全局底部栏 3、动态替换内容 4、全局顶部栏 …

【Mac】git使用再学习

目录 前言 如何使用github建立自己的代码库 第一步:建立本地git与远程github的联系 生成密钥 将密钥加入github 第二步:创建github仓库并clone到本地 第三步:上传文件 常见的git命令 git commit git branch git merge/git rebase …

六十天前端强化训练之第七天CSS预处理器(Sass)案例:变量与嵌套系统详解

欢迎来到编程星辰海的博客讲解 目录 一、知识讲解(3000字) 1. Sass基础概念 2. 变量系统 2.1 变量定义 2.2 数据类型 2.3 作用域优先级 2.4 变量实践场景 3. 嵌套系统 3.1 选择器嵌套 3.2 属性嵌套 3.3 嵌套规则 二、核心代码示例 完整SCSS…

DeepSeek掘金——DeepSeek R1驱动的PDF机器人

DeepSeek掘金——DeepSeek R1驱动的PDF机器人 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人。逐步学习如何增强AI检索能力,并创建一个能够高效处理和响应文档查询的智能聊天机器人。 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人…

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释,结合理论与实际操作说明: 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想,MySQL 的实现逻辑如下: …

WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示

wordpress插件介绍 “WP高级摘要插件”功能丰富,它允许用户在WordPress后台自定义文章摘要。 可设置摘要长度,灵活调整展示字数;设定摘要最后的显示字符, 如常用的省略号等以提示内容未完整展示;指定允许在摘要中显示…

三次握手内部实现原理

socket()创建一个新的套接字 int socket(int domain, int type, int protocol); 参数: domain:地址族,如 AF_INET(IPv4),AF_INET6(IPv6) type:套接字类型&…

DeepSeek 助力 Vue3 开发:打造丝滑的悬浮按钮(Floating Action Button)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

【前端场景题】如何应对页面请求接口的大规模并发问题

如何应对页面请求接口的大规模并发问题,尤其是前端方面的解决方案,并且需要给出详细的代码解释。首先,我需要仔细阅读我搜索到的资料,找出相关的信息,然后综合这些信息来形成答案。 首先看,它提到前端优化策…

Spring MVC 程序开发(1)

目录 1、什么是 SpringMVC2、返回数据2.1、返回 JSON 对象2.2、请求转发2.3、请求重定向2.4、自定义返回的内容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分别是什么?有什么关系? Servlet 是 java 官方定义的 web 开发的标准规范;Tomcat 是…

一键安装Mysql部署脚本之Linux在线安装Mysql,脚本化自动化执行服务器部署(附执行脚本下载)

相关链接 一键安装Redis部署脚本之Linux在线安装Redis一键安装Mysql部署脚本之Linux在线安装Mysql一键安装JAVA部署脚本之Linux在线安装JDK一键安装Nginx部署脚本之Linux在线安装NginxNavicat最新版(17)详细安装教程Xshell客户端免费版无需注册XFtp客户端免费版无需注册 前言…

1.2.2 使用Maven方式构建Spring Boot项目

本次实战通过Maven方式构建了一个Spring Boot项目,实现了简单的Web应用。首先,创建了Maven项目并设置好项目名称、位置、构建系统和JDK等。接着,添加了Spring Boot的父项目依赖和web、thymeleaf起步依赖。然后,创建了项目启动类He…

【愚公系列】《Python网络爬虫从入门到精通》037-文件的存取

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

C++:vector的push_back时间复杂度分析

引导示例 #include <iostream> #include <vector>int main() {std::vector<int> v;std::cout << v.capacity() << " ";int last 0;for (int i 1; i < 10; i) {v.push_back(1);std::cout << v.capacity() << " …