一、简介
HTTP也叫超文本传输协议,是应用层协议,支持C/S模式,浏览器作为HTTP的客户端通过url向HTTP服务端,也就是WEB服务器发送请求。
http协议是无连接,无状态的。无连接指的是当服务器处理完客户端的请求,并收到客户的应答后,断开链接;无状态指的是对于事务处理没有记忆能力。
二、HTTP请求
http请求由四部分组成:
请求行,消息报头,空行,请求正文
1. 请求行
请求行由三部分组成:
方法+url+版本
其中请求方法有很多,具体如下表所示:
方法 | 含义 |
GET | 请求指定的页面信息,并返回实体主体 |
HEAD | 类似于get,但返回的响应中没有具体内容,用于获取报头 |
PUT | 从客户端向服务器端传递的数据取代指定文档的内容 |
DELETE | 请求服务器删除指定的页面 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),POST 请求可能会导致新的资源的建立或已有资源的修改 |
CONNECT | 要求将连接改为管道方式的代理服务器 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 请求服务器在响应中的实体主体中返回所收到的请求内容 |
PATCH | 对 PUT 方法的补充,用来对已知资源进行局部更新 |
eg1:请求资源
请求:
GET /index.html HTTP/1.1
HOST:www.xxxx
响应:返回www.xxxx/index.html的页面资源
eg2:传输实体
请求:
POST /index.cgi HTTP/1.1
Host:www.xxxx
Content-Length:1560
响应:
返回cgi程序接收数据的处理结果
eg3:传输文件
请求:
PUT /index.html HTTP/1.1
Host:www.xxxx
Content-Type:text/html
Content-Length:1560
eg4:获取报文首部
与get方法一样,只是不返回报文主体,一般用于确认URL的有效性及更新时间等
eg5:删除文件
请求:
DELETE /index.html HTTP/1.1
Host:www.xxxx
与put相反
eg6:询问服务器支持的方法
请求:
OPTIONS * HTTP/1.1
Host:www.xxxx
响应:
HTTP/1.1 200 OK
Allow:GET,POST,HEAD,OPTIONS
注:如果不是访问特定资源而是对服务器本身发起请求,可以用* 代替请求url
eg7:追踪路径
请求:
TRACE / HTTP/1.1
Host:www.xxxx
Max-Forward:2
响应:
HTTP/1.1 200 OK
Content-Type:message/http
Content-Length:1024
TRACE / HTTP/1.1
Host:www.xxxx
Max-Forward:2
注:Max-Forward值,每经过一个服务器就-1,当为0时停止继续传输,当前服务器返回状态码为200的响应。
eg8:用隧道协议连接代理
请求:
CONNECT index.html HTTP/1.1
Host:www.xxxx
自己的理解:
(1). 一个 url 地址,用于描述一个网络上的资源,而HTTP中常用的请求方法put,delete,get,post就对应着对这个资源的增、删、查、改4个操作。
(2). GET一般用于获取资源信息,而POST一般用于更新资源信息。还有一个区别是参数:不带参数时,区别就是第一行方法名不同;带参数时,GET 方法的参数应该放在 url 中(写在 ? 后面,用 & 分割),POST 方法参数应该放在 body 中。
2. 消息报头
指的是本次请求的属性,是用冒号分割的键值对;每组属性之间使用\n分隔。
常见的请求报头header字段:
字段 | 含义 |
Accept | 指定客户端接收哪些类型的信息。eg:text/html:希望接收html的文本文件 |
Accept-Encoding | 指定可接收的内容编码 |
Accept-Language | 用于指定接收的自然语言 |
Authorization | 用于证明客户端有权查看某个资源 |
Host | 用于指定被请求资源的Internet主机和端口号,即域名,一般从url中提取出来,默认端口是80,可以指定端口 |
User-Agent | 服务器可以从这个报头域中获取客户端的操作系统、浏览器和其它属性 |
refer | 告诉服务器客户是从哪个页面链接过来的 |
cookie
由于HTTP是无状态协议,但是为了实现期望的保持状态功能,引入了cookie技术。
3. 空行
用来区分报头与报文,遇到空行表示Header部分结束
4. 请求正文
空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度。
三、HTTP响应
HTTP响应也是四个部分组成:
分别是:状态行,消息报头,空行,响应正文.
1、状态行
状态行由三部分组成:
版本号+状态码+状态码解释
这里状态码分为很多种,解释如下:
状态代码由三种数字组成,第一个数字定义了响应的类别,有五种可能取值:
类别 | 解释 | |
1xx | Informational(信息性状态码) | 接受的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务端错误状态码) | 服务器处理请求出错 |
常见的状态码解释:
状态码 | 解释 |
200 | OK(客户请求成功) |
400 | Bad Request(客户端请求由于语法错误,不能被服务器所理解 ) |
403 | Forbidden(服务器收到请求,但是拒绝提供服务 ) |
404 | Not Found (请求资源不存在,eg:输入了错误的URL ) |
500 | Internal Server Error(服务器发生不可预期的错误 ) |
503 | Server Unavailable(服务器当前不能处理客户端的请求,一段时间后,可能恢复正常 ) |
2、Header
Header: 冒号分割的键值对;每组属性之间使用\n分隔
常见响应字段:
字段 | 解释 |
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机请求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体相关的信息。
字段 | 含义 |
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方法 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
3、空行
遇到空行表示Header部分结束
4、body
空行后面的内容都是Body.
Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中。
四、HTTP和HTTPS的区别
区别主要是在传输层加入了SSL(或TLS)。改变了HTTP协议的明文传输方式,保护了数据的安全性和完整性,提供对网站服务器的身份认证。
- HTTPS协议需要申请证书,一般免费证书很少,需要交费。
- http以明文的形式传输信息,https则是具有安全性的ssl加密传输协议
- HTTP和HTTPS使用的是完全不同的连接方式,用的端口不同,前者是80,后者是443
- HTTPS 在 HTTP 传输协议的基础上对网站进行认证,给予它独一无二的身份证明,再对网站数据进行加密,并对传输的数据进行完整性验证。