type P2pListener interface {
    OnP2pConn(p2p *P2pNet, endType uint8, endNo uint16)
    OnP2pCall(p2p *P2pNet, pack *P2pPack)
    OnP2pClose(p2p *P2pNet, endType uint8, endNo uint16)
    OnP2pError(p2p *P2pNet, err error)
}

三、关于防御

连接层的防御一般就是检测异常连接,把异常连接踢掉,避免占用socket资源。
1、最简单的,通过心跳来判断连接是否活跃,清除非活跃连接复用这部分socket。连接可以分为主动活跃和被动活跃两种模式。主动活跃的连接,会主动发心跳包过来,通过频率去检测心跳包,如果超时都没收到心跳包,可以踢掉。被动活跃连接,需要定时给它发心跳报活,避免被对方踢掉。
2、没有业务包的连接。如果一个连接从连接开始,只发心跳包,限定时间内从来不发业务包,这个连接要踢掉。
基于1、2点,连接从连接开始必须在限定时间内发业务包,后续必须通过发业务包或者心跳包来维护连接。
3、限制 IP 关联的连接数,超过上限则踢掉连接。一般同个局域网的玩家 IP 会一样,但是也可能是服务器在被攻击。现在有些游戏上线,会被模拟玩家连接撑满服务,导致真实玩家无法进入游戏。通过加 IP 关联的连接数限制来增加攻击成本。
4、发包频率检测,例如我们设定最大15帧/s,每隔2分钟检测一次,如果请求包间隔平均时间小于66ms,可以踢掉。
5、限制最大的包大小,收到超过最大限制的包,则踢掉连接。
6、设置写超时(例如5秒),超时则踢掉连接,避免客户端一直阻塞不接收导致缓存的包越来越多
 
业务层可以做这些限制:
1、连接验证,没做登录或者重连,直接发其他业务请求包,踢掉连接
2、登录失败,踢掉连接
 
网络通信介绍到这里,接下来聊聊业务的服务机制和rpc机制。