工作中经常遇到协议的设计,游戏、通信、视频、加密等等,协议设计和分析有什么基本方法吗?

2010-11-02 19:25:06

3 Answers

问题比较大,设计好的协议需要考虑这些方面:
a. 安全性
b. 开发速度
c. 可靠性
d. 易维护性
e. 扩展性
f. 实时性
g. 兼容性 (好像知道的特性都来了)

协议设计通俗点来说先分清楚几点:
1. 文本/二进制。文本协议能自解析,维护起来非常容易;二进制效率高,但是维护起来挺麻烦,兼容性也不容易做。
2. 性能优先/开发速度优先。定制的协议相对来说肯定性能最好,如果开发速度优先,直接以比较成熟的协议为基础,比如protobuf, xmlrpc

2010-11-02 21:52:23

关于协议设计和分析一直都都是在工作遇到,说到协议我想在这个网络的时代,没有人可以离开它了,他存在我们生活中的任何角落,只不过我们都是平凡的人,并没有注意到它的存在,可以这么说如果没有协议人类的生活和日常的工作生产都不能进行,如果仔细想想你生活中用到的所有东西,协议已经包含其中。那到第什么协议呢?说的简单一点就是双方达成的共识,以便更好的交流,理论上协议是什么呢?如果学过《信号与系统》的人都知道有个简单的道理,就是信息在经过一个管道的符号集,到另一个符号集时信息不会丢失。

大繁至简任何复杂的事物都有个最简单的本质,网络上的协议也是这样,有个最基本的本质。除去上下层的概念,协议就只剩下通信双方实体的规则。

一般的协议都包含最基本的协议头,不管是物理层、链路层还是网络层,这个头就构成了协议的本质东西。通常协议头要包含一下最基本的三项信息:

双方实体的唯一标示,用来标示通信双方的实体。
类型描述或者是静核描述,标志着静核和内容。
协议静核的长度,用来在萃取静核的内容应用。

其中,前两项是必须要有的没有他们,通信双方的交互根本得不到保证,第三项在不太灵活的通信中可以去掉,而有第二项的类型推出。

协议的丰富性,有静核的多样性体现。

协议头除了以上的三项,还可以加更多的信息(比如控制信息、时间信息等),取决于具体的应用,在这里这部分我不做描述,我只描述本质不变的东西。我想找到这些基本的东西,再去看协议的时候,能够更好的抓住协议的主体进行分析和设计了。
2010-11-02 23:04:04

协议设计:
1.借鉴TCP/IP。TCP/IP是一个博大精深的协议设计和实现方案,有很多值得学习和借鉴的东西。为什么要分为“链路层、网络层、传输层、应用层”?各层有哪些协议?各有什么应用背景?
By 5lulu.com
最重要的是TCP、UDP两个协议,两个协议的应用和区别?为什么TCP要设计连接建立的3次握手和连接关闭的4此握手?滑动窗口是什么概念?
2.设计自己的协议。对于传输速度要求很高,而且传输相对稳定,这时需要自己实现协议栈,可以参考@如何加快两端之间的文件传输速度?。或者使用T\TCP,即TCP事务协议,TCP\IP为了实现满足上述要求设计的协议。
3.安全性协议。不光是网络上传输数据的协议TCP/IP,加密认证也需要协议。比如如何实现安全的密钥交换?怎么抵御密钥交换协议的中间人攻击?如何实现双向认证?和好的一个例子是https协议,需要双向认证,但也会遭到中间人攻击。

协议分析
协议分析主要应用在对网络数据的解析和还原,比如公安部门使用的还原网民的数据、分析游戏通信的协议。
可以使用WireShare、Ethereal来抓包分析,主要是分析传输层(TCP、UDP)和应用层协议(HTTP、FTP等)。
难点是一般数据通信都是加过密的,所以需要对数据进行解密。加密不强的数据,直接凭经验可以识别出,拿到解密的网站解密。对于高强度加密,比如对称和非对称,需要获得密钥。若能拿到软件,可以进行逆向分析,找到"拼包的地方"(加密之前)。可以使用OD,在内存中查找要发送的数据,对其下内存访问断点,跟踪在哪几个地方会断下,就可以找到"拼包的地方",之后都可以获得加密之前的明文数据。

2010-11-03 00:07:43
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制