三次握手
-
为了准确无误地将数据送达目标处,TCP 协议采用了三次握手(three-way handshaking)策略。用 TCP 协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。
-
握手过程中使用了 TCP 的标志(flag) —— SYN(synchronize) 和ACK(acknowledgement)。发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束。
-
若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发送相同的数据包。
简易过程:
客户端—》发送标有SYN数据包—》一次握手—》服务端
服务端—》发送标有SYN/ACK数据包—》二次握手—》客户端
客户端—》发送标有ACK数据包—》三次握手—》服务端
目的:
三次握手是为了保证双方数据的可靠传输(即客户端和服务器接收与发送都正常)
- 第一次握手:Client什么也不能确认;Server确认对方发送正常,自己接收正常
- 第二次握手:Client确认自己发送、接收正常,对方发送、接收正常;Server确认对方发送正常,自己接收正常
- 第三次握手:Client确认自己发送、接收正常,对方发送、接收正常;Server确认对方发送、接收正常,自己发送、接收正常
四次挥手
图解:
简易过程
- 客户端—发送一个 FIN,用来关闭客户端到服务器的数据传送
- 服务器—收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加1。和 SYN 一样,一个 FIN 将占用一个序号
- 服务器—关闭与客户端的连接,发送一个 FIN 给客户端
- 客户端—发回 ACK 报文确认,并将确认序号设置为收到序号加1
目的
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
- 客户端发送连接释放报文,停止发送数据,进入FIN-WAIT-1(终止等待状态);
- 服务器收到连接释放报文,发送确认报文并进入CLOSE-WAIT(关闭等待)状态(此时若服务器发送数据,客户端依旧需要接收)
- 客户端收到确认报文后,进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文
- 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,当服务器不再发送数据后,就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 客户端收到服务器的连接释放报文后,必须发出确认报文。此时,客户端就进入了TIME-WAIT(时间等待)状态。
- 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。结束了这次的TCP连接。
引用:https://snailclimb.gitee.io/javaguide/#/network/计算机网络?id=_24k
引用:https://blog.youkuaiyun.com/qzcsu/article/details/72861891