一、背景
1、通信协议应用广泛。
2、通信协议大多基于TCP传输层。
二、主要目的
设计基于TCP传输层协议的简单的高层网络协议。
三、通信内容设计
(一)传输什么内容
可以是二进制文件。
可以是文本文件。
(二)设计什么架构
1、有客户端和服务端的请求响应模式。
2、有全双工的发送模式。
3、有半双工的命令响应模式。
(三)怎么设计内容格式
1、有头部和负载数据两部分。
协议基本单元的格式如下:
1字节类别 2字节负载数据长度 指定长度的负载数据
2、头部的类别设计
类别占据1个字节,可以设置255个值。
参考如下:
10 代表数据。
20 代表执行结果提示。
30 代表请求命令。
40 代表主动关闭。
50 代表接收确认。
3、负载长度
占据2字节。
这2个字节的十进制整数值代表后面的多少个字节属于本次通信单元。
4、负载数据
用来传递各种信息,长度可以变化。
每次最多不超过65535个字节。
四、负载内容设计
(一)多行文本字符串
传输的是文本文件。
每一行的格式如下:
字符串序列\r\n
此处每一行用回车符和换行符结尾。
每一行字符串连续传输。
需要在前面的负载长度设置本次字符串占用的字节数。
(二)二进制文件的分批传输
1、如果能一次性传输,就可以放在一个单元里传输。
2、如果文件太大,就需要分块来连续传输。
每一个数据块都使用一个协议单元。
需要在负载长度设置后面数据块的字节个数。
(三)命令设计
1、字符串类型
每个命令用字符串来传递。
每个命令用回车符和换行符结尾。
格式如下:
命令名 空格 可选参数\r\n
命令名设计:
start 代表开始
stop 代表停止
close 代表关闭
open 代表打开
案例:
// 打开23号灯光
open 23 \r\n
2、二进制命令类型
每个命令用一个整数来代表。
命令的参数也用整数或者字符串来代表。
格式如下:
2字节命令整数值 10字节命令参数
命令代表的整数设计参考:
1 代表打开
2 代表关闭
3 代表调整亮度
4 代表增加速度
5 代表降低速度
实际上可以自定义设计命令的含义。
(四)执行结果或者请求结果
1、用状态码和描述字符来设计。
状态码是整数值,用来明确判断。
描述字符串可以用户自定义。
2、格式如下:
第一种:
状态码 空格 描述字符串序列 \r\n
都是采用字符串的格式。
第二种:
1字节状态码整数值 任意个数字符串的二进制序列 字节0
用值为0的字节来代表字符串的结尾。
第三种:
1字节状态码整数值 1字节字符串序列长度 字符串的二进制序列
在字符串序列的前面用1个字节来说明后面的字符串有多少个字节。
五、总结
1、需要在通信单元的前面指定信息。
2、需要定义一些整数值,规定含义。
3、需要用数字来通知后面负载数据的长度。
4、需要用一些办法来分清楚本次数据的开始位置和结束位置。
5、需要约定一下通信结果的格式。
6、通信最可怕的是顺序出错,或者有漏洞,或者失去连接。