1. 概念
在前面的文章,我们知道TCP/IP四层模型中,下三层是主要负责数据的传输处理,但是没有涉及到解析,关于解析主要由应用层来处理。
HTTP协议是应用层协议,是一个属于应用层的面向对象的协议,由于其间接,快速的方式,适用于分布式超媒体信息系统.
1.1 HTTP协议的主要特点
- 支持客户、服务器模式。
- 简单快速。
客户面向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有:GET,HEAD,POST。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度快。 - 灵活。
HTTP允许传输任意类型的数据对象,正在传输的类型需要加上Content-Type加以标记 。 - 无连接。
无连接的含义是每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,及立即断开链接。采用这种方式可以节约很多时间。 - 无状态。
HTTP协议是无状态协议,无状态是指协议对于事物处理没有记忆能力,缺少状态以为如果后序处理前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时它的应答就较快。
2. 认识URL
2.1 URL就是我们俗称的网址
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
URL的一般语法格式为:(带方括号[]的为可选项)
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
注:protocol(协议)、hostname(主机名)、port(端口号)、path(路径)、parameters(参数)、query(查询)、fragment(信息片断)
eg:
2.2 urlencode和urldecode
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了。因此这些字符不能随意出现。
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式 。
urldecode就是urlencode的逆过程。
3. HTTP协议之请求
http请求由四部分组成:
请求行,消息报头,空行,请求正文
3.1 请求行
首行: [方法] + [url] + [版本]
如:
Method Request-URI HTPP-Version CRLF
其中:
Method 表示请求方法;
Reques-URI(我们可以把这个整体看成URL)是一个同一资源定位符;
HTTP-Version表示请求的HTTP协议版本;
CRLF表示回车和换行。
HTTP有很多请求方法,最常用的是GET方法和POST方法,但我们有必要了解一下其它的方法:
我们可以这样理解:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
3.2 Header
请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔
3.3 空行
遇到空行表示Header部分结束
3.4 Body
空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度。
4. HTTP协议之响应
HTTP响应也是四个部分组成:
分别是:
状态行,消息报头,空行,响应正文.
4.1 状态码
首行: [版本号] + [状态码] + [状态码解释]
如:
HTTP-Version Status-Code Reason-Phrase CRLF
其中:
HTTP-Version表示服务器HTTP版本信息;
Status-Code表示服务器发回响应状态代码;
Reason-Phrase表示状态代码的文本描述。
状态代码由三种数字组成,第一个数字定义了响应的类别,有五种可能取值:
了解一下常见的状态码:
含义 | ||
---|---|---|
200 | OK | 客户请求成功 |
400 | Bad Request | 客户端请求由语法错误,nunnery被服务器所理解 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 | Not Found | 请求资源不存在,eg:输入了错误的URL |
500 | Internal Server Error | 服务器发生不可预期的错误 |
503 | Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常 |
eg:HTTP/1.1 200 OK (CRLF)
4.2 Header
Header: 请求的属性, 冒号分割的键值对;每组属性之间使⽤\n分隔;
4.3 空行
遇到空行表示Header部分结束
4.4 Body
空行后面的内容都是Body.
Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度; 如果服务器返回了⼀一个html页面, 那么html页面内容就是在 body中。