Unity网络游戏实战读书笔记(第五章TCP了解、第六章客户端网络模块)


项目代码:在这


第五章 深入了解TCP

  • TCP是一个面向连接的,可靠的,基于字节流的传输层协议
  • 客户端发送SYN,服务端收到发送ACK回应并发送SYN包,客户端收到ACK,并发送回应服务器的ACK
  • TCP参数
  1. ReceiveBufferSize、SendBufferSize操作系统读写缓冲区大小默认都为8kb = 8192byte
  2. NoDelay,是否启用Nagle算法,举例tcp/ip协议会将数据加工,如果发送很小的数据体a,总发送字节为21(20的ip头和20的tcp头)。这样会导致发送总数据包体变大。所以Nagle算法发现如果发送的数据字节很小,将会积攒到一定的大小再发送。这会导致网络实时性下降
  3. TTL 就是ip数据包发送时,经过路由器最大跳数。每经过1个将会-1,直到TTL=0,路由器将会丢弃数据包,这样将会防止路由器循环,从而导致无限转发问题。如下图
  4. ReuseAdress:端口复用,因为TCP四次挥手会有等待时间,退出程序和端口释放不同步。这个的用途就是服务器挂了重启,然后服务器端口并未释放,导致无法重新绑定端口问题。
  5. LingerState 在说这个先说一下TCP四次挥手,客户端发送FIN指令,然后进入TIME_WAIT_1状态,服务端收到FIN指令进入CLOSE_WAIT状态将会发送ACK回应客户端,此时客户端为TIME_WAIT_2状态,待服务端将数据发送完成,发送FIN指令进入LAST_ACK状态,客户端收到将会进入TIME_WAIT阶段(一般为4分钟,4分钟后释放Socket),服务端收到客户端回应的ACK将会直接释放Socket。而LingerState可以设置一个超时时间,给服务端发送缓冲区的数据,超时过了,将会释放Socket。
  • 心跳机制:当连接没有数据传输时,会发送一个信号( KeepAlive开启),对端接收到这个信号将会回应,如果没有回应,重传几次还没有回应将会关闭这个连接。TCP的KeepAlive默认为2个小时,很鸡肋,所以一般自己实现。缺点:这也有叫PingPong,这个信号首先会占用资源,并且有可能会出现,这条连接有用但是被释放了。

第六章 通用客户端网络模块

  • 先捋一下这章干什么
  1. 首先延用了ByteArray这个结构用于接收数据和发送队列(Queue<ByteArray> writeQue)来提高效率。这个数据结构拥有写入读取。扩容前移机制。
  2. 实现了网络事件机制NetEvent和消息事件机制,通过外部订阅,内部分发。供外部对不同情况不同消息做出不同的处理
  3. 通过isClosing布尔值来确保,当被关闭时,如果writeQue内还有未发送的消息,将会保证发送完毕后关闭。
  4. 其次实现异步连接、发送、接收功能。
  5. 消息协议的编码/解码。文中使用了Json。也就是将转换成字节数组,里面消息头部信息转换如下图(这里需要注意的是GetType这里需要传入带命名空间的类名字符串namespace.Class)

  6. 最后提了一嘴,protobuf。具体就是proto文件生成cs类,剩下序列化反序列差不多。如下图可以看到Json和protobuf序列化后字节长度差距还是很大的



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值