通信__协议的那点事!!

我们的“协议”:

到目前为止,我们已经简单了解了通信的基本模型,Server—Client模型,这里以简单聊天工具为例:1、服务端启动——2、客户端启动,并试图与服务端建立连接——3、服务端根据条件(通常是根据客户端发送过来的某种特殊消息,分析其中的账号,密码)发送响应给发送请求的客户——4、若同意,客户端获得某种使用功能的权利——5、服务端发送包含特定接收对象的聊天消息给服务端——6、服务端转发聊天消息,并goto步骤5

由上面的简单例子,我们可以看到,通信的双方在通信时有特定的步骤。只有双方都按正确步骤来执行,通信才能有质量的实现。当有一方违反这种规则的时候,那就整个乱套了:你能不通过登陆,就直接用QQ发送消息给你的朋友么??

其实,上面提到的概念就是通信协议中的两大核心概念之一:流程。

流程,简单的说,也就是我们规定的通信双方发送信息的先后顺序。

流程是很重要的,因为通信的一方一般在某个特定阶段只能接受特定种类的消息。还是用简单聊天系统来举例,服务器在某个客户端登陆以前是这能接受“注册”或者“登陆”消息的,如果这个时候它接受到了其他种类的消息(如客户端流程不正确,发送了一条“聊天消息”),服务器实际上是分辨不出来,而把它当做错误消息来处理的,一般是断开连接,严重的可能会导致系统崩溃。

任何一个能正常运行的网络程序都是高度契合的。

在上文中,我多次提到了消息的“种类”,这就是通信协议中的另一个核心:消息的定义。

我们知道,通信中信息的发送与接收是通过IO流来实现的,而底层IO流传输的01串,那么,怎样通过01串来表示要传输的数据呢??

很容易想到,是编码!!我们按照规则用特定的字符来表示特定的含义。当然,这个规则必须是事先定义好的,而且必须是通信双方都知道,且严格遵守的。

简单的规则定义方式有2种:一种是字节型,一种是xml型。

字节型: 如我们事先规定发送的第一个byte是表示消息的类型,1表示群聊消息,第2到第四个byte(即一个int)表示聊天消息的大小,后面N个字节表示聊天内容。那么当我们接收到 1 6 1 3 47 2 89 20 的时候,我们就可以把他们翻译成相应的消息了,将后6个byte:1 3 47 2 89 20 转为相应的String就行了。

xml型: (Extensible Markup Language)即可扩展标记语言,这里我就不copy定义了,google一下就知道了。我只举个例子: <msg><type>GroupChat</type><content>.........</content></msg> 这就是我曾经定义过的一个群聊消息。当服务端接收到这个来自客户端 的字符串的时候,通过分析结构,就知道该怎么处理了。

值得注意的是:消息格式的定义是因程序而异的,不同的程序有其独特的定义,而且这种定义是唯一的,是必须在事先定义好的。

网络上的“协议”:

我们上网也是享受通信服务,其中的数据传输同样要受到某种协议的约定,这种协议的名字叫做:TCP/IP协议族。

今晚就不写了,累了,以后有时间再简单讨论(真的是“简单”的说,这玩意太复杂了,看书看的泪奔了,5555)

具体可以去参阅一本名叫《TCP/IP协议详解》的书

猜你喜欢

转载自263796001-qq-com.iteye.com/blog/1131457