TCP和UDP相关问题(重点)(5)——5.TCP三次握手和四次挥手(非常重要)

news/2024/5/18 14:01:05 标签: tcp/ip, udp, 网络

5.1三次握手的过程

  • 一次握手:客户端发送带有SYN(x)标志的数据包到服务端,然后客户端进入SYN_SEND状态,等待服务器端的确认。

  • 二次握手:服务端发送带有SYN(y)+ACK(x+1)标志的数据包到客户端,然后服务端进入SYN_RECV状态。

  • 三次握手:客户端发送带有ACK(y+1)标志的数据包到服务端,然后服务端和客户端都进入已建立状态,完成TCP三次握手。

 

5.2为什么要三次握手?

因为要确保可靠的连接,三次握手的目的就是保证双方都互相知道对方的发送和接收是正常的。四次没必要,多余了,而两次不够,因为两次无法让服务器知道自己的发送和对方的接收是否正常。

第一次握手后,服务端能知道客户端的发送和自己的接收是正常的,第二次握手后,客户端能知道自己的发送和接收是正常的,服务端的发送和接收是正常的,而经过第三次握手后,服务器才会知道自己的发送和客户端的接收是正常的。所以三次握手就能保证双方都知道对方的发送和接收功能都正常。

5.3第二次握手服务端传回了ACK,为什么还要传回SYN?

是为了客户端发出的第三次握手做准备,服务端在第二次握手中传回了ACK(x+1),服务端就表明了我收到你客户端的第一次握手的信息了。而传回的SYN,为的就是让客户端在第三次握手时发出ACK确认报文,表明我客户端也收到你服务端发送的第二次握手的信息了,总的来说就是为了确保双方的可靠连接。

5.4四次挥手的过程

  • 第一次挥手:客户端发送一个FIN(x)标志的数据包到服务端,请求关闭客户端到服务端的数据传送。然后客户端进入FIN-WAIT-1状态。

  • 第二次挥手:服务端发送一个ACK(x+1)标志的数据包到客户端,然后服务端进入到CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。

  • 第三次挥手:服务端发送一个FIN(y)标志的数据包到客户端,请求关闭服务端到客户端的连接,然后服务端进入LAST-ACK状态。

  • 第四次挥手:客户端发送一个ACK(y+1)标志的数据包到服务端,然后客户端进入到TIME-WAIT状态,服务端在收到客户端ACK确认数据包后进入CLOSE状态。此时如果客户端等待了2MSL(是报文段的最长寿命,MSL时间是不确定的,取决于操作系统)后没有收到服务器端的任何回复,那就说明服务端已正常关闭,随后客户端就可以关闭连接了,客户端进入CLOSED状态。

注意:只要四次挥手没有结束,客户端和服务端就可以继续传输数据!

5.5为什么要四次挥手?

同一问题:为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?

因为服务器收到客户端要断开连接的第一次挥手请求时,可能还有一些数据没有发完,这时服务端先回复ACK报文,表明我服务端接收到了你断开连接的请求,等到服务端的数据发送完后再发送一个FIN报文段,表示请求断开服务端到客户端的数据传送。

5.6如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?

客户端如果没有收到ACK确认,客户端会重新发送FIN请求。

5.7为什么第四次挥手后客户端需要等待 2MSL时间后才进入 CLOSED 状态?

因为客户端也要确保服务端成功接收到了自己发送的第四次挥手的ACK确认报文,如果服务端没有接收到的话,那么服务端就要重新发送FIN报文,这时客户端就要时刻准备着重发ACK,不然服务端会一直重发FIN报文。如果从开始就一切顺利的话,客户端到最后等了2MSL,都没有再次收到服务端发送的FIN,那么客户端就会推断ACK已经被服务端成功接收了,才会进入CLOSED状态,关闭TCP连接。

 


http://www.niftyadmin.cn/n/5369002.html

相关文章

PAT-Apat甲级题1009(python和c++实现)

PTA | 1009 Product of Polynomials 1009 Product of Polynomials 作者 CHEN, Yue 单位 浙江大学 This time, you are supposed to find AB where A and B are two polynomials. Input Specification: Each input file contains one test case. Each case occupies 2 lin…

【网络技术】【Kali Linux】Nmap 嗅探(一)简单扫描

一、实验环境 本次实验进行简单的Nmap扫描,实验使用 Kali Linux 虚拟机和 Ubuntu Linux 虚拟机完成,主机操作系统为 Windows 11,虚拟化平台选择 Oracle VM VirtualBox,如下图所示。 二、实验步骤 1、相关配置 Kali Linux 虚拟机…

【leetcode热题100】矩阵置零

难度: 中等通过率: 38.4%题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法…

网络请求库axios

一、认识Axios库 为什么选择axios? 功能特点: 在浏览器中发送 XMLHttpRequests 请求在 node.js 中发送 http请求支持 Promise API拦截请求和响应转换请求和响应数据 补充: axios名称的由来? 个人理解没有具体的翻译. axios: ajax i/o system 二、axios发送请求 1.axios请求…

基于LLM的数据漂移和异常检测

大型语言模型 (LLM) 的最新进展被证明是许多领域的颠覆性力量(请参阅:通用人工智能的火花:GPT-4 的早期实验)。 和许多人一样,我们非常感兴趣地关注这些发展,并探索LLM影响数据科学和机器学习领域的工作流程…

力扣精选算法100道—— 连续数组(前缀和专题)

连续数组&#xff08;前缀和专题&#xff09; 目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 ❗为什么hash设置成<0,-1>键值对 ❗与和为K的子数组比较hash的键值对 &#x1f6a9;代码实现 &#x1f6a9;了解题意 我们看到给定数组里面只有0和1&#xff0c;我们…

.NET Core 3 foreach中取索引index

for和foreach 循环是 C# 开发人员工具箱中最有用的构造之一。 在我看来&#xff0c;迭代一个集合比大多数情况下更方便。 它适用于所有集合类型&#xff0c;包括不可索引的集合类型&#xff08;如 &#xff0c;并且不需要通过索引访问当前元素&#xff09;。 但有时&#xf…

第三篇论文小记

期刊&#xff1a;《International Journal of Digital Earth》 研究方向&#xff1a;人工智能应用 投稿结果&#xff1a;已投结果未知 投稿周期&#xff1a; 最后更新时间&#xff1a;06 February 2024 投稿流程&#xff1a; 状态时间With Journal Administrator06 February 2…