TCP的三次握手与四次挥手

本文详细解析了TCP协议中的三次握手和四次挥手过程,解释了它们在建立和关闭连接时的重要作用,包括确认双方通信能力、初始化序列号、避免资源浪费和防止新旧连接混淆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三次握手

所谓三次握手,就是客户端与服务端建立TCP连接时,需要发送三个包,俗称三次握手。

ACK:TCP协议规定只有ACK = 1时有效,因此连接建立后的每次数据传输ACK都必须为1.
SYN:在建立连接时,用来同步序号,当ACK为0且SYN为1时,表示这是一个同步序号。
在这里插入图片描述
连接建立之前,服务端处于Listen状态,客户端处于Closed状态。

  • 第一次握手:客户端给服务端发送一个SYN报文,告诉服务器自己想与服务器建立连接,并指明客户端的初始序列号seq为x,可以认为这是一个随机数(防范攻击),此时客户端处于SYN_SENT状态。
  • 第二次握手:服务器收到客户端的SYN请求报文后,会以自己的ACK报文作为应答,并指定自己的初始化序列号seq为y。同时会把客户端的seq序列号 + 1 作为ack发送过去,表示自己已经收到了客户端的SYN请求,此时服务器处于SYN_REVD状态。
  • 第三次握手:客户端收到来自服务端的ACK和SYN后,将服务端的ISN + 1作为ack的值重新发送过去,表示已经收到了服务端的SYN报文,此时客户端处于ESTABLISHED状态。服务器收到ack报文后也处于ESTABLISHED状态。

此时双方已经建立了连接。

三次握手的作用
  • 确认双方都具有接收和发送信息的能力。
  • 指定初始化序列号,双方的窗口大小,为后面的可靠传输做准备。
为什么是三次握手,而不是两次或者四次

三次握手的目的就是在数据发送之前,服务端和客户端互相确认一下对方的收发功能是否正常。
首先分析四次的情况
在三次握手的情况下,通信双发已经确认对方都具有发送和接收的能力,因此四次握手是没有必要的。

两次握手的情况:

  • 在建立连接后,两次握手是无法确认客户端具有接收的能力。
  • 假如客户端发送的连接请求在网络中滞留,经过一个超时重传时间后,客户端重传了一个连接请求,服务器会对两个请求都做出响应,这样的话就建立了两个连接,但是如果三次握手的话,客户端会忽略后面的服务器对响应做出的确认,因此不会建立新的连接。
如果已经建立了连接,但客户端出现了故障怎么办?

TCP设有一个保活计时器(心跳检测机制),客户端出现故障,服务端不可能一直等下去,白白浪费资源,服务器每次收到客户端的请求后,都会重置计时器,若在计时器的范围内还没有收到数据,服务器就会发送一个探测报文段,每隔75s发送一个,若间隔发送了10个还没有反应,服务器就认为客户端出问题了,断开连接,释放socket资源。

关闭TCP连接 ------- TCP的四次挥手

四次挥手的意思是关闭TCP连接时,服务端与客户端需要发送四个数据包,俗称四次挥手。因为TCP是全双工的,每个方向都需要独立关闭。客户端和服务端都可以主动关闭连接。
在这里插入图片描述

  • 第一次挥手:客户端向服务端发送一个FIN,用来关闭客户端到服务器的数据传输,此时表明客户端已经没有数据发送给服务端了。客户端进入FIN_WAIT状态。
  • 第二次挥手:服务端收到FIN后,发送ACK,确认序号为收到序号+1,告诉客户端我已经知道你没有资源发送给我了。服务端处于CLOSE_WAIT状态,客户端收到ACK后进入FIN_WAIT2状态。
  • 第三次挥手:服务端向客户端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。
  • 第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务端,服务端进入CLOSED状态,四次挥手结束。
为什么会有TIME_WAIT状态?
  • 确保对方有足够的时间接收ACK(确保最后一个报文到达),如果没有收到ACK包,会重新发送FIN包,因此这边也需要重新发送ACK包,ACK过去,FIN过来,这一来一回刚好2MSL,只要在大于或者等于2MSL时间没有收到FIN的重传,说明对方已经收到ACK了,最后这个ACK没有丢失。
  • 避免新旧资源混淆:使得网咯中延迟的报文都消失在网络中,使其不会对后面的连接造成影响。
为什么握手四次而挥手需要三次?

因为TCP协议是全双工的,一方确定不发送数据后,还可以继续接收数据,需要等到双方都无数据再发,无数据再收,才达到真正的关闭。一方发送FIN包后仅能代表他没有数据发送了,但对方的可能还有数据要传送过来,因此关闭连接都需要双方主动关闭。确保缓冲区中数据发送完毕。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值