HTTP
1 URL
结构:协议+主机名称+目录结构+文件名
URL的完整格式:< schema>://< user>:< pwd> @ < host>:< port>/< path>;< params>?< query>#< frag>
- 协议 SCHEMA:方案,指定以哪种协议从服务器获取指定资源,不区分大小写;HTTP、HTTPS、FTP、MAILTO、RTSP、FILE、NEWS、TELNET
常见协议指定默认端口号,应避免混用。
常见协议 | 默认端口号 | 协议基本作用 |
---|---|---|
FTP | 21 | 文件上传、下载 |
SSH | 22 | 安全远程登录 |
TELNET | 23 | 远程登录 |
SMTP | 25 | 邮件传输 |
DNS | 53 | 域名解析 |
HTTP | 80 | 超文本传输 |
POP3 | 110 | 邮件接收 |
HTTPS | 443 | 加密传输的HTTPS |
- 用户名/密码 < user >:< pwd >
USER:某些方案访问资源需要指定用户名,默认值为anonymouse
PWD:密码默认值为地址 - 主机/端口号< host >:< port >
HOST:主机名,资源所在服务器的IP地址或者域名(需要DNS转换为IP地址)127.0.0.1 localhost
PORT:端口号,每项服务在服务器上对应一个监听端口号 - 路径 < path >
< path>:资源在服务器上存放的位置,’/'分隔其与前面URL组件 - 参数< params>
< params>:某些方案会使用参数来指定输入参数,每个参数都采用"名/值"形式;一个URL可以有多个这样的对使用;分隔;session/cookie
Eg. ;jsessionid=DF8103FA - 查询< query>
< query>:某些方案使用查询字符串传递参数
Eg. ?wd=js&issp=1&f=8 - 锚点< frag>
< frag>:片段、锚点、书签,资源中某一部分的名字。引用对象时不会传送给服务器,而是在客户端内部使用,使用#与其他部分分隔
Eg. #chapter8
URL有两种形式:
1)绝对URL:以方案开头包含访问资源所需全部信息;
2)相对URL:URL本身信息不完整,需参考另外一个URL(base)才能确定;
2 HTTP协议
2.1 HTTP协议概述
HyperText Transfer Protocol超文本传输协议,规范数据如何打包以及传递
2.1.1 HTTP协议历史与标准
->HTTP/0.9:1991年制定,严重设计缺陷,只支持GET方法,不支持MIME类型;
->HTTP/1.0:1996年制定,支持多种请求方法,支持媒体对象,不支持持久连接
->HTTP/1.0+:支持持久连接、虚拟主机、代理连接等新特性,非官方标准
->HTTP/1.1:1999年制定官方标准,校正HTTP中的设计缺陷,优化性能
->HTTP-NG(HTTP/2.0):关注HTTP协议的性能优化以及更强大的服务逻辑远程执行框架
2.1.2 请求与响应流程
Message,消息/报文,是HTTP客户端与服务器之间传递的数据块;HTTP协议规定,消息必须符合特定的格式才能被理解
Request Message:客服端向服务器发送的请求消息;
Response Message:服务器端根据客户端的请求消息,返回给客户端的响应消息
2.2 HTTP消息
2.2.1 HTTP消息结构概述
HTTP消息是简单的格式化数据块,每个消息由三部分组成:
- Start Line:消息起始行,必需,消息基本描述信息
- Header:消息头部/报头,0~N个,消息详细属性
- Body:消息主体,可选,包含数据的主体
消息起始行和消息头是纯ASCII字符,每行以CRLF结束;消息主体是可选数据块,数据可以为空、字符数据(HTML、CSS、JavaScript等字符数据)、二进制数据(图片、音频、视频等字节数据)
POST和GET传递数据的格式相似,但传递数据的方式有区别。
2.2.2 请求消息request
请求消息结构
客户端发送给服务器的数据,应符合格式要求:
<method> <request-URL> <version>
<headers>
<entity-body>
请求起始行:请求方法 请求URL 协议版本;
请求头部:可能包含0~N个请求头(名/值对);
请求主体:可选,提交给服务器的请求数据;
- 请求起始行与请求方法
请求消息请求服务器使用资源
请求起始行:< method > < request-URL >< version >
请求方法:
请求方法 | 描述 | 请求主体form data |
---|---|---|
GET | 客户端从服务器获取数据(地址栏明文发送、大小限制2KB) | 否 |
POST | 客户端向服务器提交数据(隐式发送,数据在请求主体Form Data) | 是 |
PUT | 将请求主体中的数据存储在服务器 | 是 |
DELETE | 客户端删除服务器内容 | 否 |
CONNECT | 测试连接 | 否 |
HEAD | 只获取文档响应头部 | 否 |
TRACE | 追踪可能经过代理服务器请求服务器的消息 | 否 |
OPTIONS | 选项(预请求) | 否 |
- 请求头
请求头用于描述请求本身、客户端、请求主体的特征
1)Host:告诉服务器请求的哪个主机
2)Connection:告诉服务器进行持久连接
3)User-Agent:用户代理,告诉服务器自己的类型信息
4)Accept-Encoding:告诉服务器自己接收的压缩文件的类型
5)Accept-Language:告诉服务器自己接收的自然语言类型
6)Referer:引用,告诉服务器请求来自哪个网页 - 请求主体
请求主体保存着客户端提交给服务器处理(POST)或保存(PUT)的数据,可能包含字符数据和字节数据
2.2.3 响应消息
响应消息结构:
服务器返回给客户端的数据,格式要求:
<version> <status> <reason-phrase>
<headers>
<entity-body>
响应起始行:协议版本 响应状态码 原因短句(对状态码解释说明)
响应头:包含0~N个响应头
响应主体:返回给客户端的响应数据,可能是字符数据也可能是字节数据
- 响应起始行
响应消息是服务器返回给客户端的数据
状态码 | 原因短句 | 含义 |
---|---|---|
100 | Continue | 提示信息 |
200 | OK | 响应完成,主体包含请求数据 |
201 | Created | PUT请求提交的数据已经被保存 |
301 | Moved Permanently | 永久重定向,Location响应头指定请求资源当前URL |
302 | 临时重定向,如:因用户未登录导致购物车结算跳转至登录界面 | |
303 | See other | 告知客户端使用其它URL获取资源 |
304 | Not Modified | 请求未被修改,使用之前的缓存 |
400 | Bad Request | 请求格式错误 |
403 | Forbidden | 请求被服务器拒绝,权限不足 |
404 | Not Found | 请求资源不存在 |
405 | Method Not Allowed | 发起的请求中带有URL不支持的方法 |
500 | Internal Server Error | 服务器端程序执行过程中发生错误 |
501 | Not Inplemented | 请求资源未实现指定的请求方法 |
503 | Service Unavailable | 服务器暂时无法提供服务 |
505 | HTTP Version Not Supported | 请求使用的HTTP协议版本不被支持 |
304执行过程分析
https://www.jianshu.com/p/fd00f0d02f5f
2. 响应头
响应头可用于描述响应本身、服务器、响应主体的特征:
1)Date 告诉浏览器服务器的响应时间;
2)Connection:keep-alive告诉浏览器已经启动持久连接
3)Content-Type:响应主体的类型——实体头部中Content-Type可用于指定消息主体中数据的内容类型(MIME类型)。取值:
HTML文本text/html,
普通文本text/plain,
样式文件text/css,
js脚本文件application/javascript,
图片image/png(jpeg),
JSON字符串application/json,
XML字符串application/xml
4. 响应主体
响应主体中包含着服务器返回给客户端的数据主体(GET/POST)
根据请求URL的不同,响应主体中可能是字符数据(HTML、CSS、JavaScript、JSON等字符)或字节数据(图片、音频、视频等各种字节数据)
2.3 缓存控制相关头部
2.3.1 缓存工作原理
客户端可以自动保存访问过的文档的副本(“文档缓存”);当客户端再次发送同一个URL的请求,就可以直接从缓存区而不是远程服务器提取该文档。
数据缓存优点如下:
减少冗余的数据传输,节省客户端流量;缓解服务器带宽瓶颈问题,服务器可以节省更多带宽;降低对服务器的资源消耗和运行要求;降低由于远距离而造成的加载延时。
缓存命中的完整流程:
2.3.2 Cache-Control
Cache-Control:max-age头部表示从服务器将文档传来时起认为该文档处于新鲜状态的秒数——Cache-Control: max-age = 3600
服务器可以请求客户端不要缓存文档或者将使用期设置为零,这样每次访问都会刷新——Cache-Control:max-age=0;
客户端没有进行再验证不能提供对应数据的陈旧副本,但缓存可以提供新鲜的副本:Cache-Control: must-revalidate
2.3.3 Expires头
Expires头部指定缓存的过期确切时间点。由于服务器的时钟不同步,所以推荐使用剩余秒数来代替过期的绝对时间。
Expires: Sun,15 Mar 2014, 08:00:00 GMT
若希望客户端不缓存资源,可以将过期时间设置为过去的时间。
2.3.4 控制HTTP头部方法
-
在网页中修改缓存
<meta http-equiv="消息头" content="值"> //例如消息头=Cache-Control、值=max-age=3600
还可以在服务器端执行动态编程语言(JSP、PHP、ASPX等)代码来控制响应头
按照HTTP协议要求,响应头声明必须处于响应主体之前,故调用上述函数前不能有任何输出语句或者HTML内容甚至是空白字符
2.4 Cookie工作原理
3 HTTP优化
3.1 HTTP性能优化
3.1.1 HTTP连接过程
3.1.2 HTTP连接性能优化
网站性能优化最主要就是减少HTTP请求及每次响应中内容的长度。
- 域名解析:尽可能减少域名解析次数——减少跨站外部资源的引用
- 创建连接:减少连接创建次数——使用Keep-Alive避免重复连接
- 发送请求:减少请求次数——合理设置Expires时间、资源合并
- 等待响应:提高服务器端运行速度——提高数据运算及查询速度
- 接收响应:减小响应数据长度——启用压缩
3.2 安全的HTTP协议
3.2.1 HTTPS协议
HTTP协议本质上属于“明文传输”,容易被窃听和篡改;HTTPS协议是安全版本的http,将消息发送给TCP层之前,先交给安全层(由SSL或TLS协议实现,为数据通讯提供安全支持),安全层负责对消息进行加密和解密操作。
HTTP请求服务器默认监听80端口;HTTPS请求服务器默认监听443端口