# TCP三次握手和四次挥手

建立TCP链接是为了保证稳定有序的收发数据,那么就要保证双方的发送能力接收能力都是OK的。

  • FIN = finish
  • ACK = acknowledge

# 三次握手

三次握手之所以三次,是保证clientserver都要让 "对方" 知道自己发送能力接收能力都OK的最小次数。

client => server server判断出client具备发送能力

server => client client可以判断出server具备发送和接收能力

client => server client还需让server知道自己接收能力没问题

  • 客户端:我准备好了,你准备好了么,收到请回答?
  • 服务端:我收到了,我也准备好了,你收到了么?
  • 客户端:我也收到了

双方均保证了自己的接收和发送能力没有问题

TCP连接建立,两次不安全,四次浪费资源,三次刚刚好。

从最开始双方都处于CLOSED状态。然后服务端开始监听某个端口,进入了LISTEN状态。

  • 第一次握手

客户端主动发起连接,发送SYN, 发送完毕后,客户端进入SYN-SENT状态。

  • 第二次握手

服务端接收到,返回SYN和ACK(对应客户端发来的SYN),发送完毕后,服务器端进入SYN_RCVD状态。

  • 第三次握手

客户端再发送ACK给服务端,发送完毕后,客户端进入ESTABLISHED状态;服务端收到ACK之后,也进入ESTABLISHED状态,TCP 握手结束。

# 四次挥手

client => server client请求关闭连接,发送FIN到server

server => client server接收关闭连接请求,发送ACK进行最后数据传输

server => client server向client发送可以进行关闭连接的请求FIN

client => server client接收请求,发送确认关闭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状态,至此客户端也完成连接的关闭

# 参考