【协议】
  数据包可以想象成是在网络上传输的电子信封。在它的数据头中有地址和其他相关信息,然后才发出真正的数据帧。
  网络数据传输,有着很多不同的协议或规则来定义数据包以什么格式以及为了发送必须 做些什么。
  网络游戏现在通常会让游戏逻辑使用两种协议之一: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的回合更新。每当执行一次输入动作,这个命令都会保存到队列里,在每轮结束的时候执行。
  客户端的帧同步方法会使所有客户端都紧密地同步,没有任何玩家能够比其他玩家先走。当然,这种同步方式的缺点就是——如果一个客户端开始延迟,其他客户端都要等待,一直到这个玩家赶上来。

杂记:网络游戏中用到的一些网络协议相关推荐

  1. Java 面试知识点解析(五)——网络协议篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  2. 网络协议分析工具Ethereal的使用

    大学时计算机网络课的实验报告,当时提不起兴趣,今天看来还挺有用的.可以学习下怎样抓数据包,然后分析程序的通信协议. 一:学习使用网络协议分析工具Ethereal的方法,并用它来分析一些协议. 实验步骤 ...

  3. 什么是无线路由器网络协议?

    上一篇我们介绍了什么是网络协议转换器,相信看过的朋友对此都有了一定的认知,可能有些朋友在使用协议转换器的时候用的是无线路由器网络,那么,什么是无线路由器网络协议呢?接下来飞畅科技的小编就来为大家详细介 ...

  4. 智能会议系统(8)---流媒体中用到的几个协议简介

    流媒体中用到的几个协议简介 1. 由来 电视会议是近年兴起的一种通信方式.随着技术的进步,电视会议的发展可以划分为4个浪潮: 第1个浪潮是拨号群组电视会议系统: 第2个浪潮是基于ISDN的电视会议系统 ...

  5. 设置好网络协议了为何网络还是不通_记一次菜鸟网络的面试经历

    我是一个不太爱折腾的人,因此在一个公司待久了,就不太会轻易跳槽.正因为如此,我在上家公司待了整整三年,在这里,认识了一群可爱的人,便更不舍得离去. 但因为公司属于传统企业,技术上并没有太大挑战,个人也 ...

  6. 用Netty解析Redis网络协议

    用Netty解析Redis网络协议 根据Redis官方文档的介绍,学习了一下Redis网络通信协议.然后偶然在GitHub上发现了个用Netty实现的Redis服务器,很有趣,于是就动手实现了一下! ...

  7. 网络协议分析与仿真课程设计报告:网络流量分析与协议模拟

    公众号:CS阿吉 网络协议分析与仿真课程设计报告  题  目:网络流量分析与协议模拟 专业名称:         网络工程 班    级: 学生姓名:           阿吉 学号(8位): 指导教 ...

  8. 华为“扫地僧”纯手打《趣谈—网络协议.pdf》,看完只剩一个字:香

    不知道你有没有发现一个问题: 这几年技术更新很快,这几年OpenStack.Docker.Mesos ,Kubernetes.微服务.Serverless.AIOps等技术一个比一个赶,往往都是还没了 ...

  9. 一文搞懂“网络协议”

    目录 一.各类协议介绍 1.计算机协议介绍 2.TCP/IP 协议群 3.TCP 协议传输特点 4.服务端口 5.数据包与处理流程 二.HTTP 协议 1.HTTP 协议介绍 2.HTTP 协议的请求 ...

最新文章

  1. python推荐书籍-有哪些 Python 经典书籍?
  2. linux oel7没有网络,rhel7/oel7上修改默认内核启动顺序的方法
  3. linux驱动调试--oops信息
  4. try-with-resource语法
  5. 鹅厂应届生在600人大群怒怼管理层,反内卷从手撕领导开始......
  6. 要开始研究.NET了
  7. 计算SDWebImage缓存大小以及清除
  8. Ubuntu15.10 安装JDK,配置环境变量, 解决无法登录的问题
  9. jQuery 根据值或者文本选中select
  10. 松下计划摆脱对特斯拉依赖 与其他汽车制造商合作
  11. SHP格式数据点线面无边界坐标生成经纬度边界点集合数据
  12. java程序设计概念对象先行_Java程序设计概念:对象先行(原书第8版)简介,目录书摘...
  13. V831 MP4播放+船新版本
  14. 分散层叠(Fractional Cascading)
  15. c语言错误不允许使用不完整的类型,C语言不允许使用不完整的类型报错是什么意思啊...
  16. QT HTTP接收多个数据包生成图片
  17. Unity2D小游戏——类似QQ堂的小 demo(炸弹人)
  18. 晨曦记账本快速搜索收支账的基础操作
  19. 估计标准误差syx_相关系数与估计标准误差的关系
  20. Sklearn.cluster

热门文章

  1. matlab:转置运算符
  2. 使用python的scapy库,提供一个可用的通过nbns获取主机名称的示例代码
  3. 关于南方CASS9.1、9.2复制锁的部分功能缺陷的几点说明
  4. matlab常见错误,matlab常见错误(gui篇)
  5. 抖音超火的罗盘时钟效果
  6. Dontplaywithkitty.io链游平台3000 创世猫NFT 2小时内全部售罄
  7. 【渝粤题库】陕西师范大学180212 定价理论与策略 作业(专升本)
  8. web浏览器使用ic卡或磁卡读卡器自动弹出页面
  9. 衡量点云重建结果的指标-CD、EMD
  10. winxp下虚拟机linux(ubuntu)系统如何访问本地磁盘