- 待补充 双向管道的建立和断开细节
- 异常三次握手
- 异常四次挥手
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标志的复位报文段
- 异常终止连接, 发送复位报文段
- 客户端或服务端向半打开状态(对方异常终止连接, 但是本方没有收到结束报文)的连接写入数据, 对方回复会一个复位报文段