TCP的三次握手和四次挥手的过程是怎么样的?

        传输控制协议,TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流传输层通信协议。重点就是数据输送前后的客户端服务器端是如何进行连接与断开的,这就涉及到TCP的三次握手和四次挥手了,同时呢这也是我们在面试中出现得比较高频的问题。

(1)消息类型

  • SYN:同步标志位,用于建立会话连接,同步序列号。(出现于三次握手中)
  • ACK:确认标志位,对已接收的数据包进行确认。(两种过程皆有出现)
  • FIN:完成标志位,表示已经没有数据要发送了,即将关闭连接。(出现于四次挥手中)

明白了这些词的含义之后,下面我们开始讲解三次握手和四次挥手的过程。

(2)三次握手

2.1 连接过程

        三次握手-->在建立TCP连接时,需要通过三次握手来建立,过程如下:

  • 第一次握手:
            客户端此时会先向服务器端发送一个SYN,并且在TCP报文中将标志位SYN设置为1,表示我要进行会话的连接,并随机产生一个序号值seq= X,保存在TCP首部的序列号字段里面,这里指的是客户端想要连接的端口。接下来就会将该数据包发送给指定的服务器端,发送完毕之后,此时我们的客户端会进入 SYN_SENT 状态,表示发送完连接请求了,此时等待服务器端的确认。
  • 第二次握手:
            服务器端接收到了客户端发送的请求,由于SYN设置为1,表示需要进行连接,此时服务器端就会给客户端进行一个回应,表示服务器端知道客户端的连接请求了,此时服务器端就会发送一个SYN_ACK,这个表示来自本地设置的SYN消息(设置为1)和先前数据包的ACK(设置为1),是SYN与ACK合成的一个报文段,同时随机产生一个序号值seq = Y,并将该数据包发送给客户端以确认连接的请求,此时的服务器端就会进入 SYN_RCVD 状态。
  • 第三次握手:
            客户端在接收到了SYN_ACK之后,服务器端明白了那边已经知晓自己的连接请求,此时就会先检查ack是否为序号值+1(ack=seq+1),也就是ack是否等于X+1,同时确认ACK是否等于1。如果都符合,那么服务器端就会将标志位ACK设置为1,ack设置为K+1,并且将该数据包发送给服务器端,表示客户端这边接收到了服务器端的同意请求。
            服务器端接收到了数据包之后,同样也会进行上述的检查,如果检查到ACK等于1,并且ack = K+1,那么则表示双方都接收到消息并且确认进行连接,此时连接建立成功,客户端服务器端都进入到 ESTABLISHED 状态,完成了三次握手的动作,之后就可以进行客户端服务器端之间的数据传输了。

PS:如果看不太懂上面的过程的话,可以先看总结!

2.2 相关图示

        

 2.3 总结

        其实三次握手的过程我们可以类比如现实的一些事情,这样就变得通俗易懂啦!这里就简单举个例子:

背景:小邱打算明天要去图书馆学习,他想叫小徐一起去学习,于是有了下面的对话。

小邱:呼叫小徐,呼叫小徐,明天七点图书馆集合,能否收到?

小徐:呼叫小邱,呼叫小邱,这边接收到小邱的信息,明天七点开卷!

小邱:收到小徐确认信息,明天七点不见不散!

(1)第一次握手,小邱发送给小徐说去图书馆学习的信息。

(2)第二次握手,小徐接收到小邱的信息,回应小邱自己接收到信息。

(3)第三次握手,小邱接收到小徐的信息,并且回应小徐自己接收到小徐的确认信息。

两者达成一致目的,就是一起去七点图书馆学习。

        回到TCP的三次握手过程,对应上面的例子简单描述一下连接过程:

(1)第一次握手:客户端向服务器端发送数据包,表示自己要进行连接。

(2)第二次握手:服务器端接收到客户端的请求,回应客户端说服务器端接收到请求,同意进行连接。

(3)第三次握手:客户端接收到来自服务器端的确认信息,发送给服务器端说自己接收到来自服务器端的同意请求,开启数据传输。

于是客户端和服务器端都进入了数据传输的模式。

(3)四次挥手

3.1 断开连接过程

        四次挥手-->在断开TCP连接的时候,需要通过四次挥手来断开,下面以客户端请求断开连接作为示例。过程如下:

  • 第一次挥手:
            客户端服务器端会发送一个FIN报文段,设置为1,表示要断开连接,此时就会发起挥手的请求,向服务器端发送FIN报文段,并且随机设置序列号seq=X。此时,客户端就会进入到 FIN_WAIT_1 状态,表示已经没有数据要发给服务器端了,想要断开连接。
  • 第二次挥手:
            服务器端接收到客户端的发送过来的FIN,知道客户端要断开连接了,此时就会进入CLOSE_WAIT_2 状态,这时会向客户端发送ACK,设置为1,表示接收到了断开连接的请求,客户端你可以不用再发送数据过来,服务器端这边需要处理一下剩下的数据。服务器端就会向客户端发送一个标志位为ACK的报文段,ack设置为seq加1,也就是X+1。服务器端告诉客户端,我确认并同意你的关闭请求。
  • 第三次挥手:
           客户端接收到来自服务器端的请求,知道它已经确认了自己要断开连接的信息,此时客户端就会进入 FIN_WAIT_2 状态,等待服务器发送连接释放报文。当服务器端将最后的数据发送完毕后,就会向客户端发送标志位是FIN的报文段,请求关闭连接,同时服务器端就会进入LAST_ACK 状态。
  • 第四次挥手:
           客户端接收到服务器端的FIN报文段,此时就会向服务端发送ACK,表示客户端也会断开连接了。客户端在收到服务器端发送的FIN报文段之后,会向服务器端发送标志位是ACK的报文段,并进入 TIME_WAIT 状态,等待 2MSL服务器端收到客户端的ACK报文段以后,就关闭连接,进入 CLOSED 状态。此时,客户端在等待2MSL的时间后依然没有收到任何回复的话,证明服务器端已正常关闭,这时客户端也可以关闭连接了,进入CLOSED 状态。

3.2 相关图示

3.3 总结

        四次挥手和三次握手个人其实觉得还是蛮类似的,只是中间服务器端多了一步处理剩余数据的步骤,其他步骤基本类似。下面还是以上面三次握手的例子的扩展进行举例:

背景:在小邱和小徐说好了明天要去图书馆学习之后,小柯小邱明天陪他一起去教室敲代码,鉴于上次小柯帮了小邱的忙,小邱小徐说明天不去图书馆学习了,于是有了下面的对话。

小邱:呼叫小徐,呼叫小徐,突发事故!明天不去图书馆学习了,能否收到?

小徐:呼叫小邱,呼叫小邱,这边接收到小邱的信息,等我写完这道数学考研题后给你回复!

小徐:在十分轻松地解决了考研数学题之后,小徐思考了一下,决定明天睡大觉!通知小邱说明天他也不去图书馆了。

小邱小邱接收到了小徐说不去图书馆的信息,和小徐说了一声ok。小邱松了一口气,但是害怕小徐这种热爱学习的人会反悔,于是还是慢慢等着小徐的信息,看看他会不会改变主意。在经过了漫长的等待之后,小邱确定了小徐不会反悔,于是他就放心地取消了和小徐明天去图书馆的计划。(第二天和小柯去了教室敲代码)

(1)第一次挥手,小邱向小徐通知了他明天不去图书馆的消息。

(2)第二次挥手,小徐接收到了小邱的请求,知道了小邱明天不去了,告诉小邱说他知道了。然后他就开始思考明天去不去图书馆。

(3)第三次挥手,思考过后,小徐决定明天不去图书馆了,打算睡大觉,并发信息给小邱说他也决定不去图书馆了。

(4)第四次挥手,小邱收到小徐不去图书馆的信息,但是鉴于小徐是一个热爱学习的人,他怕小徐会反悔,等待了一段时间发现小徐没有给他发消息,那么小徐真的不去图书馆了,小邱自己也放心了,明天不去图书馆了。

        回到TCP的四次挥手过程,简单地描述断开连接的过程:

(1)第一次挥手:首先客户端向服务器端发送断开连接的请求,发送一个FIN报文段,表示要断开连接。

(2)第二次挥手:服务器端接收到来自客户端的请求,知道客户端要断开连接,给客户端回复自己已经知晓,这边再处理一下剩下的数据。发送ACK报文段,表示确认并同意关闭请求。

(3)第三次挥手:服务器端处理完了剩余的数据,向客户端发送标志位为FIN的报文段,请求关闭连接。

(4)第四次挥手:客户端接收到服务端的FIN报文,明白服务器端同意关闭的请求,此时向服务器端发送ACK报文段表示自己知道了服务器端同意断开连接的请求,自己也会断开连接,发送过去等待了2MSL之后没有收到恢复,表示服务器端已经正常关闭了,那么客户端也可以关闭连接了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值