欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通信__协议的那点事!!

程序员文章站 2022-06-26 18:13:23
...

我们的“协议”:

 

到目前为止,我们已经简单了解了通信的基本模型,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协议详解》的书