2023年7月31日发(作者:)
杂记:⽹络游戏中⽤到的⼀些⽹络协议【协议】 数据包可以想象成是在⽹络上传输的电⼦信封。在它的数据头中有地址和其他相关信息,然后才发出真正的数据帧。 ⽹络数据传输,有着很多不同的协议或规则来定义数据包以什么格式以及为了发送必须 做些什么。 ⽹络游戏现在通常会让游戏逻辑使⽤两种协议之⼀:TCP、UDP。有的游戏会使⽤第三种协议,ICMP,常⽤于⼀些⾮游戏逻辑的功能。【IP】 全称是Internet Protocol(⽹际⽹络协议),要通过⽹络发送数据,这是需要遵守的最基本的协议。不管是ICMP、TCP还是UDP,都必须附加IP协议才能够传输数据。所有在本地⽹络上的机器都需要有⼀个特定的本地地址,只有这样才能通过IP标识某个特定的本地机器。 IP的数据头有着⼤量的字段,有两个⼴泛使⽤的IP协议版本:IPV4和IPV6。IPV4地址有4个⽤点号分隔的8位数字(也叫⼋进制数)。如:192.168.1.1。IPV6使⽤128位地址,由于地址字节数提升了4倍,IPv6数据头肯定是不同的。它的⼀个缺点就是很难记忆,因为它们的完整形式是⽤冒号隔开的⼗六进制数,如:2001:0db8:85a3:0042:1000:8a2e:0370:7334。【ICMP】 ICMP全称是Internet Control Messaging Protocol(⽹际⽹络控制消息协议),并不⽤于⽹络上传输⼤量的数据。因此,它不能⽤于发送游戏数据。 在编写多⼈游戏时ICMP有⼀个⽅⾯是相关的:发送回声包的能⼒。通过ICMP,可以发送数据包给特定地址,然后直接让数据包返回到发送者,这是通过ICMP的回声请求和回声响应机制完成的。这个回声功能可以⽤于测量两台计算机之间发包所需要的时间。 ⾏程往返的时间,就是延迟。在游戏测量所有可以连接的服务器的延迟之后,就可以选择连接延迟最低的服务器。这个测量某个地址的延迟的过程称为ping。 当回声请求发送后,接收者收到数据包接着以正确的回声包回传回去。由于ICMP数据头没有任何的时间戳信息,在发出回声请求之前,发送者需要⾃⼰决定当前的时间戳,然后记录到数据帧⾥⾯。当回声应答的数据帧返回之后,发送和接收的时间戳的差别就可以计算出来,这样就得到往返时间。这个过程通常会重复很多次,这样就可以得到平均延迟。 ICMP数据包中的校验和被⽤来确保数据包在传输的过程中不会有数据出错,校验和的值是⽤ICMP数据头和数据帧计算出来的。如果接收者收到ICMP数据包,但是校验和不正确,这个包会被拒绝。标识符和顺序号由回声请求指定——通常每台机器的标识符都不⼀样,⽽顺序号应该随着每次发送新的回声请求的时候递增。【TCP】 传输控制协议(TCP)是游戏在⽹络上⽤来传输数据最常⽤的两个协议之⼀。TCP是⼀个基于连接的、可靠的、保证顺序的协议。TCP协议在游戏上的应⽤通常没有UDP流⾏。 TCP是基于连接的,就是说两台计算机在任何数据传输之前,必须先建⽴好彼此的连接。连接完成的⽅法是通过握⼿。请求连接的计算机发送⼀个连接请求到⽬标计算机,告诉它⾃⼰想要如何连接,然后接收者确认这个请求。这个确认在最初的请求者再次确认之后,三次握⼿的过程就完成了。 ⼀旦在TCP连接建⽴之后,就可以在两台计算机之间传输数据。之前提到,所有通过TCP发送的数据包都是可靠的。⼯作原理就是在每当数据包通过TCP发送以后,接收者都会告诉发送者我收到数据包。如果发送者在⼀定时间之内(超时)没有收到应答,就会将数据包再发送⼀次。发送者会不断地发送数据包,直到接收到应答为⽌。结果就是TCP不仅保证所有数据包的接收是可靠的,还会保证它们的顺序。如:假设现在有3个数据包A、B、C按顺序发送。如果A和C到达,⽽B没有到达,接收者不能处理C,除⾮B到达之后才能往下⾛。所以需要等等B重传,在收到之后,才可以继续。由于数据包丢失,或者数据包传不过去的百分⽐,会⼤⼤减慢数据的传输,对于游戏来说,保证顺序很容易成为不必要的瓶颈。如果之前的例⼦中的A、B、C包含了某个玩家的位置信息:就是最开始玩家在A位置,然后在B位置,最后在C位置。在位置C收到以后,游戏就不⽤关⼼位置B,因为玩家不在那个地⽅了。但是使⽤TCP,游戏在收到位置B以前是⽆法使⽤位置C的,这对于TCP显然不是理想的场景。 还有⼀个TCP需要考虑的有⽤的⽅⾯。所有⽹络都有MTC,或者maximum transmission unit(最⼤传输单元),它会决定数据包的⼤⼩限制。如果尝试发送⼤于MTU的数据包,它会没法通过。幸运的是,TCP在设计上会由操作系统⾃动将⼤的数据块分成合适⼤⼩的数据包。 在⼤多数场景中,通常不需要在游戏中传输那么⼤量的数据。但是还是会有⽤到的情况,⽐如,如果游戏⽀持⾃定义地图,就会有⼀个问题,那就是新玩家试图加⼊游戏会话的时候是没有这张⾃定义地图的。通过TCP,就可以轻松地将⾃定义地图发送给试图进⼊游戏的新玩家,⽽且不⽤管地图的⼤⼩。 也就是说,对于真正的游戏逻辑来说,只有⼩部分游戏类型需要⽤到TCP。对于回合制游戏,使⽤TCP是有意义的,因为通过⽹络发送的所有信息都是相关的,它定义了某个回合中玩家执⾏的动作。另⼀个常⽤TCP的游戏类型是MMO。但是对于那些有更加实时动作的游戏来说,⽐如FPS或者动作游戏,通常都不会使⽤TCP/IP。这是因为对所有数据的保证会影响游戏性能。 由于TCP是⼀个相当复杂的协议,TCP数据头和IP数据头⼀样⼤(20字节)。⼀个重要的概念必须要谈及——端⼝。 在数据包经过⽹络发送之后,相同的排序⽅式也被应⽤于端⼝。⽐如说,⼤多数Web服务器在80端⼝接收连接,这就是说通过其他端⼝发送的数据都会被Web服务器忽略。游戏应该选⽤⼀个没有被其他程序使⽤的端⼝。要注意的是,源端⼝和⽬标端⼝不⼀定是⼀致的,也就是说,虽然Web服务器连接建⽴在80端⼝,但是客户端连接服务器可以作⽤不同的端⼝。【UDP】 数据包协议(UDP)是⼀种⽆连接、不可靠的协议。就是说你可以直接发UDP数据包,⽽不需要与指定⽬标建⽴连接。由于它是⼀个不可靠协议,所以不会有保证数据包到达的⼿段,也不会保证数据包到达的顺序,也没有接收者应答的功能。由于UDP是⼀种更加简单的协议,数据头⽐TCP⼩得多。 像TCP⼀样,UDP也⽀持⼤约65000个端⼝。UDP端⼝和TCP端⼝是独⽴的,所以如果TCP和UDP使⽤同⼀个端⼝是不会冲突的。由于UDP是不可靠的,UDP的传输⽐TCP要⾼效的多。但是由于不知道数据包是否会到达,也会造成⼀些问题,虽然有些数据不太重要,但还是会有⼀些重要的保证游戏状态⼀致的数据。如果玩多⼈FPS游戏,你发射了⼦弹,这个信息就很重要,要保证它被服务器或其他玩家所接收。 ⼀个尝试的解决⽅案就是将TCP⽤于关键数据,使⽤UDP传输不太重要的数据。但在TCP保证系统运⾏的同时,使⽤UDP会导致UDP丢包增加。⼀个更严重的问题是:虽然移动数据不那么重要,⽤UDP传送很合理,但还是需要数据包的顺序。没有顺序的信息,如果位置B在位置C之后收到,玩家就会被不正确地移动到旧位置。 ⼤多数游戏处理这个问题都是使⽤UDP,然后在所需的数据包⾥增加⼀些⾃定义的可靠层来完成。这个额外的层在UDP数据段的开始位置添加——可以认为是⾃定义的协议数据头。最基本的可靠性数据是顺序号,可以跟踪哪个数据包号是哪个,然后通过设置位域来应答。通过使⽤位域,某个数据包可以同时应答多个数据包,需不需要每个数据包都应答⼀次。这个系统同时还有灵活性,就是如果某个系统不需要可靠性和顺序信息,那么可以不添加数据头直接发达。【⽹络拓扑】 拓扑决定了不同的计算机在⽹络游戏会话中是如何连接的。虽然配置上有很多种不同的⽅式,但⼤多数游戏都⽀持⼀种或两种模型:服务器/客户端或是点对点。【服务器/客户端】 在服务器/客户端模型中,有⼀个中⼼计算机(也就是服务器),所有其他计算机(也就是客户端)都会与之通信。这类模型通常也叫中⼼型结构,因为服务器是所有客户端的中⼼节点。 服务器/客户端模型是今天最流⾏的⽹络游戏拓扑结构。在常见的服务器/客户端模型的实现中,服务器会被认为是权威的,就是说它要验证⼤多数客户端⾏为。假设⽹络游戏允许玩家向另⼀个玩家投掷闪避球,在另⼀名玩家被闪避球打中之后,投掷的玩家会得分。在权威服务器中,当玩家想投掷闪避球时,会先向服务器发起请求,服务器会检查这是否是⼀个合法动作。然后服务器会模拟闪避球的弹道,在每⼀帧检查这个球是否与某个客户端发⽣碰撞。如果客户端被击中,服务器会通知客户端被打败。 服务器验证的理由有两个。第⼀个理由就是服务器会拥有所有客户端的最新位置信息。⼀个客户端投出闪避球,可能会认为⾃⼰投中了,但这可能是因为当时位置不是最新的。⽽如果客户端能够⽤闪避球淘汰其他玩家⽽⽆须经过服务器验证的话,就很容易有外挂程序作弊淘汰其他玩家。 因为服务器需要认证,服务器/客户端模型的游戏逻辑实现起来就⽐单⼈游戏更加复杂。【点对点】 在点对点模型中,每个客户端都连接到其他客户端。正式⼀点的名称为帧同步模型,就是⽹络更新被分为每次150ms到200ms的回合更新。每当执⾏⼀次输⼊动作,这个命令都会保存到队列⾥,在每轮结束的时候执⾏。 客户端的帧同步⽅法会使所有客户端都紧密地同步,没有任何玩家能够⽐其他玩家先⾛。当然,这种同步⽅式的缺点就是——如果⼀个客户端开始延迟,其他客户端都要等待,⼀直到这个玩家赶上来。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690779961a424149.html
评论列表(0条)