# TCP三次握手和四次挥手
建立TCP链接是为了保证稳定有序的收发数据,那么就要保证双方的发送能力和接收能力都是OK的。
- FIN = finish
- ACK = acknowledge

# 三次握手
三次握手之所以三次,是保证client和server都要让 "对方" 知道自己发送能力和接收能力都OK的最小次数。
client => serverserver判断出client具备发送能力
server => clientclient可以判断出server具备发送和接收能力
client => serverclient还需让server知道自己接收能力没问题
- 客户端:我准备好了,你准备好了么,收到请回答?
- 服务端:我收到了,我也准备好了,你收到了么?
- 客户端:我也收到了
双方均保证了自己的接收和发送能力没有问题
TCP连接建立,两次不安全,四次浪费资源,三次刚刚好。

从最开始双方都处于CLOSED状态。然后服务端开始监听某个端口,进入了LISTEN状态。
- 第一次握手
客户端主动发起连接,发送SYN, 发送完毕后,客户端进入SYN-SENT状态。
- 第二次握手
服务端接收到,返回SYN和ACK(对应客户端发来的SYN),发送完毕后,服务器端进入SYN_RCVD状态。
- 第三次握手
客户端再发送ACK给服务端,发送完毕后,客户端进入ESTABLISHED状态;服务端收到ACK之后,也进入ESTABLISHED状态,TCP 握手结束。
# 四次挥手
client => serverclient请求关闭连接,发送FIN到server
server => clientserver接收关闭连接请求,发送ACK进行最后数据传输
server => clientserver向client发送可以进行关闭连接的请求FIN
client => serverclient接收请求,发送确认关闭ACK,等待2msl后关闭
- 学生:老师,下课了
- 老师:好了,我知道,还有一部分没讲完
- 老师:讲完了,下课
- 学生:好的
四次挥手后,client和server成功地断开了连接~

刚开始双方处于ESTABLISHED状态。
- 第一次挥手
客户端想要关闭连接,向服务器发送FIN报文,发送完毕后,客户端进入FIN_WAIT_1状态。
- 第二次挥手
服务端收到该FIN报文后,就向客户端发送ACK应答报文,接着服务端进入CLOSED_WAIT状态。
客户端接收到服务端的ACK应答报文后,进入FIN_WAIT_2状态。
- 第三次挥手
服务端处理完数据后,向客户端发送FIN报文,发送完毕后,服务器端进入LAST_ACK状态。
- 第四次挥手
客户端接收到来自服务端的FIN报文后,回一个ACK应答报文,并进入TIME_WAIT状态。
服务端接收到这个确认包之后,关闭连接,进入CLOSED状态,至此服务端已经完成连接的关闭。
客户端等待了2MSL之后,自动进入CLOSED状态,至此客户端也完成连接的关闭。