HTTP协议历史演变
Hypertext Transfer Protocol,超文本传输协议。
规定了浏览器和万维网服务器之间相互通信的规则。
是客户端和服务器之间请求和应答的标准。
HTTP是基于TCP/IP协议的应用层协议,无状态,默认使用80端口。
HTTP/0.9
这是最早的版本。
- 只有一个 GET 命令。
- 服务器只能回应HTML格式的字符串,不能回应别的格式。
请求格式:
GET /index.html
表示TCP连接建立后,客户端向服务器请求网页index.html。
HTTP/1.0
- 命令增加了 POST 和 HEAD。
- 可以传输任何形式的内容,包括图像、视频等。
- 新增状态码、缓存、内容编码等功能。
请求格式:
GET /HTTP/1.0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: */*
第一行是请求命令,必须在尾部添加协议版本
响应格式:
协议版本 状态码 状态描述
头信息
数据
头信息与数据中间的空行是本身就有的。
HTTP/1.1
- 引入了持久连接。TCP连接默认不关闭,可被多个请求复用,不需要声明
Connection:keep-alive
;客户端与服务器发现对方一段时间无活动,就可以主动关闭连接;最好在客户端最后一个请求时,发送Connection:close
,明确要求服务器关闭TCP连接。 - 引入了管道机制。在同一个TCP连接中,客户端可以同时发送多个请求,而不需要等待上一个请求被回应之后再发送新的请求。但是服务器还是按请求的先后顺序回应请求。
- 增加了动词方法
PUT
、PATH
、HEAD
、OPTIONS
、DELETE
。 - 客户端请求头增加了
Host
字段,制定服务器的域名。 - 头信息是文本(ASCII编码),数据体既可以是文本也可以是二进制。
这个版本的目前还是很流行的。
HTTP/2
头信息和数据体都是二进制,统称为“帧”。
-
多工
数据包不按顺序发送,同一个连接里连续的数据包可能属于不同的响应。每个请求或响应的所有数据包称为一个数据流
HTTP/2通过发送信号
RST_STREAM帧
取消数据流,不需要关闭TCP连接。将头信息使用
gzip
或compress
压缩后发送,客户端与服务器同时维护一张头信息表,通过发送索引号,来提高请求速度。
URL
Universal Resource Locator,统一资源定位符,即网页地址、因特网上标注的资源的地址。
一般形式:
<URL访问形式>://<主机>:<端口>/<路径>
例如: http://asdf.com:80/index.html
URL访问方式: ftp、http、news
主机: 网站的域名、IP地址(必须有)
端口: http固定端口为80(可省)
路径: 资源的位置(可省)
请求
一般格式:
请求行
请求方法:
GET:
读取由URL所标识的信息;
POST:
给服务器添加信息;
OPTION:
请求一些选项的信息;
HEAD:
请求读取URL所标识信息的首部;
PUT:
在指明的URL下存储一个文档;
DELETE:
删除指名的URL所标志的资源;
TRACE:
用来进行环回测试的请求报文;
CONNECT:
用于代理服务器。
URL字段: 路径,若URL中未给出路径,则当它作为请求URL时,必须以“/”的形式给出,通常这个工作浏览器自动完成。
版本: 目前HTTP协议用得最多的是1.1版本。
请求头部
由关键字/值对组成,每行一对,关键字和值用英文冒号分割。请求头部通知服务器有关客户端请求的信息。
空行: 发送回车符和换行符,通知服务器一下不再有请求头。
常用请求头 | 含义 |
---|---|
Accept | 指定客户端接受哪些类型的信息 |
Accept-Encoding | 指定可接受的内容编码 |
Accept-Language | 指定一种自然语言 |
Host | 指定被请求资源的Internet主机和端口号 |
User-Agent | 允许客户端将它的操作系统、浏览器和其它属性告诉服务器 |
Referer | 上一个网页的URL |
示例:
请求数据
不在GET方法中使用,在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
响应
一般格式:
状态行
版本: 常用HTTP/1.1版本
状态码: 由三位数字组成
五种可能取值:
取值 | 含义 |
---|---|
1xx | 保留 |
2xx | 表示请求成功地接受 |
3xx | 要完成请求必须进一步细化请求 |
4xx | 客户错误 |
5xx | 服务器错误 |
常见状态描述短语 | 含义 |
---|---|
200 OK | 客户端请求成功 |
400 Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 Unauthorized | 请求未经授权 |
403 Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 Not Found | 请求资源不存在 |
500 Internal Server Error | 服务器发生不可预期的错误 |
503 Sever Unavailable | 服务器当前不能处理客户端的请求 |
首部行
包含了服务器和报文主题的信息。
空行
最后一个响应头之后是一个空行,发送回车符和换行符,通知客户端以下是报文实体。
响应数据
包含了用户要得到的数据或是错误信息。
常用响应头 | 含义 |
---|---|
Location | 重定向接收者到一个新的位置 |
Server | 包含服务器用于处理请求的软件信息 |
WWW-Authenticate | 必须被包含在401(未授权的)响应消息中,请求服务器对收到401响应的客户端进行验证 |
示例:
HTTP代理服务器
可以代表浏览器发出HTTP请求。
将最近的一些请求和响应暂存在本地磁盘中,当与暂存的请求相同的新请求到达时,代理服务器就将暂存的响应发出去,不需要按URL的地址再去因特网访问该资源。
HTTP协议与HTTPS协议的区别
HTTPS为HTTP的升级版,比HTTP协议更加安全。安全基础为SSL,即在HTTP下加入SSL层。HTTPS通过安全传输机制进行传送数据。保证传送的数据的隐秘性、完整性,降低非侵入性拦截攻击的可能性。
HTTP | HTTPS | |
---|---|---|
传输方式 | 明文传输 | SSL加密传输 |
连接方式 | 80端口连接 | 443端口连接 |
所需证书 | 不需要 | 到ca申请证书,免费很少,需要交费,优秀而由Web容器提供,如TOMCAT |
连接特点 | 相对简单、无状态 | 由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 |
其他需要了解的
Cookie
浏览器第一次访问服务器时,服务器发送到浏览器并保存在本地的一小块数据,在浏览器下一次向同一服务器发起请求时被携带并发送到服务器上。
用于告诉服务端,两个请求是否来自同一浏览器。
- 敏感信息不应通过Cookie传输
- Cookie的Secure标记,只应用过被HTTPS协议加密过的请求发送给服务端
- 使用HttpOnly标记,可以一定程度上避免XSS攻击
Session
会话信息,保存在Web服务器上。比Cookie更安全。
Token
服务端生成的一串字符串,作为客户端进行请求的标识。
用于身份认证。
X-Frame-Options
在HTTP响应头中出现,用于给浏览器指示是否可在<frame>
, <iframe>
或者 <object>
中展现的标记。
网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持攻击。
X-Content-Type-Options
在HTTP响应头中出现。
用于规定客户端必须要遵循Content-Type首部中对MIME类型的设定,不能修改。
禁用了客户端的MIME类型嗅探行为。
MIME类型举例:img/gif