应用层:应用程序之间的数据沟通。
因为应用程序是程序员自己写的,所以应用程序之间的协议是程序员自己定义的。
tcp/ip协议栈中典型协议
一、自定制协议(HTTP)
1、定义
自己约定一个应用程序之间的数据格式。
2、如何定制
结构体二进制序列化:使用结构体来组织数据格式(跨平台-字节对齐)
其他典型序列化方式:json,protobuf(了解)
- 序列化:按照指定的数据格式将多个数据对象组织成为可以持久化存储或者数据传输的二进制数据串
- 反序列化:按指定格式将二进制数据串解析得到多个数据对象
网络版计算机:
客户端将需要运算的俩个数字以及一个运算符发送给服务器,服务器运算完毕后,将结果返回给客户端。
需要考虑的要素:
- 组织&解析效率
- 传输效率
二、典型协议:HTTP协议
1、定义
HTTP:实际上就是一个tcp服务器,只不过上层数据格式用的是http的协议格式
- 超文本传输协议
- 应用层协议,在传输层使用的是TCP协议
- 明文传输协议(以字符串形式组织指定格式数据传输)
- 是一个简单的请求-响应协议
三、请求格式(HTTP协议格式)
- 首行(请求行):请求方法URL协议版本\r\n
- 请求头部:由一个个key: val\r\n形式的键值对组成
- 空行:\r\n,是头部与正文之间的间隔
- 正文:提交给服务器的数据
1.首行
请求方法:直观表示请求类型
GET:主要用于从服务器中获取实体资源,没有正文,可以提交数据,但是提交的数据是放在URL中的,不安全也有长度限制。
POST:主要用于向服务器提交数据,数据放在正文中。
HEAD:与GET功能类似,但是响应中不要实体数据,只要头部。
2.具体格式
URL:统一资源定位符——统称网址。
定位网络中的某个主机上的某个资源,并且定义如何请求。
协议方案名称://用户名:密码@域名:端口/资源路径?查询字符串#片段标识符
http://user:pass@ip:port/part?query_string#id
http:协议方案名称
user:pass:用户名和密码
www.baidu.com:域名,服务器别名(是一个方便记忆的名字)
port:端口(HTTP协议默认使用80端口)
/part:资源路径/index.html——相对根目录
3.查询字符串
query_string:查询字符串,由key = val & key = val形式键值对组成,是客户端提交给服务器的数据。一旦提交的数据中有特殊字符,则会和http协议中的间隔符产生歧义,因此查询字符串中不能有特殊字符。因此如果提交的数据中有特殊字符串就需要URL编码。
- urlencode:编码-将一个特殊字符每一个字节转换为16进制字符,如‘+’->2B,并且前缀%用于表示这是经过转码后的数据‘+’->“%2B”。
- urldecode:当在URL中遇到%字符,则认为紧随其后的俩个字符需要解码的,将第一个16进制字符转换为数字*16+第二个字符转换后的数据:%2B->2*16+11=43
4.id
片段标识符,是超文本数据中的一个标签id
可以定位到id的位置访问页面时直接到id的位置
3、协议版本
0.9——1.0——1.1——2.0
- 0.9:并不是一个完善的版本
- 1.0:主要针对0.9版本完善了协议格式,订立了各种请求方法
- 1.1:主要针对1.0版本进行了一些性能优化
- 2.0:使用二进制传输,有了更多的性能优化
1. 1.1的优化
- 缓存控制:资源在本地或者在代理服务器上的缓存管理大大提高了资源的重新获取效率
- 连接方式为长连接(1.0版本开始的时候http协议是短连接)
- 短连接:建立连接,发送请求,接收响应,关闭连接,通信结束
- 长连接:在一次连接中,可以多次请求-响应
- 管线化:不要等待上次请求收到响应后再去发送下一个请求,可以连续请求
- 多路复用&主动推送:一次请求的响应中 可以推送多个资源,并且可以连续请求,响应中带有对应请求标识,不需要按序响应——解决了队头堵塞,以及避免重复头部字段的传输
4、头部字段
请求头部: Accept,Referer,Cookie
正文头部:Content-Length,Content-Type
响应头部:
通用头部:Contention:keep-alive,close
5、空行
\r\n与最后一个头部字段结尾的\r\n组成连续的\r\n\r\n,构成头部结尾标志。
http客户端或者服务器在接收数据的时候就是以此为标志先取出完整头部信息然后解析头部,得到各个字段,根据头部字段中的Content-Length确定正文长度,然后再取出指定长度的正文,本次请求或响应截止。
四、响应格式
- 首行:协议版本,响应状态码,状态码描述,直观表示处理结果
- 头部:key:val\r\n形式的键值对,对于响应以及正文的一些描述
- 空行:\r\n间隔头部与正文
- 协议版本:0.9/1.0/1.1/2.0
- 响应状态码:直观表示处理结果
2、头部字段:key:val\r\n
1.Cookie机制
Location:保存新链接,搭配3xx实现重定向
响应头部:Set-Cookie
请求头部:Cookie
合起来实现了HTTP的Cookie机制
- 发起一个用户登录请求,服务器进行登录验证,登录成功后,将用户名以及状态信息作为Set-Cookie字段的值,发送给客户端
- 客户端浏览器就会把Set-Cookie中的数据保存到Cookie文件中
- 在客户端下次请求指定服务器的时候,从Cookie文件读取出Cookie内容,然后通过Cookie字段发送给服务器
Cookie机制:客户端将服务器返回的一些Cookie信息保存起来,在下次请求服务器的时候发送给服务器,以此维护客户端的通信状态。
2.Cookie机制隐患(session会话管理)
因为在不断的将客户端的隐私信息进行传输。
session会话管理:
客户端登录成功后,服务器会为每一个客户端创建一个会话,其中包含了客户端的各项信息,然后将会话session信息保存到服务器的数据库中,将会话ID作为Cookie内容发送给客户端。
客户端在下次请求服务器的时候就会把会话ID发送给服务器,服务器通过会话ID查找会话信息,进而获取到客户端的各个状态信息。
3.Cookie和session的区别
- Cookie是将信息保存在客户端本地,每次请求的时候将信息发送给服务器,存在一定的隐患。
- session是将客户端状态信息保存在服务器,通信的时候以session_id作为Cookie进行传递,安全性较高。
4.token(了解)
5、响应状态码
1xx:一些协议切换协商的描述;101-协议切换
2xx:请求成功处理;200-成功
3xx:重定向——当一个资源的URL发送改变,但是依然保存原链接依然可以用,与Location头部字段搭配使用,返回新URL链接;301-永久&302-临时
4xx:表示客户端错误;404&400
5xx:表示服务端错误;500&502-失败&504-超时
状态码描述:对于状态码的一个简单文字描述。