HTTP协议格式详解
上一篇介绍了 HTTP 协议的版本迭代历史,本篇继续深入介绍一下 HTTP 协议的规范,本文主要介绍它的 URI 、 Request 、 Response 、状态码等等信息,通过了解这些具体的内容,可以更直观的理解 HTTP 的协议格式,以及工作原理。
HTTP 使用统一资源标识符( URI )来传输数据和建立连接。 URL (统一资源定位符)是一种特殊种类的 URI ,包含了用于查找的资源的足够的信息,我们一般常用的就是 URL ,而一个完整的 URL 包含下面几部分:
http://www.fishbay.cn:80/mix/76.html?name=kelvin&password=123456#first
该 URL 的协议部分为 http: ,表示网页用的是 HTTP 协议,后面的 // 为分隔符
域名是 www.fishbay.cn ,发送请求时,需要向 DNS 服务器解析 IP 。如果为了优化请求,可以直接用 IP 作为域名部分使用
域名后面的 80 表示端口,和域名之间用 : 分隔,端口不是一个 URL 的必须的部分。如果端口是 80 ,也可以省略不写
从域名的第一个 / 开始到最后一个 / 为止,是虚拟目录的部分。其中,虚拟目录也不是 URL 必须的部分,本例中的虚拟目录是 /mix/
从域名最后一个 / 开始到 ? 为止,是文件名部分;如果没有 ? ,则是从域名最后一个 / 开始到 # 为止,是文件名部分;如果没有 ? 和 # ,那么就从域名的最后一个 / 从开始到结束,都是文件名部分。本例中的文件名是 76.html ,文件名也不是一个 URL 的必须部分,如果没有文件名,则使用默认文件名
从 # 开始到最后,都是锚部分。本部分的锚部分是 first ,锚也不是一个 URL 必须的部分
从 ? 开始到 # 为止之间的部分是参数部分,又称为搜索部分、查询部分。本例中的参数是 name=kelvin&password=123456 ,如果有多个参数,各个参数之间用 & 作为分隔符。
HTTP的请求包括:请求行(request line)、请求头部(header)、空行 和 请求数据 四个部分组成。
抓包的 request 结构如下:
GET 为请求类型, /mix/76.html?name=kelvin&password=123456 为要访问的资源, HTTP/1.1 是协议版本
从第二行起为请求头部, Host 指出请求的目的地(主机域名); User-Agent 是客户端的信息,它是检测浏览器类型的重要信息,由浏览器定义,并且在每个请求中自动发送。
请求头后面必须有一个空行
请求的数据也叫请求体,可以添加任意的其它数据。这个例子的请求体为空。
一般情况下,服务器收到客户端的请求后,就会有一个 HTTP 的响应消息,HTTP响应也由 4 部分组成,分别是:状态行、响应头、空行 和 响应体。
抓包的数据如下:
状态行由协议版本号、状态码、状态消息组成
响应头是客户端可以使用的一些信息,如: Date (生成响应的日期)、 Content-Type (MIME类型及编码格式)、 Connection (默认是长连接)等等
响应头和响应体之间必须有一个空行
响应正文,本例中是键值对信息
HTTP 协议的状态码由 3 位数字组成,第一个数字定义了响应的类别,共有 5 中类别:
其中,常用的状态码如下:
如需了解更多的状态码,请参考这个网址: HTTP状态码
HTTP 定义了多种请求方法,来满足各种需求。 HTTP/1.0 定义了三种请求方法: GET 、 POST 和 HEAD ,到了 HTTP/1.1 ,新增了五种请求方法: OPTIONS 、 PUT 、 DELETE 、 TRACE 和 CONNECT 。各个请求方法的具体功能如下:
实际应用过程中, GET 和 POST 使用的比较多,下面主要介绍一下二者的区别:
GET 请求会把请求的参数拼接在 URL 后面,以 ? 分隔,多个参数之间用 & 连接;如果是英文或数字,原样发送,如果是空格或中文,则用 Base64 编码
POST 请求会把提交的数据放在请求体中,不会在 URL 中显示出来
GET : 浏览器和服务器会限制 URL 的长度,所以传输的数据有限,一般是 2K
POST : 由于数据不是通过 URL 传递,所以一般可以传输较大量的数据
GET : 通过 Request.QueryString 获取变量的值
POST : 通过 Request.form 获取变量的值
GET : 请求参数在 URL 后面,可以直接看到,尤其是登录时,如果登录界面被浏览器缓存,其他人就可以通过查看历史记录,拿到账户和密码
POST : 请求参数在请求体里面传输,无法直接拿到,相对 GET 安全性较高;但是通过抓包工具,还是可以看到请求参数的
HTTP 协议采用请求/响应模式,客户端向服务器发送一个请求报文,然后服务器响应请求。下面介绍一下一次 HTTP 请求的过程:
HTTPS 是安全的 HTTP 通道,即在HTTP通信中加入了 SSL 层(当前版本是 TLS1.2 ),通信的数据被加密了,防止被窃取,具体的通信流程如下:
HTTPS使用的加密方式结合了对称加密和不对称加密的特点,在保证安全的情况下,又提高了传输效率。HTTP和HTTPS的区别如下:
参考资料
http://www.jianshu.com/p/a01e5b4b64ec
http://www.jianshu.com/p/a6d04501ed6d