应用层
应用层和应用程序息息相关,不同的应用层想里面可能涉及到不同的应用层协议,作为码农很大一部分工作就是在自定义应用层协议。
自定义应用层协议
1、考虑客户端和服务器之间传输哪些信息
2、考虑传输的数据按照上面格式组织
客户端和服务器之间传输哪些信息
举栗子:
请求:
自行车,山地;偏好便宜,耐用,帅气。
请求中有两部分:商品信息和偏好信息,之间使用;来分割
商品信息和偏好信息内部各个部分使用,来分割
响应:
自行车品牌,价格,颜色,优惠
日本自行车,300,蓝色,-10
美国自行车,200,紫色,-5
欧洲自行车,350,黑色,-2
响应中包含多个上架信息,每个商品占一行,每行里面多个属性之间使用,来分割
这就是我约定的客户端和服务器之间传输哪些信息。
传输的数据格式
1、HTTP协议
2、XML
XML比较典型的数据组织格式,经典古老的格式。
特点:通过“标签”的形式来组织键值对数据。标签名字就是key,内容是value
例如:
<request>
<goods>
<name>自行车</name>
<name2>山地</name2>
</goods>
<preference>
<preference>价格</preference>
<preference>颜色</preference>
<preference>优惠<preference></preference>
</preferences>
缺点:
1、代码丑
2、数据多了编写复杂
3、这些数据要通过网络传输,消耗网络带宽由于这里包含了大量的标签,就导致网络带宽占用的更高。
3、JSON
JSON是当前最流行的一种数据组织格式,相当于XML的替代品。
{
goods:{
name:自行车
name2:山地
},
preference:[
'价格','颜色','优惠'
]
}
JSON:
使用{},{}里面包含了多组键值对,键值对之间使用,来分割,键和之之间使用:分割
键只能是字符串类型
值可以是字符串,数字,数组([ ]就代表数组)优点:
1、可读性非常好
2、看起来美观整洁
3、扩展性强
缺点:
引入额外的字符串,传输数据流变大,消耗更多的带宽
4、protobuffer
占用带宽低,高校组织数据。
封装/分用 vs 序列化/反序列化
一般来说,在网络数据传输中,发送端应用程序,发送数据时的数据转换(如java一般就是将对象转换为某种协议格式),即对发送数据时的数据包装动作来说:
如果是使用知名协议,这个动作也称为封装
如果是使用小众协议(包括自定义协议),这个动作也称为序列化,一般是将程序中的对象转换为特定的数据格式。
接收端应用程序,接收数据时的数据转换,即对接收数据时的数据解析动作来说:
如果是使用知名协议,这个动作也称为分用
如果是使用小众协议(包括自定义协议),这个动作也称为反序列化,一般是基于接收数据特定的格式,转换为程序中的对象