yukamu 发表于 2022-12-28 15:20

理解Unity中的网络

网络部分的内容具体学起来每一个部分都可以展开成一门课程,这里力求用最精简的方式总结主要的知识点!Enjoy~
1 网络分层

1.1 网络分层

TCP/IP模型中将网络分为了5个层级:物理层、数据链路层、网络层、传输层、应用层。OSI参考模型中有七层,但主要是将应用层进行了细分拆解。嗯这里每一个层级分别做什么会有些抽象,重点弄清楚标黑的部分在什么层级就好。

[*]物理层:将一个个比特从一个节点移动到下一个节点。
[*]数据链路层:将分组从一个节点移动到路径上的下一个节点;链路层分组被称为帧。
[*]网络层:负责将数据包的网络层分组从一台主机移动到另一台主机;包含IP协议。
[*]传输层:负责在应用程序端点之间传送应用层的报文;有两种运输协议:TCP和UDP;运输层的分组被称为报文段。
[*]应用层:网络应用程序以及他们的应用层协议存留的地方;包含HTTP;应用层中一个端系统的应用程序使用协议和另一个端系统中的应用程序交换信息分组(这种位于应用层的信息分组被称为报文)。
1.2 需要考虑的不利因素

以下三个要点是我们关注网络性能的时候需要注意的点。

[*]延时:从一个节点到后续的节点,沿途的节点会经受几桶不同类型的延时:节点处理演示、排队延时、传输延时、传播延时。这些延时加起来就是节点的总延时。
[*]丢包:与排队延时有关,如果流量到达的时候链路的队列是满的,路由器将会丢弃这个分组,就造成了丢包。
[*]吞吐量:性能测试中也需要关注端到端吞吐量。
2 网络协议:TCP & UDP 以及HTTP

端系统、分组交换机以及其他的因特网补件都需要运行一系列的协议,协议的作用是控制因特网中信息的接收和发送。TCP和IP是两个重要的协议,统称为TCP/IP,这种协议是存在于网络层的。通常我们开发中说到的协议主要是指传输层中的TCP/UDP以及应用层中的HTTP。
协议:定义了在两个通信实体之间交换的报文的格式和顺序,以及报文发送或接收一条报文之后所采取的动作。2.1 TCP & UDP

TCP和UDP处于传输层;两种都是常用的协议,还有其他的协议,但是没有这两种通用。



TCP & UDP



具体的场景选择

其中基于TCP的连接中需要掌握三次握手和四次挥手:
(1)三次握手 & 四次挥手
TCP中建立连接需要三次握手,断开连接的时候需要四次握手。
三次握手的过程:



为什么是3次?
如果只有两次:第二次服务端发报文之后,服务端就会认为连接是建立了的;但是客户端不一定收到了,会导致连接错误。如果有四次:三次以后就可以确认了,四次显得冗余。
四次挥手的过程:


为什么客户端最后一次发送报文之后还需要进入Time-Wait阶段?
如果客户端最后发的报文服务端没有收到,服务端超时之后会再发一个报文给客户端,这个等待时间确保客户端预留了时间来处理重传的报文。
2.2 HTTP

http在网络的应用层中,基于TCP。Http本身没有检测是否连接、数据传输是否准确、是否有数据到达等机制,这些都依赖于传输层的TCP协议。
Https是在HTTP基础上用TLS/SSL进行加密之后的加密版本。
Http在游戏开发中被称为短链接,平均链接时间比较短,不受前端控制,与实现TCP连接的长链接相对应。
Unity中我们可以自己基于.net进行开发,也可以使用封装好的UnityWebRequest。HTTP有head和body两部分,可以使用post和get进行参数请求。
3 Unity中的Socket编程

这里仅展示基于TCP的长链接过程,其他网络编程还有HTTP短链接、UDP(有待后续补充啦)。
TCP长链接中我们需要用到Socket,分为同步Socket连接和异步Socket连接,同步连接采用阻塞式API(Connect\Send\Receive等),优势是简单易实现,但是会造成卡顿,所以引入了异步和多路复用的概念。
一般来说服务器第一次启动连接的时候可以采用同步的方式,后续的收发消息应该采用异步的方式。
3.1 同步连接:服务端启动为例

主要流程:创建socket对象——绑定监听消息IP和端口号——监听客户端的连接请求——收发消息
主要使用的API:Send和Receive
using System.Net;
using System.Net.Sockets;

namespace NetworkServer
{
    class GameServer
    {
      static void Main(string[] args)
      {
            //创建一个socket对象
            Socket tcpsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //绑定监听消息IP和端口号
            IPAddress ip = IPAddress.Parse("199.199.1.230");
            EndPoint endPoint = new IPEndPoint(ip, 6000);
            tcpsocket.Bind(endPoint);
            Console.WriteLine("服务器启动完成");

            //开始监听客户端的连接请求
            tcpsocket.Listen(100);
            Socket socket = tcpsocket.Accept();
            Console.WriteLine("有个客户端连接进来");

            //向客户端发送消息
            string message;
            message = "你好,这里是服务端";
            var date = ASCIIEncoding.UTF8.GetBytes(message);
            socket.Send(date);

            //接收客户端的消息
            byte[] bt = new byte;
            int messageclient = socket.Receive(bt);
            Console.WriteLine("接收从客户端发来的消息:" + ASCIIEncoding.UTF8.GetString(bt));

            Console.ReadLine();

      }
    }
}
3.2 异步连接:客户端发送消息为例

客户端代码:
public void OnBtnSend()
    {
      string sendStr = inputField.text;
      byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
      for (int i = 0; i < 10000; i++)
      {
            tcpSocket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallBack, tcpSocket);
      }
    }

    public void SendCallBack(IAsyncResult ar)
    {
      try
      {
            Socket socket = (Socket)ar.AsyncState;
            int count = socket.EndSend(ar);
            Debug.Log("Socket Send succ" + count);
      }
      catch (SocketException ex)
      {
            Debug.Log("Socket Send fail" + ex.ToString());
      }
    }服务端代码:
              byte[] bt = new byte;//这里是消息的缓冲区
            int messageclient = socket.Receive(bt);
            
            Console.WriteLine("接收从客户端发来的消息:" + ASCIIEncoding.UTF8.GetString(bt));

4 网络同步:状态同步 & 帧同步

4.1 同步理论

同步的过程:客户端1向服务端发送一条消息,服务端稍作处理之后广播给所需的客户端。传递的消息包括位置角度等状态值(状态同步)和向前走这样的指令(指令同步)。
同步的难题:消息的传播会有延时;消息到达的时间并不稳定。这些难题并不能完全解决,只能尽量优化,例如:表现优化等。
4.2 状态同步 & 帧同步

对于两种同步方式的对比主要从以下三个方面来进行:含义、性能(安全性、传输速率)、表现(回放、断线重连)



帧同步 & 状态同步

参考文献:

《Unity3D高级编程主程手记》
《Unity3D网络游戏实战》
Socket Class (System.Net.Sockets)
页: [1]
查看完整版本: 理解Unity中的网络