1、HTTP协议
HTTP协议概念
HTTP协议的全称是 超文本传输协议,用于客户端(client)和服务端(server)之间的通信,是基于TCP/IP通信协议来传输数据
TCP/IP协议
客户端与服务器之间数据的发送和返回的,需要创建TCP connection的连接通道进行数据传输
(1) 三次握手:创建TCP连接;本质是确认通信双方收发数据的能力
(2) 四次挥手:关闭TCP连接
HTTP报文
组成:请求行 + 请求/响应头部 + 请求/响应体
http请求报文组成 | 说明 |
---|---|
请求行 | 通用头部General |
请求头 | Request Headers |
请求体 | 如果post请求的话,则会存在请求体(Requestr Payload),如果是get请求的话,直接是空白的 |
http响应报文组成 | 说明 |
---|---|
请求行 | 通用头部General |
响应头 | Response Headers |
响应体 | 服务器返回给客户端的文本信息 |
2、HTTP状态码
状态码分类 | 说明 |
---|---|
1xx | 服务器收到请求 |
2xx | 请求成功 |
3xx | 重定向 |
4xx | 客户端错误 |
5xx | 服务端错误 |
常见状态码 | 说明 |
---|---|
200 | 请求成功 |
301 | 永久重定向(配合location,浏览器自动处理;浏览器会记住,下次访问时会自动访问重定向地址) |
302 | 临时重定向(配合location,浏览器自动处理;浏览器会记住,下次会重新走流程) |
304 | 自从上次请求后,请求的网页未修改过,请客户端使用本地缓存 |
404 | 资源未找到 |
403 | 没有权限 |
500 | 服务器错误 |
504 | 网关超时 |
3、请求行(通用头部General)
请求行组成 | 说明 |
---|---|
Request URL | 请求的web服务器地址 |
Request Method | 请求方式(Get、POST、OPTIONS、PUT、HEAD、DELETE、CONNECT、TRACE) |
Status Code | 请求返回状态码 |
Remote Address | 请求的远程服务器地址(会转为IP) |
4、http headers(请求\响应头)
常见的Request Headers
名称 | 说明 |
---|---|
Accept | 浏览器可接收的数据格式 |
Accept-Encoding | 浏览器支持的压缩算法,如gzip |
Content-Type | 发送数据的格式(post请求) |
Connection | 一次TCP链接重复使用,如keep-alive |
Cookie | 有cookie并且同域访问时会自动带上 |
Host | 请求的服务器URL |
User-Agent | 用户浏览器的一些必要信息,如UA头部等 |
Origin | 最初的请求是从哪里发起的(只会精确到端口) |
Cache-Control | 指定请求和响应遵循的缓存机制,如no-cache(强制使用协商缓存)、max-age(设置缓存存储的最大周期,超过这个时间缓存被认为过期)、no-store(禁止使用任何缓存)、private(私有缓存,中间代理服务端不可缓存资源)、public(公共缓存,中间代理服务端可以缓存资源) |
If-Modified-Since | 对应服务端的Last-Modified,用来匹配看文件是否变动,只能精确到1s之内 |
If-None-Match | 对应服务端的ETag,用来匹配文件内容是否改变(非常精确) |
常见的Response Headers
名称 | 说明 |
---|---|
Access-Control-Allow-Headers | 服务器端允许的请求Headers |
Access-Control-Allow-Methods | 服务器端允许的请求方法 |
Access-Control-Allow-Origin | 服务器端允许的请求Origin头部(譬如为*) |
Content-Type | 服务端返回的数据内容的格式(如image/jpeg、application/json等) |
Content-encoding | 返回数据的压缩算法,如gzip |
Set-Cookie | 设置和页面关联的cookie,服务器通过这个头部把cookie传给客户端 |
Date | 数据从服务器发送的时间 |
Server | 服务器的一些相关信息 |
Expires | 时间戳,发起请求时,如果本地系统时间在这个时间戳之前,则缓存有效,否则缓存失效,进入协商缓存。 |
Cache-Control | 指定请求和响应遵循的缓存机制,如no-cache(强制使用协商缓存)、max-age(设置缓存存储的最大周期,超过这个时间缓存被认为过期)、no-store(禁止使用任何缓存)、private(私有缓存,中间代理服务端不可缓存资源)、public(公共缓存,中间代理服务端可以缓存资源) |
Last-Modified | 资源的最后修改时间 |
ETag | 资源的唯一标识 |
缓存
什么是缓存?浏览器将一些静态资源缓存到本地,再次请求时,不再重新获取;这样可以缓存减少网络请求的体积和数量,可以缓解服务器或数据库的压力,比如 js、css、image等静态资源可以被缓存
http缓存策略分为 协商缓存 和 强制缓存两种
浏览器发起资源请求后,大致有三部分:强缓存校验、协商缓存校验、资源请求。强缓存由HTTP的三个头部字段来控制:Expires、Pragma、Cache-Control。当强缓存过期或者请求头字段设置不走强缓存,比如Cache-Control:no-cache,则进入协商缓存部分。协商缓存涉及两对头部字段,分别是Last-Modified/If-Modified-Since、和ETag/If-None-Match。
http强制缓存
客户端缓存策略,由客户端根据 http headers 中的 Expires、Pragma、Cache-Control 判断是否使用本地缓存资源
过程:
1> 浏览器初次请求服务端时,如果服务端判定该资源需要缓存,会返回客户端资源和cache-control
2> 浏览器再次请求服务器获取该资源时,客户端根据cache-control判断是否使用本地缓存资源
3> 如果cache-control的时间在有效期内,会直接去本地缓存中获取资源,不再请求服务端
4> 如果cache-control的时间失效了,浏览器会重新请求服务端,再次返回资源和cache-control
http协商缓存
服务端缓存策略,由服务端通过 http headers 中的 Last-Modified/If-Modified-Since、和ETag/If-None-Match来判断是本次请求否可以使用本地资源
过程:
1> 浏览器初次请求服务端时,如果服务端判定该资源需要缓存,会返回客户端 资源 和 资源标识
2> 浏览器再次请求服务器获取该资源时,带上 资源标识(If-Modified-Since 或 If-None-Match);服务端根据 资源标识 判断客户端是否可以使用本地缓存中的资源
3> 如果可以返回状态码304,使用本地资源
4> 否则返回状态码200 和 最新资源+资源标识
资源标识:
Last-Modified 对应 If-Modified-Since (只能精确到1s之内)
ETag 对应 If-None-Match(推荐使用,非常精确)
刷新操作对缓存影响
(1) 正常操作:地址栏输入url、跳转链接、前进后退 (强制缓存有效,协商缓存有效)
(2) 手动刷新:F5、点击刷新按钮、右击菜单刷新 (强制缓存失效,协商缓存有效)
(3) 强制刷新:ctrl+F5 (强制缓存失效,协商缓存失效)
5、GET 和 POST 的区别
GET 和 POST 是HTTP协议中的两种请求方式,本质上都是TCP链接,并无差别
区别:
(1) get是从服务器上获取数据,post是向服务器传送数据
(2) get请求的数据可以被缓存,post不能被缓存
(3) get安全性差,post比get更安全 (数据是url一部分,对所有人都可见;post请求数据不会保存在浏览器历史和web服务器日志中,数据不会显示在url中)
(4) GET通过url传输参数,POST通过request body传递参数
(5) GET请求时对数据长度有限制,POST请求对数据长度没有限制 (http协议并没有对数据长度做限制,而某些特定浏览器和服务器或对 url长度 有限制)
(6) GET产生一个TCP数据包,POST产生两个TCP数据包(部分浏览器框架,不属于post必然行为)
get请求 http header和data 会一次发送出去,服务器响应200返回数据
post请求先发送header,服务器响应100 continue;再发送data,服务器响应200返回数据
安全性:
因为http是明文传输的,所以从传输角度来说,get和post都是不安全的(只要在网络节点上捉包,就能完整地获取数据报文)
通过加密来进行安全传输,https
6、输入url到页面加载全过程
过程说明:
(1) 客户端连接到web服务器
1> 获取主机名,例如:http://www.nowamagic.net
2> 根据DNS解析服务器IP,121.199.24.143(域名 -> IP地址)
3> 获取端口,默认是80端口
4> 连接到 121.199.24.143:80服务器
(2) 通过TCP信道发送HTTP请求
(3) 服务器收到请求并通过TCP信道返回http响应
(4) 释放连接
1> 如果是短连接,服务器响应之后直接释放
2> 如果是长连接(Connection:keep-alive),会在一定时间之后释放连接
(5). 客户端解析返回的数据
1> 根据HTML代码生成 DOM Tree,根据CSS代码生成 CSSOM;两者合并生成Render Tree
2> 根据Render Tree渲染页面 (重排+重绘)
3> 如果遇到<script>暂停渲染,先加载并执行js代码,然后继续渲染
4> 直至Render Tree渲染完成
总结:
域名解析为ip,并连接到服务器
建立TCP连接后发起http请求
服务器响应http请求,浏览器得到html代码
释放连接
浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)
浏览器对页面进行渲染呈现给用户
7、HTTPS
HTTPS协议是基于 SSL + HTTP协议 构建的可以加密传输、身份认证的网络协议;是HTTP的安全版
SSL证书需要花钱认证
HTTP 与 HTTPS 的区别:
(1) http的url是 http:// 开头,https的url是 https://开头
(2) http的默认端口是80,https的默认端口是443
(3) http是超文本传输协议,传输时明文传输,https是具有安全性的 SSL加密传输协议
(4) http无需证书,https需要 CA机构 颁发的 SSL证书 (收费)
(5) http是不安全的,https是安全的