首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

1.4.1  UDP

前面已经讲过,UDP就是用户数据报协议。数据报本质上就是一个单一的数据包。UDP协议比较简单,它也不像更复杂的协议(例如TCP协议)那样提供可靠传输。本质上,只是将包发送出去并希望它到达目的地。这是一种“发送后不理它(fire and forget)”的协议。图1.11展示了UDP首部格式。

图1.11 UDP包的首部格式

注意:UDP的端口(port)域长度是16比特(很快就会看到,TCP的也是这么长)。这就意味着总共可以使用65 536个端口。1024以下的端口留给专门的应用层协议使用,这是由因特网地址分配机构(Internet Assigned Numbers Authority,IANA)来指定的。若想查看这些端口列表,可以访问网站http://www.iana.org。IANA所分配的端口号比如有HTTP(80)、FTP(21)、Telnet(23)、SMTP(25)以及数百个无人听说过的其他协议。一般来说,应该在程序中尽量使用1024以上的端口号。如果登录账户不是root账户,则在基于UNIX的系统中运行程序时,甚至不允许打开1024以下的端口(对服务器来说)。表1.2列出了常用的端口号。

表1.2  常用端口号

端  口  号

服    务

用    途

17

QOTD

引用日期;以文本格式发送一个引用

20

FTP数据

FTP数据端口

21

FTP控制

FTP控制端口

22

SSH

安全Shell终端(Telnet的安全版本)

23

Telnet

允许终端控制

25

SMTP

简单邮件传输协议

37

Time

发送服务器时间

53

DNS

DNS查找

80

HTTP

万维网网页

110

POP3

邮局协议,更多的邮件资料

113

Ident

识别计算机名

119

NNTP

新闻组

143

IMAP

另一个昔日的邮件协议

6666

IRC

因特网接力聊天

31415

PIE

Pieserver,提供pi数字服务[*]

[*]有关Pieserver的更多信息请参见http://ronpenton.net/projects。

在图1.11中首先应该注意首部长度只有64比特,或者说8个字节。这一包首部相当短,至少与其他协议相比算是很短的。

接下来注意两个端口域。我们知道,包到达目的地后,接收机实际上根本无法断定包要到达哪个程序。因此,就提出了端口这一思想。当端口接收到一个包时,操作系统应该从包中将端口号读出来,并将此包发送给合适的程序。这样,同一台机器上就可以有许多不同的程序,所有这些程序都同时使用网络连接。

在图1.11中,还应该注意长度和校验和域。长度表示包括首部在内的包数据的长度。校验和域包含包中数据的校验和,以便于接收机能够断定数据是否完整无损。如果数据并不是完整无损的,则接收方干脆就丢弃此包,当作此包根本就没到达一样。

UDP是一种无连接的协议。这就意味着UDP程序彼此并不相互连接,它们只是发送包,期望服务器接收包。而其他一些协议,尤其是TCP,则不会接收即将到达的包,除非是先明确地连接到另一端。

UDP并不能保证发送的包成功交付给接收方,这一事实产生了一些问题。在节奏快的游戏中,服务器不断地向客户端发送有关其他玩家位置的更新信息,保证成功交付不会有太大的问题。例如,如果发送一个位置更新包,但接收方根本就没有收到,则可靠的协议(例如TCP)将一直试着发送包。但是,等到协议最终将原始的包发送出去时,玩家的位置可能已经变了。因此,在这种情况下,UDP就是一种很有用的协议。

但对于重要的数据会有什么后果呢?如果游戏中发生了某种情况,而游戏已经开始,这样以后将不会重新发送数据,结果会怎么样呢?最终,玩家可能会完全丢失一个重要的游戏事件(例如,射击),然后就不再同步。在这种情况下,UDP就不是一个明智的选择。

对于MUD和MMOG,一般来说,使用UDP并不理想,因为在这些游戏类型中所发生的大多数事情都是基本事件,也就是说,事件一旦发生,玩家就绝对需要知道到底发生了什么事。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论