通信过程,本质上只有两类:事件触发(Event trigger)和定时器触发(Timer trigger)
以TCP连接为例:TCP协议的三次握手和四次挥手
事件触发
A主动发起对B的tcp连接(SYN),这是事件触发,是A创建socket调用connect()函数触发tcp连接 定时器触发如果SYN在发给B的过程中丢失,还需要A后面的用户重新发吗?这样的话tcp协议栈也太不友好了。事实上tcp会缓存用户的连接指令,同时开启一个重传定时器,定时器超时,没有收到ACK+SYN,tcp会自动重传连接指令,这就是定时器触发
事件触发
B收到A的SYN请求,就会发ACK+SYN,这是事件触发
定时器触发
B发送ACK+SYN时同样担心丢失,所以B也会启动一个重传定时器,如果在超时时间内没有接收到A的ACK,说明B的ACK+SYN丢失,触发重传动作。如果收到ACK,则关闭定时器 事件触发A接收到B的ACK+SYN,这是一个外部事件触发的动作,触发了:
- 关闭重传定时器
- 发送ACK
- 将TCP状态更新为Established
这里A在发送ACK后要不要启动重传定时器?