qmessagebox关闭触发事件_通信的触发方式在TCP中的体现

本文探讨TCP通信中事件触发和定时器触发两种方式,以TCP连接的三次握手和四次挥手为例,详细解释了如何在TCP协议栈中实现这两种触发机制。在连接建立和数据传输过程中,事件触发和定时器触发如何确保通信的可靠性,并避免潜在的死锁问题。

通信过程,本质上只有两类:事件触发(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后要不要启动重传定时器?

不需要

你想,如果启动了重传定时器,而B并不会对单独的ACK作为ACK响应,除非此时B有数据发送Data+ACK,如果B只接收数据而不发送数据,那么这个ACK不会有对应的确认ACK发送给A,那么这个重传定时器超时后又会发ACK给B,无限循环下去

为什么A发送ACK不需要关心是否到达B呢?因为A发送ACK就已经进入Established,只要A发数据,就是ACK+Data,这个ACK+Data才会启动重传定时器

对于应用层提交给tcp的数据,这是事件触发,触发的动作是:
  • 发送数据,并缓冲数据
  • 为数据启动重传定时器

如果接收到对方ACK,事件触发的动作是:

  • 关闭定时器
  • 释放缓存

如果定时器超时也没有接收到ACK,则定时器触发,动作是:

  • 重传数据
  • 记录重传次数

如果重传次数满,比如重传8次,则是事件触发,动作是:

  • reset或关闭tcp连接
  • 通知应用层出错
总结

整个通信过程只需要一次用户输入(用户事件),接下来的通信过程全部依赖事件触发,定时器触发而产生的动作自动完成,不管顺利与否,无需用户干预

如果觉得文章不错,记得在下方 分享 收藏 点赞 在看 四连击a0a14c19fd620dc97532c8933c045677.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值