文章目录
- 一、KCP传输协议
- 二、Telepathy 传输协议
- 三、WebSockets传输协议
- 四、多路复用传输:
- 五、延迟模拟传输:
- 六、Ignorance协议
- 七、LiteNetLib协议
- 八、FizzSteamworks协议
- 九、FizzyFacepunch协议
- 十、加密协议
- 十一、Edgegap协议
一、KCP传输协议
KCP是Mirror是默认的传输协议
协议优势:
1.100%兼容C#
2.适用于除了WebGL外的所有平台
3.重测覆盖率83.5%
4.速度极快
5.非常简单
6.几乎免费分享
KCP是一种可靠协议,可达到平均延迟降低30~40%,最大延迟减少3倍的传输效率。
代价是比TCP多消耗10~20%的带宽。采用纯算法实现,不负责底层收发,要求用户为低层数据自定义传输方式,并以回调的方式提供给CKP.
使用方式:
将CKP传输组件添加到NetworkManager中。
取消组织UDP(不是TCP),默认端口7777
二、Telepathy 传输协议
Telepathy设计参考了Kiss原则
Telepathy快速且可靠,专为MMO规模的网络而设计
Telepathy发送任何形式的内容都将以相同的方式接收
Telepathy使用原生C#编写,可直接应用于Unity
Telepathy可在GitHub上找到
Telepathy最初是在UDP中度过了地狱的三年后,为UMMORPG而设计的。
Telepathy在以下优势:
稳定无错:仅使用400行代码
高性能:可以处理数以千计的连接和包
并发:每一个连接都使用一个线程,它可以大量使用多梳处理器
很简单:Telepathy处理好一切,你只需要调用connect/GetNextMessage/Disconnect.
基于池:如发送10个字节后再发2个,那么另一端将收到10个再收到2个字节,而不会一次收到12个
MMORPG的制作非常困难,创建了Telepathy这样我们就不用再担心网络底层了
三、WebSockets传输协议
使用WebSocket协议的镜像传输,从Unity WebGl中构建,然后从浏览器中启用多人游戏。
SSL设置已过时,可能会在将来的版本中删除。
服务器设置:
指定基于websocket的游戏监听端口
客户端设置:
设置允许用户自定义Web游戏客户端行为。
如可以引入代理服务器。
载入记录:
支持的日志级别:
None、Error、Warn(默认)、Info、Verbose、Flood
可以使用下拉列表或代码设置日志级别。Mirror.SimpleWeb.Log.level
建议将级别设置为Verbose Flood Info Warn
将日志使用为None时要特别小心 .
四、多路复用传输:
多路复用本身不是传输,但他允许您组合其他传输,以便客户端可以通过其中一个连接到您的服务器。
常用的方式是同时监听WebGL和移动端/桌面端服务器。
实现方法:
1.如果尚未将有NetworkManager的游戏添加 场景中则将其添加到场景中
2.默认情况下Mirror会将CKP传输添加到您的NetworkManager游戏对像中
3.将 Multiplex Transport组件添加到游戏对像中
4.在NetworkManager中分配Multiplex管理
5.将Websocket传输组件添加到到游戏对像
6.将KCP传输逐渐作为第一个通路添加到Multiplex Transport中
7.将Websocket传输作用第二个通路添加到Multiplex Transport中
配置如下图所示:
五、延迟模拟传输:
Mirror的Latency Simulation提供了在非理想状态下测试项目的条件。
将其添加到NetworkManager,将其拖至NetworkManager.transport中
他可以模拟延迟(毫秒)、数据丢包、数据包加扰、重新排序等问题
六、Ignorance协议
UPD被理解为一种“破碎”的数据传输协议,没有时序性,可靠性。
而Ignorance是一种可靠的UDP传输协议,并且它提供了可靠的和不可靠的UDP协议。
为什么Ignorance由于Unity LLAPI?
Unity旧的LLAPI效率底的可怕,大量测试更多项目中UnityLLAPI会降低性能。
而LLAPI是闭源的,这意味则Mirror无法对其进行修改,从而开发出了Ignorance协议。
谁在开发Ignorance?
Coburn是主要的开发商。
什么情况下使用可靠的UDP而不是TCP?
1.当你实时通讯更看重速度而不是可靠性时
2.当然需要频繁发送时
3.当你需要自定义消息时
4.如果您的游戏需要数据软管时
什么情况下使用TCP而不是用可靠的UDP ?
1.当你有关键任务时
2.如果你需要可行的网络协议
3.如果你是偏执逛
4.你需要让每个人都同步时
七、LiteNetLib协议
基于UDP拓展出的协议,略过…
八、FizzSteamworks协议
Mirror的FizzSteamworks传输协议,略过…
九、FizzyFacepunch协议
也是Mirror的FizzyFacepunch传输协议,略过…
十、加密协议
加密协议本身不是协议,但允许加密流进行传输。
传输协议通过ECDH和HKDF-SHA256进行非对称秘钥交换,以安全地派生一个通用的256位对称秘钥,然后将其用于具有96位随机数和128位mac.
不依赖于连接协议,加密与顺序/可靠性,因此适用于各种传输。握手完成后,连接完全安全的。为了校验安全性,至少有一方需要验证公钥(通常是客户端验证服务器密钥)
当使用传输协议,您需要将协议添加到Inner字段中,然后将Encryption Transport分配给Network Manager中的Transport.中间通过了Encryption进行加密。
验证服务器公钥,如果不验证公钥,初始握手容易收到MITM攻击。官方建议尽量在所有托管模式下验证服务器密钥。
非常方便使用Mirror为用户提供了3种验证模式:
关闭:默认关闭,开发时使用
列表:公钥是在构建中受信任密钥列表进行验证的。
回调:在些模式下当客户端连接到时,它将调用毁掉,该回调应返回有效密钥。
EncryptionTransport.onClientValidateServerPubKey true
这提供了最大的灵活性,并允许您通过在连接之前交换公钥来验证,例如从大厅服务器或登录API进行验证。
客户端或服务器后端可以从中检索指纹(以及序列化公钥本身):
EncryptionTransport.EncryptionPublicKeyFingerprint
EncryptionTransport.EncryptionPublicKey
十一、Edgegap协议
Edgegap的分布式断电服务在世界各地的许多地点提供中断续传服务,而不必担心NAT或延迟问题。
为了使用中继服务,您需要设置自己的以按需要启动中继会话,或者可以使用Edgegap的Lobby或Matchmaker服务为您执行此操作:
Mirror提供以下创术来与中继服务进行交互:
EdgegapRelay:
使用KCP的准系统继电器传输,它需要你自己设置好拉力会话并与所有玩家沟通详细信息。
完成此操作后,再决定是否持有设置。
Edgegap Lobby:
使用Edgegap Lobby 提供了简单易用的中继服务
如果你只需要没有匹配的点对点/玩家托管的大厅,基本上不需要设置。
使用方式:
部署大厅服务,通过Edgegap API手册执行操作,也可以传输上内置的UI.
点击后弹窗:
只需要输入你的EdgegapAPI密钥和你选择的唯一大厅名字(LobbyName),然后点击创建,就会部署完成,然后将为填写上大厅的URL.
然后就准备好了