TCP为什么是三次握手和四次挥手

转载自   TCP为什么是三次握手和四次挥手

为什么建立连接是三次握手断开连接是四次挥手? 
三次握手的流程和四次挥手的流程是什么?

三次握手与四次回收分别对应TCP连接与断开过程

tcp报文格式 

标志位含义

ACK:确认序号有效。
SYN:发起一个新连接。
FIN:释放一个连接。
 

三次握手的过程

注意:三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的

所谓三次握手,即建立TCP连接,需要客户端和服务端总共发送至少三个包确认连接的建立。流程如下 
 
第一次握手

Client将标志位SYN置1,随机产生一个值seq=J,并将数据包发给Server 
Client进入SYN_SENT状态,等待Server确认

第二次握手

Server收到数据包后标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置1,随机产生一个值,并将数据包发给Client确认连接请求,Server进入SYN_RCVD状态

第三次握手

Client收到确认后若ACK为1,则将该数据包发送给Server,Server检查ACK为1则连接建立成功,Client与Server进入ESTABLISHED状态完成三次握手,可以传输数据

 

问题1:为什么建立连接是三次握手,四次不可以吗

第一次握手:

    Client什么都不能确认   
    Server确认了对方发送正常
第二次握手:

   Client确认:自己发送/接收正常,对方发送/接收正常
    Server确认:自己接收正常 ,对方发送正常

第三次握手:

    Client确认:自己发送/接收正常, 对方发送/接收正常
    Server确认:自己发送/接收正常,对方发送/接收正常

所以通过三次握手确认双方收发功能都正常,四次也可以但是显得比较多余。

 

TCP三次握手,如果两次握手会怎么样

设计上的缺陷 


有这样一种情况,当A发送一个消息给B,但是由于网络原因,消息被阻塞在了某个节点,然后阻塞的时间超出设定的时间,A会认为这个消息丢失了,然后重新发送消息。

当A和B通信完成后,这个被A认为失效的消息,到达了B 
对于B而言,以为这是一个新的请求链接消息,就向A发送确认, 
对于A而言,它认为没有给B再次发送消息(因为上次的通话已经结束)所有A不会理睬B的这个确认,但是B则会一直等待A的消息

这就导致了B的时间被浪费(对于服务器而言,CPU等资源是一种浪费),这样是不可行的,这就是为什么不能两次握手的原因了。

所以有了三次握手的修订 
第三次握手看似多余其实不然,这主要是为了防止已失效的请求报文段突然又传送到了服务端而产生连接的误判

 

四次挥手的过程

所谓四次挥手:即终止TCP连接,需要客户端和服务端总共发送4个包确认连接的断开。流程如下 
 
第一次挥手:

Clien发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:

Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。

第三次挥手:

Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:

Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。

 

问题:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

建立连接

因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

关闭连接

当收到对方的FIN报文时,仅表示对方不再发送数据但还能接收收据,我们也未必把全部数据都发给了对方,所以我们可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方表示同意关闭连接。因此我们的ACK和FIN一般会分开发送。

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图 


为什么需要TIME_WAIT状态

1、可靠的终止TCP连接 
2、保证让迟来的TCP报文段有足够的时间被识别并丢弃

1)为实现TCP这种全双工连接的可靠释放

这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用。

2)为使旧的数据包在网络因过期而消失

每个具体TCP实现必须选择一个报文段最大生存时间MSL。它是任何报文段被丢弃前在网络内的最长时间。
 

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

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

相关文章

P1072-Hankson的趣味题【数论,gcd】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1072 题目大意 a1gcd(a0,x)a1gcd(a0,x)b1gcd(b0,x)b1gcd(b0,x)求xx解题思路如果 a1=gcd(a0,x)" role="presentation">a1=gcd(a0,x)a1=gcd(a0,x) 所以xka∗a1xka∗a1b1gcd(b0,x)b1g…

HTM文件中使用vue

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 代码啊,尤其是比较重要客户的项目,即使包出去了,代码也一定要回到自己手里,不然干着急。 这个项目,已经经过两手了&#xff0c…

LVS三种模式的区别及负载均衡算法

转载自 LVS三种模式的区别及负载均衡算法 LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是一个虚拟的服务器集群系统,由章文嵩博士在1998年5月成立,在linux2.6后将lvs自动加入了kernel模块,我们…

POJ3696-The Luckiest number【数论,欧拉定理】

正题 题目链接:http://poj.org/problem?id3696 题目大意 求多少个8连在一起是LL的倍数。解题思路将x个8连在一起分解一下 10x−19" role="presentation">10x−1910x−19 那么就是 L|2∗(10x−1)9L|2∗(10x−1)9dgcd(L,8)dgcd(L,8)分解一下 9…

王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍

在国内,如果你没有听说过《王者荣耀》,那你一定是古董级的人物了。 《王者荣耀》(以下简称“农药”),专注于移动端(Android、IOS)的MOBA游戏。笔者看到这么火爆,就萌生了了解一下这类…

Java数组,字符串

数组定义 数据类型 名称[] new 数据类型[n] int data[] new int[3];data[0] 10;data[1] 11;data[2] 25;一步定义数组,并循环输出 int data[] new int[] {1,2,3,4};for (int i : data) {System.out.println(i);}字符串数组定义,并循环 String d…

新工作感悟~辞旧迎新~

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂”现在是:2022年6月21日22:33:34公众号又好久没有更新啦。从以前的日更,到后来的周更,再到后来的月更……不知道会不会到不更的结局。。。最近换工作了&…

POJ1845-Sumdiv【逆元,等比数列,约数】

正题 题目链接:http://poj.org/problem?id1845 题目大意 求ABAB次方的约数和。答案mod 9901mod9901解题思路 AA的约数和就是 (1+p1+p12+p13...+p1c1)+(1+p2+p22+p23...+p2c2)+...(1+pn+pn2+pn3...+pncn)" role="presentation">(1+p1+p21+p31...+pc11)+(…

关于Spring底层原理面试的那些问题,你是不是真的懂Spring?

转载自 关于Spring底层原理面试的那些问题,你是不是真的懂Spring? 1.什么是 Spring 框架?Spring 框架有哪些主要模块? Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring帮助开发者解…

ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解

1.1. 名词解释 内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序。 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取。 1.2. Kestrel基本工作原理 Kestrel是…

糊涂工具类(hutool)post请求设置body参数为json数据

大家好,我是雄雄,欢迎关注微信公众号雄雄的小课堂 今天介绍一个案例,糊涂工具类(hutool)post请求设置body参数为json数据,刚开始写的总是报错,下面是正确的代码: /*** 添加动作* pa…

Failed to execute

今天用dev c无论打编译什么都是出现如下结果: 后来终于找到解决办法了: 原来是这里出现问题了,我的电脑是32位的,必须也是32位的编译系统。否则不管输入什么都是上面的结果; 所以以后不管下载软件还是编译东西第一步一定要看自…

P1313-计算系数【组合数,二项式定理】

正题 评测链接:https://www.luogu.org/recordnew/lists?uid52918&pidP1313 题目大意 求(axby)k(axby)k,求多项式展开后xnymxnym项的系数,答案mod 10007mod10007。 解题思路 二项式定理 (axby)k∑i0kCikaibk−ixiyi(axby)k∑i0kCkiaibk−ixiyix…

web.xml 组件加载顺序

转载自 web.xml 组件加载顺序 在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要。 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前。 经过查阅和Debug发现, web.xml组件加载顺序为&#…

日期工具类处理总结(全)

文章目录前言代码展示前言 最近项目中用到了一些关于日期类和字符串类的处理,用到一次就得去写一次,后来想了想这样不光效率低还浪费时间浪费精力,于是就将常用的一些方法提取成工具类,每个项目都考进去一次,用的时候…

asp.net core 2.0 web api基于JWT自定义策略授权

JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端验证通过即可能获取想要访问的资源。关于JWT的技术,…

P3811-[模板]乘法逆元【线性求逆元】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3811 题目大意 求1∼n1\sim n1∼n中modpmod\ \ pmod p的逆元。 解题思路 首先对于p,我们将其分解为kir(k⌊pi⌋,rp%r)kir(k\lfloor \frac{p}{i}\rfloor,rp\%r)kir(k⌊ip​⌋,rp%r)&…

BATJ面试必会|Jvm 虚拟机篇

转载自 BATJ面试必会|Jvm 虚拟机篇 目录 一、运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 二、垃圾收集 判断一个对象是否可被回收 引用类型 垃圾收集算法 垃圾收集器 三、内存分配与回收策略 Minor GC 和 Full GC 内存…

让网页背景颜色改变

如何改变背景的颜色呢&#xff0c;这里提供一个方法 <!DOCTYPE html> <html><head><style type"text/css">body {background-color: red}p {margin-left: 1px}</style><title>我yi癫狂</title></head><body>…

nssl1141,jzoj3470-最短路【SPFA,暴力】

正题 纪中题目链接:https://jzoj.net/senior/#main/show/3470 题目大意 在从起点经过k个标记点然后到终点的最短路。 解题思路 用SPFA求出起点和所有标记点的最短路&#xff0c;然后暴力枚举标记点到达顺序。 时间负责度:O(K(NM)k!)O(K(NM)k!)O(K(NM)k!) code #include<…