HTTP

123 阅读7分钟

HTTP协议概念

1 什么是协议

计算机的协议和现实中的协议是一样的,一式双份或者多分,双方/或者多方都遵守共同的规范
简单来说就是规定双方在通信时,大家都需要遵守的规则

2 请求信息

请求信息分为4个部分:
                   1 请求行(请求的方法,请求的路径地址,协议版本)
                   2 请求头 (里面包含着一个或者多个的键值对,比如是否缓存,主体长度,主体的格式什么的)
                   3 空行
                   4 请求主体信息(在GTE请求中请求主体信息是可有可无的)

3 响应信息

请求信息也分为4部分:
                   1 响应行(状态码,协议版本,状态文字)
                   2 响应头
                   3 空行
                   4 响应主体

4 常见的请求方法

    1 GET
    2 POST
    注意:这里GET和POST在发送请求时,有一定区别,POST请求发送时需要在头部表明你这个发送信息
    的主体的长度(Content-length)和主体的格式(Content-type)是什么否则POST请求不生效,GET可以不用表明
    3 PUT
    4 DELETE
    5 TRACE (是你用了代理上网,比如你使用代理访问一个地址,你想看看这个代理是否修改了你的
    HTTP请求,可以使用这个方法那么服务器就会把你请求这个地址的所有的信息返回给你)
    6 OPTIONS (这个方法了是向服务器查询这个可使用的方法有那些)
    7 HEAD (这个方法和GET方法基本一直,区别在于 HEAD方法不会服务器不会返回具体的主体内容,
           一般用于确认一个内容是否存在)
           
    注意: 以上这个这7个方法,不是所有服务器都支持

5 状态码

   200 成功
   301 永久重定向(页面地址发送的变动)
   302 临时重定向
   304 内容没有发送修改,可以走缓存
   307 在重定向的页面中保留原有的请求数据(如果POST请求,在重定向中,没有主动设置307的话,那么原来的
       POST请求会变成GET请求)
   401 没有授权
   403 页面禁止访问
   404 页面不存在
   500系列基本都是后端的问题了

Cookie

1 为什么要使用Cookie

因为HTTP请求时无状态的,使用Cookie就是为了解决无状态的问题
无状态:假设用户连续的访问同一个网址,服务器判断不了这个用户是不是第一次访问这个页面

2 工作的原理:

客户端第一次正常发送请求,服务端接收到请求之后返回去的内容会有一个Cookie,那么当客户端在一次请求相同的地址时会携带上
这个Cookie,服务端根据这个Cookie返回相应的历史内容给客户端,来做个性化

HTTP防盗链

当我们在某些论坛或者贴吧上获取了一张图片,把这个图片的地址复制到我们的页面上img标签src属性上使用,会发现 这张图使用不了,或者网站统计结果统计用户从何而来,使用的就是HTTP协议中referer来实现的

referer
这个字段是HTTP协议中请求头信息中的一个重要选项,用来代表网页的来源(也就是请求资源的网页地址是那一个,比如我从qq点击超
链接
去百度,那么请求头信息就会有referer字段值是我在qq时网页地址),通过referer值我们实现防盗链,只需要对referer值进行一
个匹配规则如果满足就允许使用图片,如果不满足就重写图片的url地址,可以用这值来做用户来源信息的采集,我们伪造这个referer来反防盗链

image.png

HTTP中的缓存

1 协商缓存

Etag : 可以认为是这个数据的唯一标识
last-modified : 这个数据的最后修改时间

IF-None-match
IF-modified-since 

以上2种他们是对应的发送的都在请求头种体现,服务器根据他们值来进行判断如果和服务器保存的标志一致或者在最后一次修改的
时间
之后都没有发生修改的话则返回304如果不一致那么就重新请求数据

2 强制缓存

在请求头中使用cache-control来控制是否开启缓存,优先级高于协商缓存
值:
   1 max-age:以秒位单位,控制资源可以持续使用多久,此时不发送请求去服务器
   2 no-cache:强制客户端往服务器发送请求,由服务器判断是否走缓存
   3 no-store:禁止一切缓存
   4 private: 只能针对个人用户,而不能被代理服务缓存
   5 public: 指示响应可以被任何缓存区缓存
   
 响应头里面会由Expires字段值告诉用户这个会别缓存到那一天

实现的流程:

浏览器首先判断请求头中是否有cache-control字段如果有判断它值假设max-age的话,首先判断是否过期没过期的话直接走缓
存不送请求,如果过期就发送请求给服务器
如果没有cache-control字段就判断是否有 Etag和last-modified 或者 IF-None-match和IF-modified-since如果就带上,没有就
不带由服务器根据这些字段进行对比,发生改变就重新给数据返回200,如果没有改变就返回304

HTTP中的压缩

为了提高网页在网络的传输速度,服务会对主体内容进行一个压缩在发送给客户端,常见的压缩有:gzip,deflate,dsch等 这样可以节省大型网站的流量

那么在HTTP请求中服务器怎么知道客户端浏览器支持什么压缩的文件了?

Accept-Encoding
在发送请求的时候,允许我们在请求头中设置Accept-Encoding,来于服务器进行协商,主体文件可以怎么压缩,服务器接收到之后,
会根据这个字段值,采取相应的压缩手段对主体进行压缩发送给服务端从而加快传输的速度,而响应头中会有相应字段
告诉浏览器主体是怎么压缩的,你怎么解压

image.png

image.png

HTTP分块传输

分块传输指在一定情况下我们不确定我们发送的请求的主体是多少,这个时候就需要特定的传输字段,来告诉服务器是怎么将数据传递给你的,主要用于网页聊天,在线聊天都有使用到分块传输,在HTTP1.1协议中允许你不写content-length,在请求头中使用Transfer-Encoding:chunked 这样跟服务器保持持久连接(一般HTTP请求发送请求时只要你的主体长度,达到设定长度时候,就会直接断开,而如果设置这个Transfer-Encoding:chunked 请求会一直保持)

实现在线聊天原理:

客户端发送请求给服务端保持长久连接之后,每一次发送的数据都保存在服务器中并且,直接输出出去,那么假设AB都跟服务器
发送这样的请求,那么A发送的数据,保存在数据库,通过服务器立马传输给BB收到内容之后也用相同的方式进行操作,这样就可以实现这个在线聊天的功能

视频地址:www.bilibili.com/video/BV1js…