HTTP协议
一、定义
-
超文本传输协议
-
基于请求与响应
-
无状态、无连接
-
提供一种发送和接受HTML页面的方法
无状态:
HTTP协议 自身不对请求和响应之间的通信状态进行保存
使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产 生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成 如此简单的。可是,随着Web的不断发展,因无状态而导致业务处理变得棘手 的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的 其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能 够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。
无连接:
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间,并且可以提高并发性能,不能和每个用户建立长久的连接,请求一次相应一次,服务端和客户端就中断了。但是无连接有两种方式,早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数,因为建立连接也是耗时的,默认的好像是3秒中,现在,但是这个时间是可以通过咱们后端的代码来调整的,自己网站根据自己网站用户的行为来分析统计出一个最优的等待时间。 (对应字段为keepalive)
二、版本
HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开
HTTP/1.1,发送请求,创建一次连接,获得多个web资源,连接断开
三、HTTP工作流程
HTTP 请求/响应的步骤:
1 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
2 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头、部、空行和响应数据 4部分组成。
4 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5.客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;(捎带)
- 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 释放 TCP连接;
- 浏览器将该 html 文本并显示内容;
四、报文格式
1 请求报文格式
1.1 示例:请求报文由请求行、请求头、请求体构成
请求行:操作资源 动作,文件位置
请求头:通信规范,我可以接受的数据格式,媒体类型,我的浏览器类型,我发给你的数据是什么格式的
请求体:post方法有请求体
报文构成:请求行 请求头 空行 请求体
1.2 请求行:请求方法+资源路径+协议版本
例如:POST /chapter17/user.html HTTP/1.1
请求行必须在http请求格式的第一行。
请求方法:
(1)get请求
请求参数追加在url后面,不安全,url长度限制get请求方式数据的大小,没有请求体,一般的HTTP请求大多都是GET。常用于请求服务器上的资源文件。
(2)post请求
请求参数在请求体处,较安全,请求数据大小没有限制,只有表单设置为method=“post”才是post请求,其他都是get请求。常用于用户提交输入(如注册、登陆)
(3)head请求
HEAD跟GET相似,不过服务端接收到HEAD请求时只返回响应头,不发送响应内容。所以,如果只需要查看某个页面的状态时,用HEAD更高效,因为省去了传输页面内容的时间。
(4)delete 请求
删除某一个资源。
(5)OPTIONS请求
用于获取当前URL所支持的方法。若请求成功,会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
(6)PUT请求
把一个资源存放在指定的位置上
PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。
(7)TRACE请求
回显服务器收到的请求,主要用于测试或诊断
(8)CONNECT请求
CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。
资源路径URL:
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
- 传送协议。
- 层级URL标记符号(为[//],固定不变)
- 访问资源需要的凭证信息(可省略)
- 服务器。(通常为域名,有时为IP地址)
- 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)
- 路径。(以“/”字符区别路径中的每一个目录名称)
- 查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
- 片段。以“#”字符为起点
以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例, 其中:
http,是协议;
www.luffycity.com,是服务器;
80,是服务器上的默认网络端口号,默认不显示;
/news/index.html,是路径(URI:直接定位到对应的资源);
?id=250&page=1,是查询。
1.3 请求头:
Host:请求资源的主机和端口号
Accept:通过accept属性告诉服务器 客户端可以接受什么类型的响应。 如: Accept:text/plain
Accept-Charset:浏览器采用的是哪种编码
Accept-Encoding:浏览器支持解码的数据压缩格式
Cookie:客户端通过Cookie传给服务端
Referer:表示这个请求是从哪个url过来的(上一个 页面)
User-Agent:浏览器的具体类型
Cache-Control:对缓存进行控制
connection:连接的管理 keep-connection 或 close
DATE:创建报文的日期时间
1.4 请求体:
当请求方式是post的时,请求体会有请求的参数,格式如下:
username=zhangsan&password=123
POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 20
name=城市&status=1
2 响应报文格式
2.1示例:响应行+响应头+响应体
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E1352C5CCEAD7EA9A6F8DA253395781C; Path=/vk
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 26 Sep 2018 03:24:59 GMT
//此处为空行
1dd0
{"sessionToken":null,"code":"1","msg":null,"service":"iModelServiceImpl"}
0
2.2 响应行:报文协议及版本 + 状态码
①报文协议及版本;
例如:
HTTP/1.1 200 OK
②状态码及状态描述;
状态码:由3位数字组成,第一个数字定义了响应的类别
信息性状态码:100~199
成功状态码:200~299
重定向状态码:300~399
客户端错误状态码:400~499
服务端错误状态码:500~599
一些具体的状态码:
200 OK | 请求被正常处理并返回 |
---|---|
204 No Content | 请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回) |
206 Patial Content | 客户端进行了范围请求 ,响应报文中包含由Content-Range指定范围的实体内容 |
301 Moved Permanently | 永久性重定向 |
302 Found | 临时性重定向 |
304 Not Modified | 命中浏览器缓存 |
400 Bad Request | 表示请求报文中存在语法错误 |
401 Unauthorized | 未经许可,需要通过HTTP认证 |
403 Forbidden | 服务器拒绝该次访问(访问权限出现问题) |
404 Not Found | 服务器上无法找到请求的资源 |
500 Inter Server Error | 服务器在执行请求时发生了错误 |
503 Server Unavailable | 服务器暂时处于超负载或正在进行停机维护,无法处理请求 |
304 状态码详解
命中浏览器缓存
2.3响应头:
server:服务器所使用的Web服务器名称
Allow:通知客户端能够支持的HTTP方法
Content-Location:给出与报文主体部分相对于实际的URL
Location:引导用户转向与请求URL不同的资源301 302
ETag:代表响应服务端资源版本的报文头属性
Content-Type:响应正文的类型
Set-Cookie:服务端可以设置客户端的Cookie
Cache-Control:对缓存进行控制
connection:连接的管理
DATE:创建报文的日期时间**
2.4响应体:
http响应的数据内容