课程链接 web protocols


  1. Timestamp:起始于2022.4.29<br /> Motivation:对于web协议的了解限于http/2.0,TCP/IP,且较为浅显和碎片化,对SSL/TLS协议完全不了解。

应用层

HTTP/1.1

浏览器发起HTTP请求典型场景

总结

  • 以chrome为例,浏览器内置有轻量级数据库。用户在地址栏输入url时会查询并auto-complete。
  • 以访问网站为例,第一个请求index.html返回后,浏览器解析DOM结构。之后根据html中的cdn,js、图片、视频请求等超链接继续发起http请求
  • HTTP 特点:无状态、自描述(self-descriptive)、

基于ABNF定义HTTP消息格式

  1. HTTP协议格式

GET / HTTP/2.0

HOST: 121.5.43.28

为什么网络要分层?

  • 分层可以解耦层次
  • 由IPv4到IPv6的过程由于商业原因,阻力大,但工作在网络层之上的应用层协议HTTP却可以更新迭代,就是因为每层较为独立
  • TCP/IP模型

HTTP解决了什么问题?

  • Internet 环境下,提供人与机器与人交流的协议规范
  • Hypertext Information 如视频、音频、图片等在HTTP协议下高性能传输
  • 由于 Internet 环境下无法预测的负载,需要一个 stateless 的协议,而HTTP恰好无状态。
    • 无状态:客户端和服务器端都不能保持对方的信息,否则会因大流量而过载。

URI基本格式

仍旧利用 ABNF 元定义符,

  • scheme://username:password@host:port/path?query#fregment
    • scheme: http / ftp / mailto
    • port= *(digit)
    • path = *(“/“path)
    • ….
  • 对URI编码:利用百分号编码方式,十六进制表示。
    • 作用:排除uri的path或query中包含 uri语法关键字的影响

HTTP请求行

  • start-line
    • request-line: Method SP path SP HTTP/x.x
    • response-line:HTTP/x.x SP status SP message
  • body

跨代理服务器的长短链接

  • 长连接:可复用,减少TCP握手次数。
  • 短连接:以一次请求为单位的TCP连接。

    问题描述 | 当 user agentorigin server之间有 proxy的时候,可能会出现connection连接方式沟通出错的问题

    原因 | 在于旧版代理服务器无法识别keep-alive。

    解决方案 | 当使用代理服务器的时候,在user agentproxy之间用Proxy-connection代替connection。

HTTP请求在服务器端的路由

  1. 通过头部中 host 信息mapping对应的虚拟主机来处理请求
  2. **注意** | 服务器内部当然会有权限校验,并发连接数限制。并且用PF(Pipe and Filter)架构来处理请求生成响应

Proxy转发消息的X-xx头部

请求与响应上下文

请求上下文
  • Referer:引用源url
    • 服务器端常用于 统计分析、缓存优化、防盗链等功能。
  • User-Agent:在服务端常用于 根据客户端浏览器指定HTTP版本选择策略。

响应上下文
  • server: CLOUD ELB 1.0.0 为客户端提供服务器信息

内容协商与资源表述

内容协商
  • 请求:
    • Accept: text/*
    • Accept-Language:en
    • Accept-Encoding:gzip,br,deflate
    • Content-Type:br,gzip;q=0.8
  • 响应:

    • Content-Type: text/html
    • Content-Language:en
    • Content-Encoding:br

      encoding用作压缩格式内容协商

  1. 内容协商决定服务器生成不同的http包体传输给浏览器

HTTP包体:消息内容

  1. 请求或响应都可以携带包体
  • HTTP消息格式:HTTP-message = start-line (header-field CRLF) CRLF *[message-body].

注 | message-body是一串 二进制字节流.

定长包体

  1. 发送HTTP请求时已经可以确定消息长度,
  2. 需要使用Content-Length头部指明包体长度。
  3. Content-Length = 1*DIGIT (Bytes)

不定长包体chunk传输

  • Transfer-Encoding = chunked
  • chunk = chunk-size [chunk.ext] CRLF chunk-data CRLF
    • chunk-size = 1*HEXDIG
    • chunk-data = 1*OCTET
  • last-chunk = ….

HTTP请求全过程

  • 客户端浏览器向DNS服务器解析域名,mapping得到IP地址
  • 通过IP地址向服务器80端口发起TCP连接请求,三次握手建立TCP请求
  • 客户端发送HTTP请求行、头
  • 服务器处理请求并返回响应行、头、[体] <—-ABNF semantic
  • 客户端浏览器接收处理响应
  • 服务器关闭或保持TCP连接(一般情况为长连接,会保持)。

:connection : Keep-Alive 需要客户端和服务器 共同 在头部做协商。

Websocket

HTTP/2.0

应用层的安全基础设施

TLS/SSL

传输层

TCP

网络层及数据链路层

IP层和以太网