TCP状态机

  • 待补充 双向管道的建立和断开细节
  • 异常三次握手
  • 异常四次挥手

资料参考TCP 协议状态机

TCP有限状态机分析

Tcp状态图, 虚线代表客户端 实线代表服务器

正常的连接建立还是比较容易理解的

说一下从CLOSE_WAITLAST_ACK
当被动关闭方B接收到FIN后知道对方A要关闭连接, B回复一个ACKA

  1. 如果此时B没有额外要发送的数据就给A, 就发送FIN告知A自己也要关闭了, 然后B进入LAST_ACK
  2. 如果此时B有额外信息要发送等发送完毕后. 这时B发送一个FIN告知A然后B进入LAST_ACK

再说一下从FIN_WAIT_1TIME_WAIT

  1. 直接从FIN_WAIT_1TIME_WAIT, 这个对应上面的第一种情况, 由于B没有额外信息发送直接发送了FIN和ACK, 这时A再发送一个ACK, 进入TIME_WAIT
  2. 经过中转状态FIN_WAIT2对应上面第二种情况, 由于B有额外信息发送, 只发送了ACK, 这时A还可以接受数据, 直到B发来FIN然后A发送ACK进入TIME_WAIT

再说一下TIME_WAIT状态
主动关闭方A最后发送了ACK确认被动关闭方BFIN.
但是如果这个ACK由于各种原因B没有收到, 所以B会再次发送FIN. 然后A会在2MSL时间内接受到这个FYN, 之后A再次回复一个ACk.计时器重置2MSL时间, 重复上面过程. 直到2MSL时间内A没有收到FIN,说明B已经收到了.则结束连接

2MSL指的是两个MSL时间 单个指的是一个片段在网络中的最大存活时间,
A发送的ACK可能消耗一个, B重新发送的FIN可能也要消耗一个.最大两个

复位报文段

  • 客户端访问不存在的端口, 服务器会发送带RST标志的复位报文段
  • 异常终止连接, 发送复位报文段
  • 客户端或服务端向半打开状态(对方异常终止连接, 但是本方没有收到结束报文)的连接写入数据, 对方回复会一个复位报文段