总结一下TCP三次握手和四次挥手以及中间的11种状态的转换

11种状态

客户端:SYN_SEND、FIN_WAIT1、FIN_WAIT2、CLOSING、TIME_WAIT。 服务端:LISTEN、SYN_RCVD、CLOSE_WAIT、LAST_ACK。 CLOSED、ESTABLISHED

TCP报文结构

Sequence Number(序号)
在传输的过程中对数据进行切分,再接收端,依靠sequence Number进行分段重组。 Acknowledgement Number(确认号)

控制字段

  • ack:表示确认控制字段,TCP通过确认应答(ACK)实现数据可靠连接。 主机A发送数据给主机B的时候,假设发送了1G的数据过去,作为主机B可以接收到这个数据,主机A如何确认主机B接收到这个数据了,可以让主机B给主机A回复一个确认信息,在确认信息里他的数据报文的控制字段ack就会起作用,就表示上一个信息已经接收了,回复确认,实现了可靠连接建立
  • syn:表示请求建立连接字段
  • fin:表示请求断开连接字段。

说明:控制字段信息默认为0,控制字段功能不起作用。控制字段置为1,表示相应控制字段开启

三次握手

tcp三次握手

整个三次握手的过程中涉及到了控制字段的SYN,ACK以及Seq(序列号)的设置,还有确认号Ack。
1、首先是Closed状态,最开始服务端和客户端都处于关闭状态,在关闭状态时作为主动建立连接方的客户端开始第一次握手①(对应上图序号)发出SYN控制字段,和序列号seq然后从Closed状态变为SYN_SEND
2、服务端会从Closed变为Listen状态(这个时候会创建一个Socket),开始进行第二次握手②,服务端在Listen状态接收到了客户端的SYN字段,服务端会返回一个ACK确认字段和跟客户端请求建立连接的字段SYN,同时也会发送Seq和确认号Ack,这个时候服务端状态变为SYN_RCVD
3、客户端在SYN_SEND状态接收到了服务端发送的SYN,ACK,就会进入到ESTABLISHED状态,并且在进入连接状态之前会再次给服务端回复ACK,也就是三次握手③的第三次过程。
4、服务端在SYN_RCVD的状态接收到了客户端发送的ACK之后也会变成ESTABLISHED

四次挥手过程

tcp四次挥手

  1. 客户端先发送FIN 断开请求也就是第一次挥手①,此时客户端进入到FIN_WAIT_1状态。
  2. 服务端接收到客户端请求后会回复一个带有ACK确认字段的请求第二次挥手②,此时服务端进入CLOSE_WAIT状态。
  3. 客户端接收到服务端回复的请求后会从FIN_WAIT_1进入到FIN_WAIT_2
  4. 服务端所处的的CLOSE_WAIT状态会再次发送请求,此时是第三次挥手③,此时请求是一个带有FIN的断开连接的请求,然后进入到LAST_ACK也就是最后确认的状态。
  5. 客户端在FIN_WAIT_2的状态接收到服务端的断开请求后会回复ACK的请求此时是第四次挥手④,随后进入TIME_WAIT。服务端在LAST_ACK状态接收到收到客户端发来的ACK后进入CLOSED状态。
  6. 服务端已经断开连接,客户端还在处于一个特殊的状态TIME_WAIT,在这个状态会等待2MSL的时间,这个时间一般是15-30秒,最后会自动变为CLOSED状态。

有一种特殊的状态,CLOSING状态。在四次挥手中有可能发生异常。也就是在第二次挥手中②,如果ACK确认信息没有正常发送到客户端,客户端没有收到ACK确认信息,收到了第三次挥手的信息③,FIN ACK断开连接的信息,此时客户端会由FIN_WAIT_1进入到CLOSING,然后把ACK的信息发出。

为什么握手是三次,挥手是四次呢,唯一的区别就是在第二次传输的过程中有所不同,在三次握手中,传输的是SYN 和ACK是同时发生的,四次挥手是先进行ACK确认,然后在发送FIN和ACK。

TCP三次握手和四次挥手过程中是在OSI七层模型中的传输层完成的,这个传输层并不是控制层,真正的控制层是在上三层应用层,也就是在这个层次上,相应的连接或者断开的信息并不是由传输层完成的,而是由应用层,接收到应用层指令后才会发送断开连接的信息。