tcp保证收发有序的方式
- 终结标志
- 头部记录长度信息
长连接的方式:
网络会在没有数据传输的时候断开链接:默认2个小时
keep-alive:设置时间
能否维持长连接?没法知道应用层是否在线?没有交互式的心跳检测
答:有些代理平台,nginx-->逻辑服务器,没法维护最终需要获取的用户信息;运营商网络会检测连接,在一定时间内如果没有数据就会断开连接;此时光靠定时是维持不住的;
解决方案:心跳检测,ping->pong,定时器(每隔一段时间就发送心跳包)
存在问题:不管有没有数据都发送心跳包,高并发的情况下,带宽浪费会造成严重的问题
具体方案:
- 每一个IO都应该维护一个定时器(时间戳)
- 如果在等待的过程中有任何数据交互就重置定时器
- 如果没有收到任何业务数据并且定时器超时,就发送心跳包
- 重复发送心跳包,然后断开连接
更精细的控制
- 重复发送心跳包,然后断开连接
- libevent里面维护定时器最小堆:性能较差,是因为最小堆?数组的内存瓶颈?
- nginx里面使用红黑树来存储定时器:libev采用红黑树
使用事件驱动开发模型实现心跳检测:
epoll_wait里面查看有没有相关定时事件发生,timeout设置成最小定时时间