当前位置: 代码迷 >> 综合 >> 网络篇-HTTP1.1协议(上)-概述
  详细解决方案

网络篇-HTTP1.1协议(上)-概述

热度:67   发布时间:2023-12-16 19:57:07.0

前言:

参考 极客时间 《Web协议详解与抓包实战》

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

1. 浏览器端

流程:

  1. 在用户界面(浏览器界面)的url地址,浏览器引擎联想url地址(通过浏览器轻量级数据库获取)
  2. 敲下回车后,浏览器引擎调用渲染引擎,渲染引擎发出请求,通过网络模块获取数据
  3. 等到html响应后,渲染引擎可能发现 javascript请求,发起二次请求
  4. 当渲染引擎获取到需要的文件后,会通过ui后端绘制完整界面

2. 网络端

流程:

  1. 服务器监听80/443等端口
  2. 浏览器从url中解析出域名,根据域名查询DNS,获取到域名对应的ip地址
  3. 浏览器使用查到的ip地址与服务器进行三次握手,建立起了TCP连接。如果使用了HTTPS,还要完成TLS/SSL握手
  4. 浏览器构造HTTP请求,填充相应的HTTP头部
  5. 浏览器发起HTTP请求
  6. 服务器收到HTTP请求后,将HTML页面作为包体返回给浏览器
  7. 浏览器在渲染引擎中解析响应,渲染包体至用户界面,然后根据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:请求正在发送

ServiceWorker Preparation: 浏览器在启动网络相关进程Service Worker
Request to ServiceWorker: 正在将请求发送至Service Worker

Waiting(TTFB):浏览器在等待第一个字节响应。TTFB(time to first byte)

Content Download:浏览器正在接受请求

Receiving Push: 浏览器在通过HTTP/2服务器推送接收此响应的数据
Reading Push: 浏览器正在读取之前接收到的本地数据

查看方法: