前言:
参考 极客时间 《Web协议详解与抓包实战》
一、浏览器发起HTTP请求的典型场景
1. 浏览器端
流程:
- 在用户界面(浏览器界面)的url地址,浏览器引擎联想url地址(通过浏览器轻量级数据库获取)
- 敲下回车后,浏览器引擎调用渲染引擎,渲染引擎发出请求,通过网络模块获取数据
- 等到html响应后,渲染引擎可能发现 javascript请求,发起二次请求
- 当渲染引擎获取到需要的文件后,会通过ui后端绘制完整界面
2. 网络端
流程:
- 服务器监听80/443等端口
- 浏览器从url中解析出域名,根据域名查询DNS,获取到域名对应的ip地址
- 浏览器使用查到的ip地址与服务器进行三次握手,建立起了TCP连接。如果使用了HTTPS,还要完成TLS/SSL握手
- 浏览器构造HTTP请求,填充相应的HTTP头部
- 浏览器发起HTTP请求
- 服务器收到HTTP请求后,将HTML页面作为包体返回给浏览器
- 浏览器在渲染引擎中解析响应,渲染包体至用户界面,然后根据HTML的超链接发起新的HTTP请求
3. HTTP协议的定义
定义:超文本传输协议,一种无状态的、应用层的、以请求/应答方式运行的协议。HTTP协议语义是可扩展的(向下兼容,服务器使用HTTP1.0,浏览器使用HTTP1.1,仍然可以正常工作),传递的消息是自描述的(不需要依赖其他的请求,单个请求即可明确内容),与基于网络的超文本信息系统灵活互动(传输内容不只是文本,还可以是视频、音频)
二. 基于 ABNF 描述HTTP协议消息的格式
1. 概述
HTTP格式分类:
- HTTP请求格式:方法(GET)+空格+path路径+http版本号+\r\n+Host头部+冒号+域名+\r\n
- HTTP响应格式:http版本号+空格+响应码+空格+描述+\r\n+http头部
HTTP组成:
- start-line:request-line/status-line(上图黄色部分)
- header-fueld:上图浅蓝色部分
- message-body:内容
2. ABNF
空白字符:用来分隔定义中的各个元素
- 例子:method SP request-target SP HTTP-version CRLF(SP表示空格)
选择/:表示多个规则都是可供选择的规则
- 例子:start-line = request-line / status-line
值范围 %c##-##
- 例子:OCTAL = "0" / "1" / "2" / "3" 与 OCTAL = %x30-37
序列组合():将规则组合起来,视为单个元素
不定量重复 m*n:
- * 元素表示零个或更多元素:*( header-field CRLF )
- 1* 元素表示一个或更多元素,2*4 元素表示两个至四个元素
可选序列[]:[ message-body ]
ABNF核心规则:
3. 使用ABNF描述的HTTP协议格式
HTTP-message: start-line *(header-field CRLF) CRLF [message-body]
start-line:
- request-line:method SP request-target SP HTTP-version CRLF
- status-line:HTTP-version SP status-code SP reason-phrase CRLF
header-field:field-name ":" OWS field-value OWS
- OWS:*(SP/HTAB)
- field-name:token
- field-value:*(field - content/obs - fold)
message-body:*OCTET
4. 使用telnet查看http协议格式
请求:
GET(method) /(target路径) HTTP/1.1(HTTP-version)
Host:www.baidu.com
返回:
[root@VM-125-189-centos ~]# telnet www.baidu.com 80
Trying 14.215.177.39...
Connected to www.baidu.com.
Escape character is '^]'.
^]
telnet>
GET / HTTP/1.1
Host:www.baidu.comHTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 14615
Content-Type: text/html
Date: Thu, 26 Aug 2021 15:46:32 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=A0F464693AB11C6134D53E9CC7860ACE:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=A0F464693AB11C6134D53E9CC7860ACE; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1629992792; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=A0F464693AB11C614E2C20E6C29ABCFA:FG=1; max-age=31536000; expires=Fri, 26-Aug-22 15:46:32 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Traceid: 162999279203895096428040458772313014660
Vary: Accept-Encoding
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1<!DOCTYPE html><!--STATUS OK-->
<html>
<head>... ...
5. 使用wireshark抓包
简介:
步骤:
1. 配置捕获条件
2. 使用telnet发送http请求,查看wireshark捕获情况
3. 点击捕获到的http返回数据,发现与telnet请求返回的数据一致
三、OSI模型与TCP/IP模型
分层模型的好处:解耦合,各层之间的升级没有强依赖关系。例子:应用层升级不需要传输层变更(HTTP迭代不需要IP协议迭代);数据链路层不同的MTU对上层协议无影响
分层模型坏处:分层之后,多个层直接需要做处理,会有数据延迟,导致性能下降(英特尔的DBDK库提供接口绕过分层模型)
1. OSI模型
ISO组成:
- 应用层(http/telnet/ftp等):解决业务问题
- 表示层(TLS/SSL等):负责把网络中的消息转换成应用层的消息。例如tls和ssl消息格式应用层无法直接读取,需要表示层转换。
- 会话层(概念层次):表示层和传输层有部分延伸到会话层,控制进程建立会话。
- 传输层(TCP/UDP):进程与进程之间的通信。传输层决定报文到了主机上,主机应该把报文分发给哪个进程。TCP还做了报文可达性控制/流量控制
- 网络层(IP协议):确保在广域网(因特网)上,一个报文可以从一个主机发送到另一个主机。
- 数据链路层:在局域网中,使用mac地址链接到交换机/二层路由器,将报文转发到另一个主机上,只能工作在以太网上
- 物理层:物理介质
不同层次设备:
- 二层设备:面向mac地址进行转发报文的设备
- 三层设备:基于IP报文,进行广域网上转发的设备
- 四层设备:基于传输层的转发设备,例如lvs
- 七层设备:工作在应用层上,用以处理HTTP协议/GRPC协议等等
2. TCP/IP模型
TCP/IP模型与ISO模型区别:TCP/IP模型的应用层对应ISO的应用层/表示层/会话层,不严格划分数据链路层和物理层
3. 使用wireshark分析网络协议分层模型在网络报文的体现
a. 报文头部组成
- 传输层(Frame):mac
- 网络层(包):IP头
- 传输层(Sequence/Datagram):TCP头
b. wireshark抓包
关注红框区域,由上到下分别为:
- Frame:wireshark框架内容,不研究
- Ethernet:数据链路层,包含源mac地址和目的mac地址
- Internet Protocol:IP层,包含源IP和目的IP
- Transmission Controller Protocol:TCP层,包含源端口/目的端口
- TLS层:表示层,加解密层,无头部概念
- Hypertext Transfer Protocol层:Http层
四、HTTP协议概述
1. HTTP解决了什么问题
解决万维网信息交互需要面对的问题(HTTP解决的问题):
2.HTTP协议设计考虑的属性
a. Http协议设计需要考虑的属性
性能属性:
- 网络性能:吞吐量(QPS/TPS,小于等于服务器带宽);开销(首次开销:对于长连接,首次连接时有三次握手/TCP拥塞控制开销;每次开销:建立连接后,可复用首次连接的部分信息)
- 用户感知到的性能:延迟(发起请求到接收到响应的时间);完成时间(完成一个应用动作花费的时间)
- 网络效率:重用缓存,减少交互次数,选择就近的服务节点进行交互,COD
可修改性:
- 可进化性:一个组件独立升级不影响其他组件
- 可扩展性:向系统添加功能,不会影响系统其他部分
- 可定制性:定制化修改某个要素,不会影响常规用户
- 可配置性:应用部署后可通过配置修改功能
- 可重用性:组件可以不做修改在其他应用中使用
b. rest架构下的web体系
3. 从五种架构风格推导出Http的rest架构(?)
a. 分布式web架构中的五类风格
b. 数据流风格
数据流风格属性:从输入端读取数据,从输出端产出数据
c. 复制风格
复制风格属性:
d. 分层风格
LS$SS架构:分层+缓存+无状态+客户端服务器分层
有状态的分层风格:
远程会话RS:CS变体,服务器保存Application state应用状态/可伸缩性,可见性差
远程数据访问RDA:应用状态分布在客户端和服务器端(数据库的cursor)
分层风格属性:
e. 移动代码架构
统一接口的LC$SS+COD架构:
移动代码风格属性:
f. 点对点架构
点对点架构属性:
g. rest风格演化
五、HTTP协议分析工具
1. Chrome的network面板
a. 工作区介绍
过滤器:
请求列表:
更多用法参考:09 | 如何用Chrome的Network面板分析HTTP报文-极客时间
b. 请求时间分布
请求分布:
Queueing:浏览器在以下情况下进行排队
- 存在更高优先级的请求
- 该源已打开6个TCP连接,达到阈值
- 浏览器正在短暂分配磁盘缓存中的空间
stalled:请求可能会因Queueing中描述的原因停止
DNS Lookup:浏览器正在解析请求的IP地址
Proxy Negotiation:浏览器正在与代理浏览器协商请求
Request sent:请求正在发送
Waiting(TTFB):浏览器在等待第一个字节响应。TTFB(time to first byte)
Content Download:浏览器正在接受请求
查看方法: