定义
HTTP协议即超文本传输协议,Hyper Text Transfer Protocal,是一种用于分布式、协作式、和超媒体信息系统的应用层协议,是万维网的数据通信基础。HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
版本
HTTP/0.9——只支持GET请求方法获取文本数据,不支持请求头、响应头,无法向服务器传递太多信息 1991
HTTP/1.0——支持POST、GET等请求方式,支持请求头、响应头,支持更多数据类型,但是每发一次请求都要与服务器建立一个TCP连接 1996
HTTP/1.1(最经典,最广泛)——采用持久连接(Keep-alive),多个请求可以共用一个TCP请求 1997
HTTP/2.0 2015
HTTP/3.0 2018
标准
由RFC记录(Request for Comments 请求意见稿)
RFC规定用ABNF语言描述HTTP报文(请求报文和响应报文)格式
报文格式
HTTP-message=start-line
*(header-filed CRLF)
CRLF
[message-body]
详细说明:
start-line=request-line/status-line
如果是请求报文,就是请求行即request-line
request-line=method SP request-target SP HTTP-version CRLF
如: GET /hello/ HTTP/1.1
如果是响应报文,就是响应行即status-line
status-line=HTTP-version SP status-code SP reason-phrase CRLF
如:HTTP/1.1 200 OK
header-field=filed-name ":" OWS filed-value OWS
message-body=*OCTET
URL的编码:一旦出现了一些特殊字符(如中文、空格),需要转义编码
请求方法
GET、POST、HEAD、OPTIONS、CONNECT、TRACE、PUT、DELETE、PATCH
①GET:常用于读取操作,参数直接拼接在URL后面(所以无法传递太多数据)
②POST:常用于增加、删除、修改操作,参数可以放到请求体和URL后
③HEAD:只返回响应头和响应行(用于判断要下载的文件大小,节约带宽资源)
④OPTIONS:用来得知服务器支持的请求方法
⑤CONNECT:用来建隧道
⑥TRACE:用来回显发出的请求信息
⑦PUT:通来对已存在的资源进行覆盖(用的较少)
⑧DELETE:删除指定资源(用的较少)
⑨PATCH:修改部分资源(用的较少)
请求头字段
User-Agent:浏览器的身份标识符
Host:服务器的域名、端口号
Date:请求的日期和时间
Referer:有哪个页面跳转到当前页面
Content-Type:请求体的类型——post请求才有
Content-Length:请求体长度——post请求才有
Accept:能够接受的响应类型(文档、图片)
Accept-Charset:能够接受的字符集
Accept-Encoding:能够接受的编码方式
Accept-Language:能够接受的语言
Range:用在多线程断点下载
Origin:发起一个针对跨域资源共享的请求
Cookie:与响应头里的Set-Cookie对应
Connection:浏览器想要优先使用的连接类型(长链接or短连接)
Cache-Control:指定缓存机制
响应头字段
Date:发出响应的日期和时间
Last-Modified:所请求的东西的最后修改日期
Server:服务器的名字
Expires:指定一个时间,超过这个时间就代表响应已过期
Content-Type:响应体的类型
Content-Encoding:编码类型
Content-Length:响应体长度
Content-Disposition:下载并建议文件名头部
Accept-Ranges:服务器支持哪些种类的部分内容范围
Content-Range:这部分是属于完整消息的哪一部分
Access-Control-Allow-Origin:指定哪些网站可以跨域共享资源
Location:重定向
Set-Cookie:返回给客户端一个Cookie
Connection:针对这个连接所预期的选项
Cache-Control:是否可以缓存这个对象
状态码
分为5类——100~199信息响应;200~299成功响应;300~399重定向;400~499客户端错误;500~599服务器错误
100 Continue:开发人员可以设定,C可以先只发送URL+请求头,如果合法就允许C继续发送请求体,不合法就直接拒绝
200 OK:请求成功
302 Found:请求的资源暂时被重定向到了Location里的值
304 Not Modified:客户端的缓存里有
400 Bad Request:语法无效(报文格式错误)或者开发人员设置当参数缺失时返回
403 Forbidden:拒绝访问(客户端没有权限)
404 Not Found:无法找到请求的资源
405 Method Not Allowed:服务器禁止使用当前的请求方式
406 Not Acceptable:服务器无法提供客户端所要求的Accept-charest或Accept-Language
500 Internal Server Error:服务器崩了
501 Not Implemented:请求的方法不被服务器支持,服务器没有能力处理
502 Bad Gateway:网关或代理服务器从上游服务器接收到的响应是无效的
503 Service Unavailable:服务器已超载或者是停机维护
请求体的编码类型
- application/x-www-form-urlencoded(默认值)
name=123&age=456
- multipart/form-data(文件上传时必须使用的编码方式)
代理服务器
处于中间,本身不产生内容,面向下游的客户端是服务器,面向上游的服务器是客户端。
- 正向代理:代理的对象是客户端
作用:隐藏客户端、绕过防火墙(突破访问限制)、Internet访问控制、数据过滤
- 反向代理:代理的对象是服务器
作用:负载均衡、隐藏服务器身份、安全防护
抓包工具的原理:在客户端启动了正向代理服务。
CDN(内容分发网络)
定义:CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。CDN由CDN运营商部署。
缓存(Cache)
通常会缓存的情况是:GET请求+静态资源
Pragma(响应头):类似于Cache-Control(已淘汰)
Cache-Control(响应头):设置缓存策略
- no-storage:不缓存数据到本地(一般如果数据经常变化的话会这样设置)
- public:允许用户、代理服务器缓存数据到本地
- private:只允许用户缓存到本地
- max-age:缓存的有效时间(缓存多久不过期),单位是秒
- no-cache:发请求问服务器缓存是否有变化,再来决定如何使用缓存
Expires(响应头):缓存的过期时间
优先级:Pragma>Cache-Control>Expires
Last-Modified(响应头):资源最后一次修改时间
ETag(响应头):资源的唯一标识(由资源计算出来的摘要值)
Last-Modified只能精确到秒,而且如果只是时间变了而内容没变,会导致数据重复传输,ETag改善了这两个缺陷
优先级:ETag>Last-Modified
If-None-Match(请求头):与上一次响应头中的ETag对比,不匹配就返回新资源,匹配就返回304
If-Modified-Match(请求头):与上一次响应头里的Last-Modified对比,不匹配就返回新资源,匹配就返回304
跨域资源共享
是解决Ajax跨域请求的常用方法,浏览器的同源策略规定了,默认情况下Ajax请求只能发给同源的URL(协议、域名、端口相同)。
img、script、link、iframe、video、等标签不受同源策略的约束。
受同源策略的影响,默认情况下,Ajax请求只能发送给同源的URL,而现在绝大部分都是前后端分离的,解决方法就是在服务器设置一个响应头(Access-Control-Allow-Origin),告诉浏览器,允许某个域能够跨域访问我的资源。
会话跟踪
请求头里的Cookie字段和响应头里的Set-Cookie字段相对应
Cookie:服务器在响应头返回Set-Cookie交给客户端去存储,客户端存储到本地磁盘(硬盘)
Session:在服务端存储一些数据,存储到服务器的内存中
如果小李发起登录请求,一旦请求成功,服务器会为小李这时所用的浏览器创建一个session,session的id为666,里面存放了用户的id和密码,并且服务器还会通过响应头返回给浏览器set-cookie字段,里面包括了JESSION=666,path=/xx,doman=localhost:8080,浏览器拿到该字段后,在本地存为cookie:JESSION=666,path=/xx,doman=localhost:8080,等浏览器下次请求某个东西,发现请求的路径对的上path和doman,就会自动在请求头里带上cookie