三次握手、四次挥手

三次握手


一次握手:客户端发送SYN=1(不能携带数据)、序列号seq=x的连接请求,进入SYN-SENT状态(等待服务器确认状态)。
二次握手:服务器收到连接请求后,向客户端发送ACK=1,ack=x+1确认应答,同时自己发送SYN=1(seq=y)连接请求,服务器进入SYN-RCVD状态。
三次握手:客户端收到ACK后进入链接成功状态ESTABLISHED,并且向服务器发送ACK=1,seq=x+1,ack=y+1包确认应答,服务器收到应答后进入链接成功状态。
注意:TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。

最后一次了客户端为什么还要发送一次应答?
主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
有了最后一次客户端的应答后,服务器才知道,是不是这个客户端要连接,如果客户端没有回复ACK,那么服务器就不会建立连接。

四次挥手

在这里插入图片描述
一次挥手:客户端向服务器发送关闭请求FIN=1,seq=u,进入FIN-WAIT-1等待关闭1状态。
二次挥手:服务器收到关闭请求后,发送ACK=1,seq=v,ack=u+1包确认应答后,服务器不会立即关闭SOCKET,而是进入CLOSE-WAIT状态(关闭等待状态)。客户端收到应答后进入FIN-WAIT-2状态。
三次挥手:服务器向客户端发送FIN=1,seq=w关闭通知,进入LAST-ACK(等待ACK)状态。
四次挥手:客户端收到FIN后,立即发送ACK=1,ack=w+1确认应答,然后进入TIME-WAIT(时间等待状态)。服务器收到ACK后进入CLOSED状态。而客户端在等待来回两趟的时间–2MSL(最大报文段生存时间)后没有再收到FIN,默认对方收到了,则立即进入CLOSED(关闭状态)

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
假设最后一个ACK丢失,这时需要客户端重新发ACK包。TIME_WAIT等待2MSL时间就是为了防止ACK包丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值