# TCP 三次握手和四次挥手的理解

非常形象的比喻图解:

TCP连接

四次挥手一定是存在的——由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,所以即使没有最后一个包,也需要先回复断开连接的请求,然后再发送关闭请求。

  • 第一次client => server 只能server判断出【client具备发送能力】
  • 第二次 server => client client就可以判断出【server具备发送和接受能力】,此时client还需让server知道自己接收能力没问题于是就有了第三次
  • 第三次 client => server 【双方均保证了自己的接收和发送能力没有问题】

这里有几个参数需要了解一下:SYN、seq、ACK、FIN:

TCP参数

TCP 有6中标志位:

  • SYN(synchronous 建立连接)
  • ACK(acknowledgement 确认)
  • PSH(push 传送)
  • FIN(finish 结束)
  • RST(reset 重置)
  • URG(urgent 紧急)

另外数据包:

  • Sequence number(顺序号码)
  • Acknowledge number(确认号码)

非常通俗的解释:

  1. 第一次握手中 SYN = 1,代表客户端 Client 要建立连接,同时随机产生 seq(Sequence number)= x 的数据包,然后传输到 Server;
  2. Server 收到 Client 的信息,通过 SYN = 1 知道是要建立连接,然后向 Client 发送信息,ACK = 1 代表确认,ack(Acknowledge number)= x + 1,SYN = 1 代表建立连接,随机产生 seq = y 的数据包;
  3. Clien 收到 Server 的信息,通过 SYN = 1 知道是要建立连接,然后检查 ack 是否正确,即第一次发送的 seq + 1,同时检查 ACK 是否为 1,若正确,Client 再发送 ack = y + 1,ACK = 1 到 Server,Server 收到确认 seq 值和 ACK = 1 后则连接建立成功。