应用层功能:负责应用程序之间的数据沟通。
HTTP协议(超文本传输协议)
1.序列化:将数据或对象按照协议转换成二进制数据持久化存储或者对数据传输进行组织。
反序列化:将二进制数据串按照协议进行解析转换成结构化的数据或者对象。
2.URL(统一资源定位符,俗称网址)
由上面可以看出URL中存在特殊字符,如:/ 、? 、#等,所以在查询字符串中(就是用户提交给服务端程序的数据),不能带有特殊字符,不然会与URL中的分隔符产生歧义导致服务端解析错误,所以如果有特殊字符需要对其进行URL编码。
URL编码:将特殊字符换成十六进制数,前面用‘%’标识。
URL解码:当看到前面有‘%’时,就知道其后面的数需要解码,将十六进制数转换成字符。
3.HTTP协议格式
请求部分
由三大部分组成,(有时候将中间的空行也算一部分,就是四部分):
(1).请求首行:请求方法 + url + 协议版本
(2).Header:请求属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
(3).Body:空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Conten-Length的键值对来标识Body部分数据长度。
响应部分
同样由三大部分组成,(有时候将中间的空行也算一部分,就是四部分):
(1).响应首行:版本号 + 状态码 + 状态码解释
(2).Header:和请求部分一样,都是冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
(3).Body:空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Conten-Length的键值对来标识Body部分数据长度,如果服务器返回一个html页面,那么html页面内容就是在Body中。
HTTP的请求方法
请求方法 | 说明 | 支持的HTTP协议版本 |
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获取报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代理 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
ULINK | 断开连接关系 | 1.0 |
POST和GET都是既可以获取资源,也可以提交数据,但是POST是提交表单数据为主,而GET是获取资源为主,并且,POST提交的数据是在正文中,而GET提交的数据在URL的查寻字符串中。
HTTP的响应状态码
分类 | 分类描述 |
1XX | 信息,服务器收到请求,需要请求者继续执行操作 |
2XX | 成功,操作被成功接收并处理 |
3XX | 重定向,需要进一步的操作以完成请求 |
4XX | 客户端错误,请求包含语法错误或无法完成请求 |
5XX | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的几种响应状态码:
200:OK,请求成功;
301:重定向,永久移动;
302:重定向,临时移动;
403:服务器理解请求客户端的请求,但是拒绝执行此请求;
404:服务器无法根据客户端的请求找到资源(网页);
500:服务器内部错误,无法完成请求;
504:充当网关或代理的服务器,未及时从远端服务器获取请求.
Header:部分键值对说明
Content-Length:正文长度,当获取到两个连续的“\n \r”后就开始获取正文,如果不知道要获取的正文长度,由于TCP协议由粘包问题,就会把下一个数据的头部信息也获取了,导致错误。
Content-Type:正文类型,标记后就知道后面的正文应该以何种方式处理。
Location:重定向位置,搭配状态码3XX使用。
Cookie:用于在客户端存储少量信息,通常用于实现回话(session)功能。
Set-Cookie:设置HTTP的Cookie。
Referer:当前页面是从哪个页面跳转过来的。
Transfer-Encoding: chunked 标识分割传输。