游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11173|回复: 13

关于UDP网络游戏服务器的一些探讨

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-10-25 15:11:00 | 显示全部楼层 |阅读模式
近来跟人讨论一些关于实时性要求比较高的服务器设计的问题,这个问题纯粹是理论的,概念的,架构的,整理一下以供参考。

众所周知,UDP是无连接的,面向消息的数据传输协议,对于传统的TCP服务器来讲,有2个致命的缺点,一是数据包容易丢失,二是数据包无序。很多人对于这2个弱点做了很多工作,大致的方法就是模拟TCP,其实这是无意义的,与其说模拟TCP还不如直接使用TCP。但是UDP的这2个缺点正好是可以利用的,实际上在某些状况下,正是UDP在网络游戏通信上的最大优势。

我先说简单的容易理解的,关于UDP的数据包的无序。其实自从多用户多任务的操作系统流行以来,消息便成了程序与程序之间,程序与人之间联系的一个纽带,实际上这本身就是无序的,服务器根本不知道玩家操纵的角色什么时候向左什么时候向右什么时候打怪什么时候喝药,这些都是以消息的形式触发的,只有当这些消息触发的时候,服务器才去处理,即使是TCP连续流,我们必须根据自己定义的格式将流截断解开成一个一个的消息包,然后再去处理这些消息。比如说,玩家去攻击一个怪物,我们把它放大为2个消息,[走到怪物跟前]  [攻击怪物]。如果采用TCP协议,那么消息是连续的,先做第一个动作[走到怪物跟前],再做第二个动作[攻击怪物]。如果是UDP协议,那么这个消息可能发生倒序,可能变成了先[攻击怪物],然后[走到怪物跟前],这样看来就有点怪怪的。这个问题如何解决呢,其实在处理包的时候有一个逻辑层,这个问题本来是一个网络传输层的错误,但是我们可以将它转化为一个逻辑层的错误,我们可以认为凡是在怪物一定范围之外的近身攻击都是无效的(我想大多数网游服务器段都是这样处理的,没有哪个网游的战士能拿武器老远打怪的),无效的消息如何处理?很简单,丢掉,呵呵。

可能很多人不同意我最后的处理办法,没有关系,我说过了,这只是一部分特定的网游可以这么做,另外一方面,大部分网游服务器都会丢掉一些逻辑错误的包,除非服务器自己想挂掉,明知数据有错还去处理,这样的服务器程序我是不会要的。

另外一个,很多人都会想,玩家可能不干了,我明明打怪了,为什么打怪的动作没有?我想当一个网络状况不好的情况下,即使是TCP也会出现延迟的情况,玩家不会在意你这一下两下打了没反应,我不知道大家玩过网上的CS什么感觉,你确信你的每一次没打中对方的子弹都是因为你不准吗?我看未必,很多包都被同步掉了,你射出去的子弹只有在满足一定同步条件下才会被处理的。当然我刚才举的例子也很特殊,无序不会夸张到那种程度,另外一个就是我下面要讲的应用。

关于UDP的丢包处理。UDP丢包很多人的想法就是设置标签然后重发,那么这个是没有必要的,这种没有必要是在一定的特殊条件下:运动同步。如果你想要做运动同步,那么TCP将是非常臃肿的,因为每隔一段时间(一半都在半秒之内),玩家和服务器之间就需要交换一次空间参数(什么位置坐标,速度,方向,时间等等),大量的频繁的小数据包交换使用TCP将是可怕的(如果你不关掉延迟发送算法,那么很多数据都失去了意义)。这个时候UDP的特点就体现出来了,速度快,封包体积小,基于消息的。那么丢掉的包怎么办?很简单,丢就丢了呗,反正每隔半秒就会有新的修正数据发过来,你怕什么,如果你重发,发而不合时宜了,因为同步数据都是有时效性的,你重发的包往往失去了时效,没有意义了,所以不用重发,直接等待下一个新包吧

好了,就这么多了,欢迎大家指点

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-10-25 23:16:00 | 显示全部楼层

Re:关于UDP网络游戏服务器的一些探讨

“很多人对于这2个弱点做了很多工作,大致的方法就是模拟TCP,其实这是无意义的,与其说模拟TCP还不如直接使用TCP。”

UDP简单的模拟TCP的有顺序和可靠传输要比TCP本来的效率要高。
TCP内部的协议很复杂,UDP简单模拟的效果要比TCP本身的效果要好,传统情况下,UDP
的速度是TCP的1.5倍。

之所以选择用TCP的另一个理由,就正是因为TCP的流模式,在某种程度上能节省一些
传输上的开支。比如说在一个游戏循环之内,用户A收到来自各个用户的聊天消息,多达
100条,那么这个时候是执行100次udp的sendto,还只选择只执行一次tcp的send呢?

网络游戏的C/S模型本身就是建立在流的基础上的,需要做到保持连接,而基于包的发送
理论实质上是对流结构的一种扩展。用TCP也可以实现分包发的结构,UDP也可以实现流
的结构。实质上真正重要的并不是用TCP或者UDP,而是根据具体的网络传输性能瓶颈进
行分析,从而再决定是否用TCP或者UDP,而对应的上层应用,则是一开始就设计好的,
之后不需要大幅度的改动。

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-10-26 09:58:00 | 显示全部楼层

Re:关于UDP网络游戏服务器的一些探讨

UDP在安全方面是不是没有TCP优越啊。在有些网络中UDP数据包已被完全过滤!

96

主题

146

帖子

146

积分

注册会员

Rank: 2

积分
146
发表于 2004-10-26 10:44:00 | 显示全部楼层

Re:关于UDP网络游戏服务器的一些探讨

UDP的掉包和无序是特点而不是缺陷

至于模拟TCP效率更高,这个恐怕就不一定了吧,如果真的要实现TCP的全部功能,你能保证比系统实现得更好吗?我觉得不一定,但在一定程度上,保证某些包是有序,保证某些包不掉,这个我觉得才是正确的思想

UDP和TCP是各有用途而已,单纯从效率上来探讨,没什么意义

3

主题

186

帖子

190

积分

注册会员

Rank: 2

积分
190
发表于 2004-10-26 11:52:00 | 显示全部楼层

Re:关于UDP网络游戏服务器的一些探讨

TCP内部的协议很复杂,UDP简单模拟的效果要比TCP本身的效果要好

别个说的简单模拟,呵呵

248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2004-10-26 12:07:00 | 显示全部楼层

Re:关于UDP网络游戏服务器的一些探讨


如何在程序中设计,在防火墙开特定的端口?

21

主题

86

帖子

86

积分

注册会员

Rank: 2

积分
86
QQ
发表于 2004-10-27 15:01:00 | 显示全部楼层

Re:关于UDP网络游戏服务器的一些探讨

去找找 Q3A 网络协议规范.pdf 看看

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-10-28 09:08:00 | 显示全部楼层

如何在程序中设计,在防火墙开特定的端口?

跟网管讲一下。做个dnat吧。

2

主题

58

帖子

58

积分

注册会员

Rank: 2

积分
58
QQ
发表于 2004-10-31 10:40:00 | 显示全部楼层

Re:关于UDP网络游戏服务器的一些探讨

呵呵  有长了好多知识

0

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2004-11-12 18:10:00 | 显示全部楼层

Re: 关于UDP网络游戏服务器的一些探讨

那到底是UDP好还是TCP好,现在的网游是用什么模式的 [em8] [em11]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 21:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表