- 待补充 双向管道的建立和断开细节
- 异常三次握手
- 异常四次挥手
Tcp状态图, 虚线代表客户端 实线代表服务器
正常的连接建立还是比较容易理解的
说一下从CLOSE_WAIT到LAST_ACK
当被动关闭方B接收到FIN后知道对方A要关闭连接, B回复一个ACK给A
- 如果此时
B没有额外要发送的数据就给A, 就发送FIN告知A自己也要关闭了, 然后B进入LAST_ACK - 如果此时
B有额外信息要发送等发送完毕后. 这时B发送一个FIN告知A然后B进入LAST_ACK
再说一下从FIN_WAIT_1到TIME_WAIT
- 直接从
FIN_WAIT_1到TIME_WAIT, 这个对应上面的第一种情况, 由于B没有额外信息发送直接发送了FIN和ACK, 这时A再发送一个ACK, 进入TIME_WAIT - 经过中转状态
FIN_WAIT2对应上面第二种情况, 由于B有额外信息发送, 只发送了ACK, 这时A还可以接受数据, 直到B发来FIN然后A发送ACK进入TIME_WAIT
再说一下TIME_WAIT状态
主动关闭方A最后发送了ACK确认被动关闭方B的FIN.
但是如果这个ACK由于各种原因B没有收到, 所以B会再次发送FIN. 然后A会在2MSL时间内接受到这个FYN, 之后A再次回复一个ACk.计时器重置2MSL时间, 重复上面过程. 直到2MSL时间内A没有收到FIN,说明B已经收到了.则结束连接
2MSL指的是两个MSL时间 单个指的是一个片段在网络中的最大存活时间,
A发送的ACK可能消耗一个, B重新发送的FIN可能也要消耗一个.最大两个
复位报文段
- 客户端访问不存在的端口, 服务器会发送带RST标志的复位报文段
- 异常终止连接, 发送复位报文段
- 客户端或服务端向半打开状态(对方异常终止连接, 但是本方没有收到结束报文)的连接写入数据, 对方回复会一个复位报文段