应用层
有许多现成的协议(HTTP协议做网站必备),也有许多需要程序员自定义的协议.
1.自定义协议
自定义协议:
1.明确传递的信息是什么
2.约定好信息按照什么样的格式来组织成二进制字符串
举个例子:
当我们点外卖时,打开软件,会显示商家列表,列表中有很多项,每一项都包含了一些信息.商家的名称,图片,好评率......这些信息是通过网络,从服务器获取的.
- 客户端,需要给服务器发起一个请求,服务器收到请求之后,就给客户端返回一个相应.
- 外卖软件和服务器之间的沟通,有很多方式,显示商家列表,只是其中一个.因此,在开发设计这个程序的时候,就需要做好良好的规划.
- 这里的设计是非常灵活的,最主要的是有一个固定的标准...
1.1 示例一
实际上,上诉这样的格式约定,可以任意进行约定.只要保证,客户端和服务器遵守同一个约定即可.
1.2 示例二
1.3 示例三
上诉可以看到:
请求和响应,具体的数据组织形式,是非常灵活的,怎么组织都行,只有保证客户端和服务器这边使用的是相同的规则即可.
不同的应用程序,使用的自定义协议是不同的.
2.几个通用的协议格式
2.1 xml
是以成对的标签,来表示"键值对"信息,同时标签支持嵌套,就可以构成一些更复杂的树形结构数据.
优点:xml'非常清晰的把结构化数据表示出来了.
缺点:表示数据需要引入大量的标签,看起来繁琐,同时也会占用不少的网络带宽.
2.2 json
- 本质上也是键值对.
- 使用{ }来表示键值对,使用[ ]来表示数组.
- 数组里的每个元素,可以是数字,字符串,也可以是其它的{ }或[ ].
- json对于换行并不敏感,如果这些内容全都放在同一行,也是完全合法的.
- 一般网络传输的时候,会对json进行压缩(去掉不必要的换行和空格),同时把所有的数据都放到一行去,整体占用的带宽就降低了.(影响可读性).
优点:相比于xml,表示的数据简洁很多,可读性非常好,方便程序员观察中间结果,方便调试问题.
缺点: 需要花费一定的带宽来传输key的名字.
2.3 protobuffer
- 一种二进制的数据序列化方式.
- 使用二进制的方式,约定某几个字节,表示哪个属性.
- 最大程度的节省空间(不必传输key,根据位置和长度,区分每个属性).
- 适用于对于性能要求更高的场景.牺牲了开发效率,换来了运行效率.
优点:节省带宽,最大化效率.
缺点:二进制数据,无法直接肉眼观察,不方便调试.使用起来比较复杂.
问:
对于一个程序来说,是开发效率(写代码快不快)重要,还是运行效率重要(程序跑的快不快)?
答:开发效率更重要!
要想提升运行效率,可以通过升级硬件.
要想提高开发效率,就得招聘更多的程序员.人力成本!!!