当前位置: 首页 > news >正文

浅显易懂的三次握手与四次挥手

目录

一、三次握手

什么是三次握手?

三次握手图解:

过程解析:

(1)第一次握手:

(2)第二次握手:

(3)第三次握手:

二、四次挥手

什么是四次挥手?

四次挥手图解:

过程解析:

(1)第一次挥手

(2)第二次挥手

(3)第三次挥手

(4)第四次挥手

三、两个有意思的问题

为什么连接是三次握手,关闭却要四次挥手?

如果已经建立了连接客户端突然故障怎么办?


一、三次握手

什么是三次握手?

手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。

TCP共有6个标志位,常见的:

标志位含义
SYN(synchronous)建立连接
ACK(acknowledgement)响应确认
FIN(finish)结束
RST(reset)重置

建立起一个TCP连接需要经过“三次握手”

三次握手图解:

在这里插入图片描述

过程解析:

(1)第一次握手:

客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。

j是一个随机数,通过看服务器返回的j+1是否正确,判断第一次握手服务器是否正确响应。

(2)第二次握手:

服务器确认客户的SYN包,同时发送ACK包(ack = j+1)作为回应;

自己也发送一个SYN包(syn=k),共两个包,此时服务器进入SYN_RECV状态;

k也是一个随机数,也是用于看客户端返回的k+1是否正确,判断第二次握手客户端是否正确响应。

(3)第三次握手:

客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。


第一次握手:客户端发送SYN包(syn=j)到服务器,等待服务器确认。

第二次握手:服务器确认客户的SYN包,并回复客户端SYN加ACK包;

第三次握手:客户端收到服务器的SYN+ACK包,并向服务器发送确认包ACK(ack=k+1),这样TCP就连接成功,完成三次握手。


二、四次挥手

什么是四次挥手?

和三次握手逻辑相同,非常相似。

四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

四次挥手图解:

在这里插入图片描述

过程解析:

(1)第一次挥手

客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。

意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。

(2)第二次挥手

服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。

(3)第三次挥手

当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。

(4)第四次挥手

客户端收到FIN=N报文后,就知道可以关闭连接了。

但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。

客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。

最终完成了四次握手。


第一次挥手:客户端发送FIN包给服务器,要求要断开。

第二次挥手:服务器收到FIN包后,回复一个ACK包和一个确认序号给客户端,直到此时客户端还可以接收服务器的数据,但是不能发送。

第三次挥手:客户端收到服务器的回复后,等待服务器发送连接,释放报文FIN来关闭服务器到客户端的数据传输,当服务器发送了FIN+ACK后,还需要等待客户端的确认;

第四次挥手:客户端收到FIN后,发送ACK和确认序号给服务器,到这里为此,4次挥手结束。


三、两个有意思的问题

为什么连接是三次握手,关闭却要四次挥手?

建立连接时,ACK和SYN可以放在一个报文里来发送。

而关闭连接时,被动关闭方可能还需要发送一些数据,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

说得尽可能具体一些就是

客户端发送FIN关闭报文,但是服务端仍在给他发送数据不能马上停止,服务端先给出ACK报文回应(你的请求我收到了,但要等我发完数据才能关闭哦)。当服务端发送完毕后,再发送FIN报文请求关闭,所以这两个报文不能同时发送,故有了四次挥手。

如果已经建立了连接客户端突然故障怎么办?

TCP还设计有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。

服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

另外的:如果客户端没有数据发送,又不想断开的话还要发心跳包,心跳包这个数据没用,只是告诉服务器我客户端还在。

 

相关文章:

  • 网站建设前台功能/兰州网络seo公司
  • div+css网络公司网站模板/北京网络营销公司哪家好
  • 国土资源网站建设方案/站长seo
  • 农家乐网站建设营销方案/房地产网站建设
  • 南阳网站优化排名/怎么查询搜索关键词
  • 高端品牌网站建设优势/自己怎么做网站网页
  • 【C++11】—— lambda表达式
  • 内核转储的设置
  • 【指针笔试题下】你知道大厂面试题的指针题是什么样的吗?快来通过这些面试题目检测一下自己吧!
  • 【北京理工大学-Python 数据分析-3.1Pandas库的基本使用】
  • 谷粒学院复习
  • ARC153C ± Increasing Sequence
  • 线程启动、结束与创建线程写法
  • uni-app使用手机号一键登录
  • HBase RowKey设计和实现
  • 代码随想录算法训练营第四期第五十九天 | 503.下一个更大元素II 、42. 接雨水
  • Promise详解
  • “华为杯”研究生数学建模竞赛2004年-【华为杯】C题:汽车千车故障数的预测与分析(附优秀论文)