Http协议总结

HTTP 协议总结

Http 协议基础

经典五层模型

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

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

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

http 发展历史

http/0.9

  • 只有一个命令 GET
  • 没有 HEADER 等描述数据的信息
  • 服务器发送完毕,就关闭 TCP 连接

http/1.0

  • 增加了很多命令,POST,PUT
  • 增加了 status code 和 header
  • 多字符集支持、多部分发送、权限、缓存等

http/1.1

  • 支持了持久连接
  • pipeline,管道化
  • 增加 host 和其他一些命令

http2

  • 所有数据以二进制传输,摆脱原来的字符串
  • 同一个连接里面发送多个请求不再需要按照顺序来,并行
  • 头信息压缩以及推送等提高效率的功能,服务端可以主动发送信息,提升性能

三次握手

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

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

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

URI——URL 和 URN

URI

统一资源标志符/Uniform Resource Identifier

  • 用来唯一标识互联网上的信息资源
  • 包括 URL 和 URN

URL

统一资源定位器/Uniform Resource Locator

  • http://user:[email protected]:80/path?query=string#hash
  • http 协议
  • user:pass 用户认证,基本用不到
  • host.com 定位服务在互联网上的位子,可以为 IP 或者域名
  • 80 端口,web 服务,物理服务器上多个 web 服务,不带端口默认访问 80
  • path 路由,web 服务上具体的内容
  • query 搜索参数,如何进行搜索和查找,传参
  • hash 锚点定位工具

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

URN

永久统一资源定位符

  • 在资源移动之后还能被找到
  • 目前还没有非常成熟的使用方案

http 报文格式

起始行

  • 请求报文:GET /text/test.txt HTTP/1.0
  • 响应报文:HTTP/1.0 200 OK

头部

  • 请求头:Accept:text/* Accept-Language:en,fr
  • 响应头:Content-type:text/plain Content-length:19

主体

  • 请求体:参数
  • 响应体:返回的数据

HTTP 的方法

  • 用来定义对于资源的操作
  • 常用有 GET,POST 等
  • 从定义上讲有各自的语义

HTTP CODE

  • 定义服务器对请求的处理结果

  • 各个区间的 CODE 有各自的语义

    • 100-199 还需要一些操作才能发送请求
    • 200-299 操作成功
    • 300-399 重定向
    • 400-499 发送的请求有问题 401 认证 403 被拒绝 404 找不到
    • 500-599 服务端问题
  • 好的 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 跨域请求的限制与解决

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

简单请求

  • 允许方法仅为 GET,HEAD,POST
  • Content-Type 仅为 text/plain,multipart/form-data,application/x-www-form-urlencoded
  • 请求头限制,仅部分固定请求头允许
  • XMLHttpRequestUpload 对象均没有注册任何事件监听器
  • 请求中没有使用 ReadableStream 对象
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


                    
                    

你可能感兴趣的:(Http协议总结)