网络协议设计

一篇文章:

要解决的重点在于
1 防止发送的消息丢失
(1)接收方收到则应答
(2)发送发发送后,过一段时间未收到应答,则重发;重发多次仍无应答,则退出
2 防止应答丢失
(1)应答丢失,则发送方会重发。接收方需判断收到的消息是否重复(帧中加入序列号)
3 身份确认
(1)用地址确认身份
4 传递效率
(1)限制每条消息的大小

上面的很基础。转自:http://blog.csdn.net/ybdesire/article/details/6859582

一篇文章:

实时游戏的网络协议设计

类似于SLG这类游戏,对游戏的实时交互要求不是很高,所以一般选择的都是通过HTTP协议,进行前后台数据交互。但随着用户对游戏的需求越来越高,MMORPG也逐步出现在webgame之中,诸如昆仑、乐土这类回合制MMORPG-Webgame。由于HTTP是短连接,不能适应这种长连接的网络需求。所以肯定是需要使用socket进行网络连接的。虽然COMET也能达到类似的目的,但是性能上还是难以达到socket的水平,所以在商业化应用上还是比较少考虑的。
本文不会涉及到用何种语言实现socket连接来传递数据,主要内容是根据实际的经验,和大家讨论下服务器端和客户端之间传递的数据及数据结构的一些问题。

首选说几个名词:
1、封包
大家在使用互联网的时候,所有的数据都是被打成一个包发出去的,这个包不是压缩包(zip\rar),而是有一定数据结构的二进制数据。封包的主要内容是数据信息,含有信息要发送到的目的IP地址、信息发送的源IP地址、以及一些相关的控制信息。当一台路由器收到一个IP数据包时,它将根据数据包中的目的IP地址项查找路由表,根据查找的结果将此IP数据包送往对应端口。下一台IP路由器收到此数据包后继续转发,直至发到目的地。路由器之间可以通过路由协议来进行路由信息的交换,从而更新路由表。
在设计游戏的封包中,我们只关心数据信息,而其他的不需要关心。

2、字节(Byte)
大家对对MB,KB肯定不陌生,也一定知道MB或KB中的B就是Byte。Byte是存储空间的基本计量单位。一般来说一个ASCII码就占用一个字节,比如‘A‘或者1

3、位
既然知道了字节,那么字节由什么组成呢,那就是位了。是计算机中最小的数据单位。一个字节由8个二进制位构成,如00001111。ASCII码是都可以转换成二进制的。如下表
二进制       十进制     十六进制  字符
00110001      49          31          1 
00110010      50          32          2
00110011      51          33          3 
00110100      52          34          4
00110101      53          35          5 
00110110      54          36          6
00110111      55          37          7 
00111000      56          38          8 
00111001      57          39          9

1、协议设计
一般来说我们都会设计一个协议,这个协议指明了,这个封包的数据的作用是什么。一般我们都会用数字来代表协议。
如:
登陆登出 1
聊天        2
移动        3

所以我们可以这样设计数据协议
--------------------------------
控制器 登陆登出 1
--------------------------------
动作    登陆       1
动作    登出       2

----------------------------------
控制器     聊天        2
----------------------------------
动作    私聊       1
动作    世界       2
动作    队伍       3

-----------------------------------
控制器     移动        3
-----------------------------------
动作        移动        1

这样就构成了数据结构:控制器,动作,DATA
如世界聊天:2,2,DATA; 移动:3,1,DATA

这样客户端和服务器端就能根据控制器和动作来调用不同的程序来处理DATA中的数据。
而DATA也有自己的结构,这个是根据实际的功能来设计的。
比如私聊,就设计成:2,1,from,to,msg

如果我们使用socket传输字符串,那么客户端和服务器端收到这样的数据后就可以进行处理了。

2、封包设计
在协议设计中,我们是使用的字符串组成的协议,而为了降低网络开销,一般使用二进制来传递数据。这样可以大大降低包的长度。节省网络带宽。

之前我们在协议设计了控制器和动作,现在我们加一个返回值,返回值代表了控制器和动作的结果,而不是数据本身。那么就构成了这样的数据结构:控制器,动作,返回值,DATA。

我们可以把控制器、动作、返回值放到两个字节里面,这就要进行位操作。

一个字节有8位,我们可以这样分配位:
第一个字节
+--------4--------8
+   控制器   +   动作 +
+---------+------+
将一个字节的第1-4位用与控制器,5-8位用于动作

第二个字节
+--------4--------8
+   返回值   +   保留 +
+---------+------+
将一个字节的第1-4位用与返回值,5-8位保留以作他用

如果无返回值,者第二个字节为00000000

而DATA中的数据也是使用二进制结构,这就需要根据不用的协议,来写不同的解包程序。也可以写通用的解包程序,那就需要在设计数据结构的时候更要深思熟虑。关于DATA这部分的数据结构的设计,会以后专门进行说明。

我们构造出了封包的数据主体,还要标示出这个数据有多长,我们会在长度和数据主体之间加一个分割符,我这里用了0x88或0x86
+--------16--------8--------8---------4--------8---------4----------n
+ 包长   +   0x88   + 控制器 + 动作 + 返回值   + 保留   + DATA +
+--------+--------+--------+--------+--------+---------+----------+
这里需要根据实际情况,决定包长使用1个字节还是2个字节,1个字节可以表示255个字节的长度,2个字节可以标示65535的长度

在进行socket通信的时候,经常会处理拼包和粘包这些问题。用我们之前设计的数据结构,是无法处理拼包和粘包这些问题的,所以我们还必须把以控制器为单位的包区分开来。

比如我们的包构成是:
+--------16--------8--------8---------4--------8---------4----------n
+ 包长   +   0x88   + 控制器 + 动作 + 返回值   + 保留   + DATA +
+--------+--------+--------+--------+--------+---------+----------+

我们可以在包前端增加一个字节以进行区分
+--------8--------16--------8--------8---------4--------8---------4----------n
+   0x86   + 包长   +   0x88   + 控制器 + 动作 + 返回值   + 保留 + DATA   +
+--------+--------+--------+--------+--------+--------+---------+----------+

在整个封包中,还可以加入更多的元素,比如加密,奇偶校验等,这些要根据实际情况来设计包的结构,这些需要大家在实际的项目中去体会和发现。

本文只是对封包做了一个概要性的讲解,不足、漏洞、不合理肯定是比比皆是。希望大家能指出来一起讨论,也希望能看到有更好的想法提供给大家。

时间: 2024-10-11 04:33:55

网络协议设计的相关文章

编程思想:如何设计一个好的通信网络协议

当网络中两个进程需要通信时,我们往往会使用 Socket 来实现.Socket 都不陌生.当三次握手成功后,客户端与服务端就能通信,并且,彼此之间通信的数据包格式都是二进制,由 TCP/IP 协议负责传输. 当客户端和服务端取得了二进制数据包后,我们往往需要『萃取』出想要的数据,这样才能更好的执行业务逻辑.所以,我们需要定义好数据结构来描述这些二进制数据的格式,这就是通信网络协议.简单讲,就是需要约定好二进制数据包中每一段字节的含义,比如从第 n 字节开始的 m 长度是核心数据,有了这样的约定后

用Netty解析Redis网络协议

用Netty解析Redis网络协议 根据Redis官方文档的介绍,学习了一下Redis网络通信协议.然后偶然在GitHub上发现了个用Netty实现的Redis服务器,很有趣,于是就动手实现了一下! 1.RESP协议 Redis的客户端与服务端采用一种叫做 RESP(REdis Serialization Protocol)的网络通信协议交换数据.RESP的设计权衡了实现简单.解析快速.人类可读这三个因素.Redis客户端通过RESP序列化整数.字符串.数据等数据类型,发送字符串数组表示参数的命

linux 网络协议分析---3

本章节主要介绍linxu网络模型.以及常用的网络协议分析以太网协议.IP协议.TCP协议.UDP协议 一.网络模型 TCP/IP分层模型的四个协议层分别完成以下的功能: 第一层 网络接口层 网络接口层包括用于协作IP数据在已有网络介质上传输的协议.实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能.相反,它定义像 地址解析协议(Address Resolution Protocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口. 第二层 网间层 网

信息安全系统设计基础实验五:通讯协议设计

北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:52.53 姓名:王思亓 赵阳林 学号:20135205 20135334 成绩: 指导教师:娄嘉鹏 实验日期:2015.11.24 实验密级: 预习程度: 实验时间:15:30—18:00 仪器组次: 必修/选修:必修 实验序号: 实验名称:通讯协议设计 实验目的与要求:1.掌握在ARM开发板实现一个简单的WEB服务器的过程.2.学习在ARM开发板上的SOCKET网络编程.3.学习Linux下的signal()函

浅析低延迟直播协议设计:RTP/RTCP

转自:http://blog.csdn.net/dj0379/article/details/51960237 如今的直播市场非常火爆,有很多直播云服务的提供商可供产品选择.同时视频直播产品喷涌而出,比如大家耳熟能详的映客.YY,还有最近特别火爆的一直播. 基于TCP的协议延迟不够低 众所周知,直播中通用CDN大部分提供的是RTMP的方案以及HLS的方案.HLS在手机H5里面的兼容性非常好,而RTMP是Adobe的协议,它在延迟.稳定性和分发质量方面平衡得很不错.但是当涉及会议场景时,基于TCP

网络协议分层(七层、四层)

一.概述 网络协议设计者不应当设计一个单一.巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议.这样做使得每个协议的设计.分析.时限和测试比较容易.协议划分的一个主要原则是确保目标系统有效且效率高.为了提高效率,每个协议只应该注意没有被其他协议处理过的那部分通信问题:为了主协议的实现更加有效,协议之间应该能够共享特定的数据结构:同时这些协议的组合应该能处理所有可能的硬件错误以及其它异常情况.为了保证这些协议工作的协同性,应当将协议设计

常见的网络协议有哪些?

1.IP协议:互联网协议 主要用于负责IP寻址.路由选择和IP数据包的分割和组装.通常我们所说的IP地址可以理解为符合IP协议的地址. 2.TCP协议:传输控制协议 该协议主要用于在主机间建立一个虚拟连接,以实现高可靠性的数据包交换.IP协议可以进行IP数据包的分割和组装,但是通过IP协议并不能清楚地了解到数据包是否顺利地发送给目标计算机.而使用TCP协议就不同了,在该协议传输模式中在将数据包成功发送给目标计算机后,TCP会要求发送一个确认:如果在某个时限内没有收到确认,那么TCP将重新发送数据

一、网络通信模式和网络协议

分散式.集中式和分布式 在早期的计算机网络中,为了有效的利用计算机,一般讲数据通信模型分为分散式(Decentralized).集中式(Centralized)和分布式(Distributed). 1.分散式 在分散式系统中,用户只需要管理自己的计算机系统,各自独立的系统之间没有资源或信息的交换或共享.这种模型由于存在大量共享数据的重复存储,除了引起数据冗余之外,也很容易导致一个企业组织内各部门数据的不一致性,同时还会造成硬件,支持和运营维护等成本的大量增加,因此早淘汰. 2.集中式 在集中式环

常见的网络协议有哪些?

原文链接地址:http://blog.sina.com.cn/s/blog_9cf7416701012pw4.html 在网络的各层中存在着许多协议, 它是定义通过网络进行通信的规则, 接收方的发送方同层的协议必须一致,否则一方将无法识别另一方发出的信息, 以这种规则规定双方完成信息在计算机之间的传送过程. 下面就对网络协议规范作个概述: ARP(Address Resolution Protocol)地址解析协议 它是用于映射计算机的物理地址和临时指定的网络地址. 启动时它选择一个协议(网络层