网络基本概念
- 网络:由若干设备和连接这些设备的链路构成,设备间可以相互通信
- 局域网:指某一个小区域内由多台设备互联成的计算机组
- 以太网:网络连接的一种规则,定义了连接传输规范
- 城域网:是在一个城市范围内所建立的网络,几十到一百公里
- 广域网:是连接不同地区、城市、国家的远程网络,几十到几千公里
- 互联网(因特网):是目前国际上最大的互联网,定义了通信规则等
- 万维网:是基于因特网的网站和网页的统称
- IP地址:是互联网协议地址,IP地址是IP协议提供的一种统一的地址格式,IP地址是设备在网络中的具体地址
- 端口号:通过IP地址我们可以在网络上找到一台设备,而端口号就是用来区分设备中的应用程序的
- Mac地址:是用来确认网络设备位置的地址的,Mac地址在网络中唯一标识一个网卡,一台设备可以有多个网卡,每个
网卡都会有一个唯一的Mac地址 - 客户端:客户端或称为用户端、前端,是指与服务端相对应,为客户提供本地服务的应用程序
- 服务端:服务端或称为服务器、后端,是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据等
- 网络游戏:有客户端和服务端,玩家之间可以进行交互(信息同步,信息交换),静态数据存储在客户端,动态数据存储在服务端
- 网络游戏客户端:Unity、UE、Cocos、Egret、Laya、Flash等等游戏引擎开发的游戏,都属于客户端应用程序,他们都是被用户直接操作的,主要功能就是游戏玩法、UI交互、美术表现、本地数据保存等
- 网络游戏服务端:C++、Java、C#、Go等等语言开发的运行在远端计算机上为游戏客户端提供服务的软件,都属于服务端应用程序,它的主要功能就是消息转发、数据保存、逻辑处理等
- 数据通信模型:在早期的计算机网络中,为了有效的利用计算机,一般将数据通信模型分为分散式、集中式、分布式,这三种方式决定了数据在网络环境中的管理方式
- 分散式:在分散式系统中,用户只负责管理自己的计算机系统,各自独立的系统之间没有资源或信息的交换和共享,类似一台台没有联网的设备
- 集中式:在集中式环境中,用一台主计算机保存一个组织的全部数据,而用户则通过设备连接到这台计算机系统并和它通信,从而达到访问数据的目的
- 分布式:是分散式和集中式的混合,类似我们学习过的计算机网络,是分散式的水平交互和集中式的垂直控制相结合的一种模式
- C/S模型:Client/Server模型也叫C/S模式,也就是客户端和服务端模式
- B/S模型:Browse/Server模型也叫B/S模式,它是一种基于Web的通信模型,使用HTTP超文本传送协议通信,B/S是一种特殊的C/S模型,特殊之处就是这种模型的客户端不需要我们自己开发,一般是某种浏览器,比如IE、Chrome等
- P2P模型:Peer-to-Peer模型也叫对等互联,每个联网的设备同时运行一个应用程序的客户端和服务端部分,也就是说一个应用程序同时作为客户端和服务端
- 总结:对于网络游戏开发来说,我们通常采用C/S模型来进行前后端开发,在服务端的布局上往往使用的是分布式的形式进行管理,比如服务端的用户数据使用集中式进行管理,玩家的数据都存储在数据库应用(SQL Server、MySQL)中,服务端应用程序(账号服务器、游戏服务器、聊天服务器、跨服PVP服务器)等进行分布式管理,这些服务端应用程序都使用数据库中的数据分别进行逻辑处理
- 如果需要详细了解计算机网络的理论,可参考我的另外一个笔记系列
- 如果想要自己写一个tcp、udp的实践项目,可参考我另外一个笔记的代码
- 进程和线程的概念:
- 进程是资源分配的最小单位,线程是CPU调度的最小单位。
- 进程包含线程,线程在进程中运行。
- 一个进程可以包含多个线程。
- 什么是线程争用?
- 因为进程中可存在多个线程,线程间均可访问主线程资源。
- 所以若线程间争抢资源,可能导致数据混乱。
- 如何解决线程争用?
- 只要避免同一时间只有一个线程来访问共享数据就OK了。延续这一思路,可供参考的实现方式有:
- Monitor锁
- Lock锁,是一个语法糖,是对Monitor的封装,简单易用
- 只要避免同一时间只有一个线程来访问共享数据就OK了。延续这一思路,可供参考的实现方式有:
- 线程和协程的区别是什么?
网络协议
概述
- 网络协议:是计算机网络中进行数据交换而建立的规则、标准或约定的集合,指的是计算机网络中互相通信的对等实体之间交换信息时所必须遵守的规则的集合
- OSI模型:是网络通信的基本规则
- TCP/IP协议:是基于OSI模型的工业实现
OSI模型
- OSI模型:开放式系统互联通信参考模型,简称OSI模型,它是一种概念模型,由ISO国际标准化组织提出,是一个试图使各种设备在世界范围内互联为网络的标准框架,不同公司都按照统一的标准来控制网络互联通信,那么各设备之间就能够达到真正的互联通信了。
- OSI模型的规则:OSI模型把互联通信的过程抽象的分成了七个层级,不同层级的职能各有不同
- 应用层:应用层为最上层,和用户直接打交道的可以联网的应用程序就属于这一层,为应用程序提供服务,我们可以根据自己要传递的信息,决定使用哪一种协议(规则)来处理数据,进行传输
- 表示层:表示层会把数据转换为能与各系统格式兼容并且适合传输的格式,表示层就像是个翻译,会把数据相关信息翻译成国际通用的规则
- 会话层:建立、管理和维护会话,它主要负责数据传输中设置和维护网络中两台设备之间的通信连接,它不参与具体的传输,主要提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制
- 传输层:传输层也称运输层,传输层负责主机中两个进程之间的通信,功能是为端到端连接提供可靠的传输服务。它也会在上一层的数据基础上添加标头,包含信息:发送方接收方的端口信息、协议信息等等
- 网络层:在网络环境中,两台设备之间可能会经过很多个数据链路,也可能还要经过很多通信子网,网络层的主要作用就是选择一条合适的路径用于通信。它会在上一层的数据基础上添加标头包含:IP地址、版本、长度等等信息
- 数据链路层:数据链路层在物理层的上方确定0和1的分组方式(帧),并且明确信息是发送给哪台计算机的网卡(Mac地址);每一个帧分为两个部分:标头Head+数据Data,标头包含数据包的一些说明项,比如发送方和接收方的Mac地址,数据类型等
- 物理层:物理层将2进制数据利用电脉冲,在物理媒介上实现比特流的传输;它的主要功能是定义传输模式、定义传输速率、比特同步、比特编码等等
TCP/IP协议栈
- TCP/IP传输协议:
- 即传输控制/网络协议,也叫作网络通讯协议,是指能够在多个不同网络间实现信息传输的协议栈,它是一个工业标准,TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等等协议构成的协议栈
- TCP/IP网络结构体系实际上是基于OSI七层模型设计出来的,OSI七层模型只是一个概念模型,它主要用于描述、讨论和理解单个网络功能,而TCP/IP协议是为了解决一组特定的问题而设计的,它是基于互联网开发的标准协议
- TCP/IP协议的规则:TCP/IP协议把互联通信的过程抽象的分成了四个层级,这四层是基于OSI七层模型进行设计的
- 应用层:协议头(FTP、HTTP等协议)一般决定传输信息的类型
- 传输层:协议端口头(TCP或UDP协议)一般决定传输信息的规则以及端口
- 网络层:IP头,决定传输路线
- 网络接口层(数据链路层):产生帧(消息分段),决定最终路线
TCP/UDP协议
概述
- TCP:传输控制协议,在收发数据前,必须和对方建立可靠的连接并且在消息传送过程中是有顺序的,并且是不会丢包(丢弃消息)的,如果某一条消息在传送过程中失败了,会重新发送消息,直到成功
- 面向连接 :两者之间必须建立可靠的连接
- 一对一 :只能是1对1的建立连接
- 可靠性高:消息传送失败会重新发送,不允许丢包
- 有序的:是按照顺序进行消息发送的
- 应用场景:游戏开发,文件传输,远程登录等
- UDP:用户数据报协议,提供面向事务的简单不可靠信息传送服务
- 无连接:两者之间无需建立连接
- 可靠性低:消息可能在传送过程中丢失,丢失后不会重发
- 传输效率高:由于它的可靠性低并且也无需建立连接,所以传输效率上更高一些
- n对n:TCP只能1对1连接进行消息传递,而UDP由于无连接所以可以n对n
- 应用场景:直播,即时通讯,游戏开发等
- 报文:是网络中交换与传输的数据单元。报文包含了将要发送的完整的数据信息,其长短不一致。
- 字节流:字节流是由字节组成的。
TCP的三次握手四次挥手
三次握手建立连接:
- 第一次握手(C—>S):TCP连接请求,告诉服务器我要和你建立连接
- 第二次握手(S—>C):TCP授予连接,告诉客户端可以连接了
- 第三次握手(C—>S):TCP确认连接,告诉服务器,连接已建立
四次挥手断开连接:
- 第一次挥手(C—>S):告诉服务器数据收完了,如果还有数据要发就快发
- 第二次挥手(S—>C):告诉客户端知道了,请继续等待服务端的消息
- 服务端发送剩余消息给客户端(如果有)
- 第三次挥手(S—>C):告诉客户端消息发完了,可以正式断开连接了
- 第四次挥手(C—>S):告诉服务器倒计时结束如果没有收到服务端回复就断开了
常见问题:
- 为什么要三次握手?
- 如果只有一次握手,Client不能确定与Server的单向连接,更加不能确定Server与Client单向连接;
- 如果只有两次握手,Client确定与Server的单向连接,但是Sevrer不能确定与Client的单向连接;
- 只有三次握手,Client与Server才能相互确认双向连接,实现双工数据传输。
- 为什么要四次挥手?
- “三次握手”的第二次握手发送SYN+ACK回应第一次握手的SYN,但是“四次挥手”的第二次挥手只能发送ACK回应第一次握手的FIN,因为此时Server可能还有数据传输给Client,所以Server传输数据完成后才能发起第三次挥手发送FIN给Client,等待Client的第四次挥手ACK。
- 为什么不能直接CLOSE状态,必须要先设置TIME_WAIT状态?
- 理论上,四个报文都发送完毕,就可以直接进入CLOSE状态了,但是可能网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文
UDP协议
- UDP协议不像TCP协议需要建立连接有三次握手和四次挥手,当使用UDP协议发送信息时会直接把信息数据扔到网络上,所以也就造成了UDP的不可靠性,信息在这个传递过程中是有可能丢失的
- 虽然UDP是一个不靠谱的协议,但是由于它不需要建立连接,也不会像TCP协议那样携带更多的信息,所以它具有更好的传输效率,它具有资源消耗小,处理速度快的特点
网络游戏通信方案
- 弱联网游戏:这种游戏不会频繁的进行数据通信,客户端和服务端之间每次连接只处理一次请求,服务端处理完
客户端的请求后返回数据后就断开连接了,一般的三消类休闲游戏、卡牌游戏等都会是弱联网游戏 - 强联网游戏:这种游戏会频繁的和服务端进行通信,会一直和服务端保持连接状态,不停的和服务器之间交换数
据,一般的MMORPG(角色扮演)、MOBA(多人在线竞技游戏)、ACT(动作游戏)等等都会是强联网游戏 - 短连接游戏:需要传输数据时,建立连接,传输数据,获得响应,断开连接
- 通信特点:需要通信时再连接,通信完毕断开连接
- 通信方式:HTTP超文本传输协议、HTTPS安全的超文本传输协议(他们本质上是TCP协议)
- 长连接游戏:不管是否需要传输数据,客户端与服务器一直处于连接状态,除非一端主动断开,或出现意外情况(客户端关闭或服务端崩溃等)
- 通信特点:连接一直建立,可以实时的传输数据
- 通信方式:TCP传输控制协议或UDP用户数据报协议
- Socket:网络套接字,是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象,一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制,主要用于制作长连接游戏(强联网游戏)
- Http/Https:(安全的)超文本传输协议,是一个简单的请求-响应协议,它通常运行在TCP协议之上,它指定了客户端可能发送给服务端什么样的信息以及得到什么样的响应,主要用于制作短连接游戏(弱联网游戏),也可以用来进行资源下载
- FTP:文件传输协议,是用于在网络上进行文件传输的一套标准协议,可以利用它来进行网络上资源的下载和上传,它也是基于TCP的传输,是面向连接的,为文件传输提供了可靠的保证
- TCP字节流转数据流的三种数据压缩方案:
- 用2进制读写硬写
- Protobuf(用的最多,后面协议生成工具有讲)
- MessagePack,一种高效的数据压缩方式(效率比protobuf更高)可以用于配置表的优化上
- 设计一个安全稳定的网络架构的需求分析:
- Lua侧和C#侧,都有网络通讯的需求,希望都能支持:双侧通讯
- 希望你能在设计中,增加协议保护:数据安全
- 通讯数据可能出现黏连,希望能正确解析:黏包拆包
- 服务器怎么知道客户端“在不在线”:心跳包
- 客户端“断线”时,用户能无感知的连接上服务器,提升用户体验:断线重连
- 在通讯过程中,客户端“断线”,希望服务器没处理成功的C2S,可以再处理一遍:客户端“丢包”
序列化和反序列化2进制数据
- 在网络通信中,我们把想要传递的类对象信息序列化为2进制数据(一般为byte字节数组),再将该2进制数据通过网络传输给远端设备,远端设备获取到该2进制数据后再将其反序列化为对应的类对象
- 序列化:将类对象信息转换为可保存或传输的格式的过程
- 反序列化:与序列化相对,将保存或传输过来的格式转换为类对象的过程
- 和网络通信相关的知识点:
- BitConverter类:主要用于处理各类型和字节数组间的相互转换
- Encoding类:主要用于处理字符串类型和字节数组间的相互转换
- 加密相关:了解2进制数据加密的常用手段和思路
- 本地持久化知识点:
- File类:文件操作类,用于操作文件
- FileStream类:文件流类,以流的形式进行文件存储读取操作
- MemoryStrem:内存流对象
- BinaryFormatter:2进制格式化对象