TCP面向连接,数据通讯时进行三次握手、断开链接时进行四次挥手,位于传输层,起到承上启下的作用

名词

  • seq(sequence number):序列号,通过某种算法生成的,可以标识报文的顺序
  • ack(acknowledgement number):确认号,ack = seq + 1
  • SYN(synchronous):发起新连接
  • ACK(acknowledgement):已确定序列号有效
  • FIN(finish):完成

三次握手

  1. 首先,客户端会发送SYN报文,请求与服务端连接,还会携带一个序列号,下次发送数据时,客户端seq会+1
  2. 然后,服务端收到了SYN + seq字段后,也会生成一个自己的seq序列号,并会携带ACK确认号,表示已收到之前的SYN报文,还会携带一个ack,它等于客户端seq + 1
  3. 最后,客户端收到服务端的响应,客户端seq会通过算法,判断是否与服务端的ack值相等,如果相等,发送ACK确认号和客户端seq;还会发送一个新的ack,这个ack是服务端的seq值+1,确保一切正常

四次挥手

服务端和客户端都可以主动断开连接,此处以客户端断开连接为例

  1. 首先,客户端发送FIN包、生成客户端的seq序列号,随后进入wait1状态,这是第一次挥手。
  2. 然后,服务端收到FIN包,进入了关闭等待状态;随之向客户端使用ack验证,若验证成功,打上ACK标记;这是第二次挥手,服务端此时仍可以发送未完成的数据
  3. 接着,等到服务端所有任务操作完成,服务端就开始进入最后确认状态:向客户端发送FIN包并使用客户端seq验证ack;验证成功则打上ACK标记,并生成一个新的服务端序列号seq发给客户端;这是第三次挥手
  4. 最后,客户端进入超时等待状态2MSL(通常是1~4分钟),发送+1后的客户端seq和服务端seq验证的ack,等到后将关闭连接;服务端收到信息,验证ack成功之后打上ACK标记,随后将要关闭连接;这是第四次挥手

超时等待时间是为了保证服务端收到ACK包:假设如果没有2MSL的等待时间,ACK包丢失了,那服务端将永远不会断开连接;有了2MSL,一旦发生丢包将会进行超时重传,实现可靠连接