Http协议总结

2019-02-14  本文已影响0人  王逵_e9b3

HTTP 协议总结

Http 协议基础

经典五层模型

应用层——传输层——网络层——数据链路层——物理层

  1. 物理层主要作用是定义物理设备如何传输数据,指代物理硬件
  2. 数据链路层在通信的实体间建立数据链路连接,基本计算机二进制传输
  3. 网络层为数据在节点之间传输创建逻辑链路
  4. 传输层为 TCP 或 UDP,可以想象为一条管道
  5. 应用层为 HTTP,可以想象为一个包

基本概念:一个 tcp 可以发送多个 http 请求,一个 http 请求必须在一个 tcp 连接里

http 发展历史

http/0.9

http/1.0

http/1.1

http2

三次握手

http 不存在连接,只有请求和响应
TCP 连接可以发送多个 http 请求,TCP 连接有三次握手网络请求的消耗

  1. 客户端发送连接数据包
  2. 服务端开启 TCP SOCKET,再给客户端发送数据包
  3. 客户端拿到数据包,再给服务端发送确认数据包

第三次是为了避免第二次握手丢失,导致服务端一直开启端口连接

URI——URL 和 URN

URI

统一资源标志符/Uniform Resource Identifier

URL

统一资源定位器/Uniform Resource Locator

此类格式的都叫做 URL,比如 http,ftp 协议

URN

永久统一资源定位符

http 报文格式

起始行

头部

主体

HTTP 的方法

HTTP CODE

创建一个简单的 web 服务

const http = require("http")
http
  .createServer(function(req, res) {
    console.log("req come", req.url)

    res.end("123")
  })
  .listen(9999)

HTTP 各种特性

CORS 跨域请求的限制与解决

浏览器对于非同域的请求会拦截,请求还是会发送,后台服务返回内容,但是浏览器会拦截掉并报错

简单请求

res.writeHead(200, {
  "Access-Control-Allow-Origin": "*"
})

预请求

先通过 OPTION 请求访问服务端,返回告诉浏览器允许接下来发送的 POST 请求,浏览器就不会拦截

res.writeHead(200, {
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Headers": "", //允许的请求头
  "Access-Control-Allow-Methods": "", //允许的请求方法
  "Access-Control-Max-Age": "" //预请求不需option验证的最大时间
})

jsonp

<script src="http://127.0.0.1:8888" />

Cache-Control

http
  .createServer(function(req, res) {
    res.writeHead(200, {
      "Content-Type": "text/javascript",
      "Cache-Control": "max-age=20" //会取缓存的内容,请求不会发送到服务器
    })
    res.end("123")
  })
  .listen(9999)

一般缓存会是一个比较长的时间,这就导致服务端更新内容,客户端却还是取老的静态资源。现在常用的方法是每次打包时在静态路径上添加一个 hash 码,hash 码根据文件改变而来,这样浏览器访问静态资源时就会从新请求。

缓存验证 Last-Modified 和 Etag 的使用

有 Cache-Control 的情况下


http.png

验证头

Last-Modified
上次修改时间,给资源设置上一次何时修改
配合 if-Modified-Since 或者 if-Unmodified-Since 使用
对比上次修改时间判断是否需要更新

Etag
数据签名,数据唯一标识,数据修改,那么签名会不一样
配合 if-Match 或者 If-Non-Match 使用
对比资源的签名判断是否使用缓存


//服务端进行etag的验证
const etag=req.headers['if-none-match']
if(etag==='777'){
    res.writeHead(304,{
        'Cache-Control':'max-age=200000,no-cache',
        'Last-Modified':'123'
        'Etag':'777'
    })
    res.end('')
}) else {
    res.writeHead(200,{
        'Cache-Control':'max-age=200000,no-cache',
        'Last-Modified':'123'
        'Etag':'777'
    })
    res.end('123')
}

Cookie 和 Session

Cookie

在服务端返回数据时,通过 Set-Cookie 保存在浏览器,浏览器下次在同域的请求中会在头带上 Cookie,

const host = req.headers.host
const html=fs.readFileSync('test.html'.'utf8')
if (host === "test.com") {
  res.writeHead(200, {
    "Set-Cookie": ["id=123;max-age=2", "abc=456;HttpOnly;domain=test.com"]
    //此时test.com下的所有二级域名都可以访问到cookie
  })
}
res.end('html')

Session

经常做法是将保存在 session 中的用户唯一 ID 存入 Cookie,下次请求时拿到 Cookie,通过 Cookie 在 Session 拿到用户信息,进行操作。

Http 长连接

http1.1 默认是长连接, 是在 tcp 上顺序发送请求,浏览器 tcp 并发限制为 6,就是同时可以存在 6 个连接。所以浏览器加载首页时,先创建 6 个 TCP 连接,然后 http 是在这六个连接中顺序发送的。

数据协商

客户端在发送请求时,限定需要拿到的数据格式,内容等。服务端根据这些限制来操作,服务端不一定按照规定返回。
请求

重定向

通过 URL 访问资源时,服务器告诉浏览器资源换位子了,并告诉新的位置,浏览器再请求新的位置,301 永久变更,302 暂时变更,301 的返回会在缓存中提取

if (req.url === "/old") {
  res.writeHead(302, {
    Location: "/new"
  })
  res.end("")
}
if (req.url === "/new") {
  res.writeHead(200, {})
  res.end("1234")
}

Content-Security-Policy

内容安全策略

res.writeHead(200, {
  //仅允许http和https
  "Content-Security-Policy": "default-src http:https:",
  //仅允许本站脚本
  "Content-Security-Policy": "default-src 'self'",
  //限制特定类型
  "Content-Security-Policy": "script-src http:https:"
  //汇报
  "Content-Security-Policy": "script-src ; report-uri /report"
})
res.end("123")
上一篇 下一篇

猜你喜欢

热点阅读