三次握手
第一次握手:客户端–发送带有 SYN 标志的数据包–服务端
第二次握手:服务端–发送带有 SYN/ACK 标志的数据包–客户端
第三次握手:客户端–发送带有带有 ACK 标志的数据包–服务端
为什么要三次握⼿
三次握⼿的⽬的就是双⽅确认⾃⼰与对⽅的发送与接收是正常的。
第⼀次握⼿:Client 什么都不能确认;Server 确认了对⽅发送正常,⾃⼰接收正常
第⼆次握⼿:Client 确认了:⾃⼰发送、接收正常,对⽅发送、接收正常;Server 确认了:对⽅发送正常,⾃⼰接收正常
第三次握⼿:Client 确认了:⾃⼰发送、接收正常,对⽅发送、接收正常;Server 确认了:⾃⼰发送、接收正常,对⽅发送、接收正常
所以三次握⼿就能确认双发收发功能都正常,缺⼀不可。
四次挥手
简要概述
第⼀次挥手:客户端-发送⼀个 FIN,⽤来关闭客户端到服务器的数据传送
第二次挥手:服务器-收到这个 FIN,它发回⼀ 个 ACK,确认序号为收到的序号加1 。和 SYN ⼀样,⼀个
FIN 将占⽤⼀个序号
第三次挥手:服务器-关闭与客户端的连接,发送⼀个FIN给客户端
第四次挥手:客户端-发回 ACK 报⽂确认,并将确认序号设置为收到序号加1
为什么要四次挥⼿
任何⼀⽅都可以在数据传送结束后发出连接释放的通知,待对⽅确认后进⼊半关闭状态。当另⼀
⽅也没有数据再发送的时候,则发出连接释放通知,对⽅确认后就完全关闭了TCP连接。
详细解析
①第一次:最开始客户端和服务器都是连接建立的状态(establish)
客户端向服务器发送FIN,客户端进入FIN_WAIT_1状态
②第二次:服务器回ACK,服务器进入CLOSE_WAIT状态;
客户端收到ACK后,进入FIN_WAIT_2状态
③第三次:服务器发送FIN,进入LAST_ACK状态(等待对方的ACK报文,当收到ACK后,进入到CLOSED状态);
④第四次:客户端收到FIN报文段后,发送ACK,进入TIME_WAIT状态;服务器收到ACK,进入close状态,服务器关闭连接;
此时,客户端等待2MSL,为了防止服务器没收到ACK,则服务器超时重传FIN请求,经过2MSL后进入close状态,客户端才可以关闭连接。
为什么要有TIME_WAIT这个状态?
主要有两个原因:
1.可靠的关闭TCP连接:
在客户端发送的ACK可能丢失,这时服务器会重发FIN, 如果客户端处于 CLOSED 状态 ,则会响应RST而不是ACK。所以客户端要处于 TIME_WAIT 状态,而不能是 CLOSED 。
2.防止重传的FIN包影响新连接