首先呢!TCP是一种传输层协议,,就不用过多介绍。
整个通讯流程:
其中涉及到的标示:
- SYN(synchronous建立联机)
- ACK(acknowledgement 确认)
- PSH(push传送)
- FIN(finish结束)
- RST(reset重置)
- URG(urgent紧急)
- Sequence number(seq 顺序号码)
- Acknowledge number(ack 确认号码)
server端发送了SYN+ACK(第二次握手)报文后就会启动一个定时器,等待client返回的ACK报文。如果第三次握手失败的话(也就是说client给server返回了ACK报文,server并不能收到这个ACK报文)。那么server端就会启动超时重传机制;
TCP超时与重传机制
TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制。其基本原理:在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号(RST)。
TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制。其基本原理:在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送数据的ACK确认报文,则对该报文进行重传,在达到一定次数还没有成功时放弃并发送一个复位信号(RST)。
至于第四次挥手失败,则有以下考虑:
根据server端是否收到最后的ACK包分为两种情况:
- server端发送FIN,进入LAST_ACK状态,client收到这个FIN包后发送ACK包,server端收到这个ACK包,然后进入CLOSED状态
- server端发送FIN,进入LAST_ACK状态,client收到这个FIN包后发送ACK包,由于某种原因,这个ACK包丢失了,server端没有收到ACK包,然后server端等待ACK包超时,又向server端发送了一个FIN包
a) 假如这个时候,client还是处于TIME_WAIT状态(也就是TIME_WAIT持续的时间在2MSL内)
client收到这个FIN包后向server端发送了一个ACK包,server端收到这个ACK包进入CLOSED状态
b) 假如这个时候,client已经从TIME_WAIT状态变成了CLOSED状态
client收到这个FIN包后,认为这是一个错误的连接,向server端发送一个RST包,当server端收到这个RST包,进入CLOSED状态
c) 假如这个时候,client挂了(假如这台机器炸掉了)【第四种情况,不在参考链接里】
server端没有收到client的回应,那么会继续发送FIN包,也就是触发了TCP的重传机制,如果client还是没有回应,server端还会继续发送FIN包,直到重传超时(至于这个时间是多长需要仔细研究),server端重置这个连接,进入CLOSED状态,参考链接看这里
参考文档:
https://www.jianshu.com/p/29868fb82890
https://www.cnblogs.com/taoshihan/p/11215289.html
https://www.zhihu.com/question/27564314/answer/162476313
扫描二维码关注公众号,回复:
10486314 查看本文章