关于TCP通信中的三次握手与四次挥手

一、三次握手

        最开始时,客户端与服务器服务器均处于close状态,当服务器创建了一个监听套接字后进入listen状态才可以开始进行三次握手。

        第一次握手:由客户端最先开始向服务器发送一个数据包,该数据包为请求包,包中标志位SYN置为1,序列号seq值为x。该数据包发送完毕后客户端处于SYN_SENT状态。

        第二次握手:在服务器收到客户端发出的请求包之后,会回复给客户端一个数据包,且该包既是确认包也是请求包,包中标志位SYN与ACK均置为1,该包的序列号seq为y,确认序列号ack为x+1(表示该包回复已经收到了序列号为x的数据包)。该数据包发送完毕后服务器处于SYN_RECV状态。

        第三次握手:客户端收到服务器回复的数据包后,再回复给服务器一个数据包,该包为确认包,包中标志位ACK置为1,该数据包的序列号seq为x+,确认序列号ack为y+1(表示该包回复已经收到了序列号为y的数据包)。客户端在发送完该数据包后君如ESTABLISHED状态,服务器在收到该数据包且确认无误后状态变为ESTABLISHED状态。

        三次握手分别起到了什么作用:

        第一次握手:服务器收到数据包后可以确认发送数据包的客户端是发送能力与自己的接收能力正常。

        第二次握手:客户端收到数据包后可以确认自己的发送、接收能力与服务器的发送、接收能力正常。

        第三次握手:服务器收到数据包后可以确认自己的发送、接收能力与客户端的发送、接收能力正常。

        可以初始化序列号,来保证后续数据传输的可靠性。

为什么握手次数不是两次或者四次:

        握手的目的是确认双方的收发能力是否正常。

        两次握手只能满足客户端确认双方的收发能力正常,而服务器并不能确认自己的发送能力与客户端的接收能力是否正常。

        当第三次握手完成后双方都可确认自己与对方的收发能力正常,因此继续进行第四次握手就没有必要,还会降低性能。

二、四次挥手

        四次挥手中主动请求断开连接的既可以是服务器也可以是客户端,但通常都是客户端主动断开连接。

以下假设由客户端发出断开连接的请求:

        第一次挥手:由客户端向服务器发送一个数据包,包中FIN标志位置为1序列号y,即客户端向服务器发出一个断开连接的请求,同是客户端的状态变为FIN_WAIT_1。

        第二次挥手:服务器收到客户端发送过来的数据包后就会给客户端回复一个ACK为1,序列号seq为m,确认序列号ack为y+1的确认包给客户端,然后进入客户端进入CLOSED_WAIT状态(此时服务器可能还有数据需要发送,所以需要等待服务器处理完事情),客户端在收到服务器的确认包后进入FIN_WAIT_2状态。

        第三次挥手:服务器处理完数据之后会再向客户端发送一个FIN为1,ACK为1,序列号seq为z、确认号ack为y+1的数据包,并且进入LAST_ACK状态(告诉客户端,剩下的事情处理完了,可以断开连接了)。

        第四次挥手:客户端收到服务器发来的FIN包后会发送一个ACK为1,序列号seq为y+1,确认号ack为z+1的确认包来应答,但是客户端不会马上关闭,而是等待2MSL(2倍最大报文段生存时间)后再进入CLOSE状态。

为什么主动方要经过TIME_WAIT等待2MSL后再关闭:

        为了保证主动方发送的最后一个ACK报文段能够确实的传达到被动方。
由于网络本身是不可靠的,导致最后一个报文段ACK有丢失的可能,假设最后一个ACK报文段丢失,被动方因为没有收到回复,会再次发送一个FIN请求包,此时若是主动方已经关闭连接,则被动方会认为连接出错,就无法正常进入到CLOSE状态。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值