三次握手四次挥手
1.三次握手的状态
- LISTEN:表示服务器的某个socket进入监听状态了,可以接受连接
- SYN_SENT:表示客户端已经发送过了SYN报文
- SYN_RCVD:表示接受到了SYN报文
- ESTABLISHED:表示已经建立连接
2.四次握手的状态
- FIN_WAIT_1:当socket在ESTSABLISHED状态时,想要主动的关闭连接,向对方发送了FIN报文,socket进入FIN_WAIT_1状态
- FIN_WAIT_2:收到对方的ACK应答后进入FIN_WAIT_2状态,FIN_WAIT_2状态下的socket其实是半连接状态,一方要求close连接,另一方要检查自己的数据是否已经传送完毕。
- TIME_WAIT:表示对方收到了FIN报文,并发出了ACK报文,等2ms后回到CLOSED状态。
- CLOSING:表示双方同时关闭连接,双方几乎同时调用close函数,同时发送FIN报文,CLOSING状态也就是在你发出FIN后想要收到对方的ACK结果收到的是对方发送的FIN报文。
- CLOSE_WAIT:表示等待关闭,当收到对方的FIN报文后,给对方返回ACK,检查自己的数据是否传送完毕。
- LASK_ACK:被关闭的一方发送完FIN后进入 LASK_ACK收到,等收到ACK后进入CLOSED状态
- CLOSED:表示连接中断
3.三握四挥的过程:
三次握手(建立连接)
- 客户端发送SYN请求,进入SYN_SEND状态
- 服务端收到SYN请求,并返回一个ACK应答,并发送一个SYN其请求,服务器进入SYN_RECV状态
⚠️⚠️⚠️
第二个SYN的作用:服务端检查客户端是否有效。 - 客户端收到服务端的SYN请求和ACK应答,发送ACK应答,客户端进入ESTABLISH状态,服务端收到应答后进入ESTABLISH
- 如果没有收到应答,数据包都会根据TCP的重传机制进行重传
四次挥手:(断开连接)
- 客户端发送FIN包,请求断开连接,客户端进入FIN_WAIT1状态
- 服务端收到FIN包后返回应答,进入CLOSE_WAIT状态
- 客户端收到FIN的应答后进入FIN_WAIT2状态
- 服务端发送FIN请求包,进入LAST_ACK状态
- 客户端收到FIN请求包后,发送应答进入TIME_WAIT状态
- 服务器收到ACK应答后,进入close状态
⚠️⚠️⚠️
中断连接可以是客户端也可以是服务端
4.为什么需要三次握手?
防止失效的连接请求报文段
突然传送到服务端,第一次握手的时候发送的SYN报文因为某些原因在网络节点滞留了,这时候就成了一个早已失效的报文段,因为客户端如果没有收到应答,数据包根据TCP的重传机制进行重传,当服务端接收到这个失效的SYN报文段是以为要重新建立连接,于是就同意建立连接,新的连接就被建立了,但是这个连接是占着茅坑不拉屎,服务端一直在等客户端发送数据,客户端又没有数据传送,资源就白白浪费了。
5.为什么需要四次挥手
确保数据能够完成传输
TCP是全双工模式,当收到对方FIN报文后,只能说对方数据传输完了,这时候并不会关闭socket,“别急,你的请求我收到了,我先看看我的数据传输完了没”,等检查完发送完后,给对方一个FIN报文和ACK,等到对方的ACK应答后就可关闭连接了。