三次握手与四次挥手

三次握手

在服务器和客户端建立TCP连接时,一共会发送三个报文

在客户端执行connect语句时 会向服务器发送第一次报文

***三次握手过程***

1.第一次在客户端执行connect语句时,客户端向服务器发送第一次报文 SYN 序列号 seq=i此时客户端 SYN_SENT状态

2.第二次服务器接收到客户端发送的报文需要回复客户端报文,SYN seq=j ack=i+1 此时服务器 SYN_RCVD 状态

3.第三次客户端收到服务器的回复,发送一条确认报文 SYN ack=j+1 此时客户端进入 ESTABLISHED 状态

在服务器接收到客户端第三次发送的ACK 报文后 客户端和服务器ESTABLISHED 状态

注:第一次第二次握手都只是消耗掉一个序列号 不可以携带数据,第三次握手可以携带数据

在这里插入图片描述

**三次握手的作用:**

1.确认双方的接受能力,发送能力是否正常

2.指定自己的初始化序列号,为后面的可靠传送做准备

**三次握手的目的是什么?**

第一次握手:客户端给服务器发送一个报文,告知服务器:“我客户端想和你建立连接”。

服务器收到第一段报文后得出结论:客户端发送功能正常,服务器接收功能正常。

第二次握手:服务器收到报文后给客户端回复一个报文,告知客户端:“我服务器收到了你的请求,同意和你建立连接”。

客户端收到第二段报文后得出结论:客户端发送和接收功能都正常,服务器的发送接收功能也都正常。(但此时服务器不能确认客户端的接收功能和自己的发送功能是否正常)。

第三次握手:客户端收到第二段报文后给服务器回复一个报文,告知服务器:“我客户端收到了你的回复,知道你同意连接,那我们开始连接吧!”

服务器收到第三段报文后得出结论:客户端的接收功能和服务器的发送功能也都正常。

所以当服务器收到第三个报文后,两边就建立起了TCP连接

**两次握手为什么不可以?**

如果是两次握手的话,服务器就无法确定自己回复的报文段是否被客户端接收到,也就不知道自己的发送功能和客户端的接收功能是否正常。

四次挥手

四次挥手就是客户端和服务器之间的TCP连接需要断开时,双方一共通过四次报文段来确认连接的断开。

最开始服务器和客户端都处于建立连接状态(ESTABLISHED),关闭双方都可以主动发起,主动发起的一方主动发送第一个FIN报文,下面以客户端主动发起示例。

**四次挥手过程**

**1.第一次挥手:**客户端发送一个FIN报文,seq=i 发送报文后进入 FIN_WAIT_1 状态。

2.第二次挥手:服务器收到客户端发送的第一个FIN报文后,立即回复一个ACK报文 ACK=i+1 此时服务器进入CLOSE_WAIT状态。

**3.第三次挥手:**服务器向客户端发送一个FIN报文 并且重新指定一个序列号 seq=j ack不变 ack=i+1,并且表明可以断开连接。

**4.第四次挥手:**客户端收到服务器发送的FIN报文后,回复一个ack作为应答,ack=j+1,此时客户端断开连接,并且处于TIME_WAIT状态。

服务器在收到客户端回复的ack报文后断开连接,并且处于CLOSED状态。

在这里插入图片描述

**为什么挥手需要四次?**

通常这种问题是 三次挥手为什么不可以?

通常情况下不行,因为ACK和FIN的触发时机是不一样的。因为:服务器在收到FIN报文后可以立即发送ACK报文,表明我服务器收到了你的报文;但是此时服务器通常还有数据需要进行处理,当服务器处理完这些数据后才会发送FIN报文,所以挥手需要四次。

**为什么要等待2MSL?(为什么会存在一个TIME_WAIT状态?)**
报文段最大生存时间MSL(Maximum SegmentLifetime),它是任何报文段被丢弃前在网络内的最长时间,超过这个时间报文将被丢弃。等待2MSL是为了确保服务器收到了最后一段ACK报文。

**TIME_WAIT状态的作用**

TIMEWAIT状态 (主动关闭的一方会存在TIMEWAIT状态)

1.可靠的终止tcp链接

2.保证迟来的tcp报文段有足够的时间被识别并丢弃

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值