目录
一、什么是HTTP协议
1. http基本概念:
- 超文本传输协议,通常运行在TCP之上,是应用层协议,规定WWW服务器与浏览器之间信息传递规范。
2.工作原理:HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
- (1)客户与服务器建立连接;
- (2)客户向服务器提出请求;
- (3)服务器接受请求,并根据请求返回相应的文件作为应答;
- (4)客户与服务器关闭连接。
3. 我们平时所说的网址,实际上就是URL(统一资源定位符)
- URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
- 也可认为由4部分组成:协议、主机、端口、路径
4. urlencode和urldecode
(1)UrlEncode
- 将字符串以URL编码
- 返回值:字符串
- 函数种类:编码处理
- 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
(2)UrlDecode
- 对字符串进行URL解码
- 返回值:已解码的字符串
- 函数种类:编码处理
- 数字和字母不变,空格变为"+"号,其他被编码成"%"加上他们的ASCII的十六进制。
- UrlDecode是UrlEncode的逆过程
二、HTTP协议格式
1. 请求格式
- 请求行:包括 方法+URL+版本
- Header:包括请求的属性,是由冒号分割的键值对,每组属性用\n分割,遇到 空行 说明Header结束
- Body:空行之后都是Body的内容,Body允许是空字符串,如果不为空,那么在Header中会有一个Content Length属性说明Body的长度
2.响应格式
- 响应状态行:包括 版本号+状态码+状态码解释、
- Header:包括请求的属性,是由冒号分割的键值对,每组属性用\n分割,遇到 空行 说明Header结束
- Body:空行之后都是Body的内容,Body允许是空字符串,如果不为空,那么在Header中会有一个Content 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 |
UNLINE | 断开联系关系 | 1.0 |
这些方法中,最常用的就是get和post,下面将对这两种方法进行对比:
get | post | |
对数据长度的限制 | 有限制,当发送数据时,get方法向URL 添加数据, 但是URL的长度是受限制的(URL最大长度为2048个字符) | 无限制 |
安全性 | 安全性较差,不如post,因为它发送的数据是URL的一部分 (发送密码或者其他敏感信息,一定不能用get!!!) | post更安全,相比get来说,因为参数不会被保存在 浏览器历史或web服务器日志中 |
可见性 | 数据在URL中,对所有人均可见 | 数据不会显示在URL中 |
位置 | 默认放在URL请求参数中 | 请求参数可以放在URL请求参数或请求体参数中 |
四、HTTP的状态码
类别 | 原因 | |
1XX | Inofrmational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
列举一些常见的状态码:
- 200:请求成功。(其后是对GET和POST请求的应答文档)
- 301/302/307:重定向,所请求的页面已经转移至新的url。
- 400:客户端错误,一般是客户端的请求数据错误(数据格式或数据类型错误)。
- 404:找不到资源,服务器无法找到被请求的页面。
- 405:不支持的客户端请求方法,请求中指定的方法不被允许。
- 500:服务器错误,一般是服务器后端的代码出错(抛出异常)。
- 502:网关错误,服务器从上游服务器收到一个无效的响应。
五、HTTP常见的Header报头
Content-Type: 数据类型(text/html等) | 响应报头 |
Content-Length: Body的长度 | 请求报头和响应报头 |
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上; | 请求报头 |
User-Agent: 声明用户的操作系统和浏览器版本信息; | 请求报头 |
referer: 当前页面是从哪个页面跳转过来的; | 请求报头 |
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问; | 响应报头 |
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能; | 请求报头和响应报头 |
六、抓包工具
- Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据。下面简单的截图抓包到的数据。
- 浏览器自带的开发者工具进行抓包
七、其他补充
1. HTTP版本(HTTP1.0和HTTP1.1的区别)
- 时间不同。HTTP1.0最早使用是1996年;HTTP1.1在1999年才广泛应用。
- 缓存处理。HTTP1.0使用header中的If-Modified-Since和Expires作为缓存判断的标准;HTTP1.1则引入了更多的缓存控制策略,比如:Entity tag、If-Unmodified-Since、If-Match等更多可供选择的缓存头来控制缓存策略。
- 带宽优化及网络连接的使用。HTTP1.0存在带宽浪费情况,不支持断点续传功能;HTTP1.1在请求头中加入range头域,它允许只请求资源的某个部分,即返回码是206,这样方便开发者自由选择充分利用带宽和连接。
- 错误通知的管理。HTTP1.1中新添了24个错误状态响应码。
- Host头处理。HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此URL中没有传递主机名,随着虚拟主机技术发展,一个物理机上可以有多个不同的虚拟主机,且共享一个IP地址;HTTP1.1的请求和响应信息都支持Host头域,且请求消息中不存在的话就会报错404。
- 长连接。HTTP1.1支持长连接,在一个TCP连接上可以传递多个HTTP请求和响应,减少了建立和关闭连接的消耗与延迟,且默认开启Connection:keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点。
2. HTTP和HTTPS的区别
- HTTPS协议需要申请CA证书。
- HTTPS可以有效地防止运营商劫持,解决了防劫持的问题。
- HTTP运行在TCP之上,所有传输的内容都是明文;HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP上,所有传输内容都是加密的。
- HTTP用的端口是80;HTTPS用的端口是443;两者用的是完全不同的连接方式。
3. 市场上常见的Http服务器
- Tomcat(web 应用服务器)
- Nginx
- Apache
- Lighttpd