git

HTTP协议

HTTP请求模型

HTTP请求的参与者是客户端和服务端。对于Web前端开发者来说,浏览器为客户端,服务器是服务端。服务器在运行期间提供服务,总是由客户端发起请求,服务端接收到HTTP请求之后再做HTTP响应处理。

概念

  • 客户端:发出请求的一方
  • 服务端:发出响应的一方

用户输入网址后发生了什么(网络层)

当用户在浏览器地址栏输入网址,并回车时,这背后究竟发生了什么。

浏览器获取服务器IP(域名解析)

实际上浏览器并不能直接根据网址来找到网络上相应的资源,而是要根据网址获得对应的服务器IP,这个过程叫域名解析。域名解析的流程如下:

  • 网络请求首先经过局域网网关
  • 请求通过有限个路由到达DNS服务器
  • DNS服务器从记录表中找到域名对应的IP,并响应给客户端

浏览器发送HTTP请求

在网络上HTTP在路由间跳跃,顺利的话,最终到达目标IP对应的服务器/服务器网关

服务器处理请求

网络请求首先会进入目标IP网关,往往服务端为了提高服务可用性,会使用服务器集群来提供稳定服务。网络请求进入网关后会被送至反向代理服务器,由反向代理服务器,把请求转发至提供服务的一台服务器上,由这台服务器最终来处理HTTP请求。HTTP响应会通过目标IP网关,前往客户端。

浏览器接收到响应内容

浏览器会对HTTP响应的HTML处理,渲染或者继续其他请求。

HTTP协议

超文本传输协议(Hypertext Transfer Protocol,HTTP)

是一个简单的请求-响应协议,它通常运行在TCP之上。

是由从客户机到服务器的请求(Request)和从服务器到客户机的响应(Response)进行约束和规范。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。

短连接

浏览器接收到来自服务端的相应后就立即断开链接

长链接

长链接的请求头会包含Keep-Alive字段,允许消息发送者暗示连接的状态。这个字段可以取timeout = 20以秒为单位,和max = 1000此连接可以发送的请求的最大值。这表示该连接不会立即断开,从而提高连接利用效率。

含有 Keep-Alive 首部的响应示例:

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache

HTTP协议版本

  • 1991 HTTP/0.9
  • 1996 HTTP/1.0 短连接
  • 1999 HTTP/1.1 长链接/美国经济互联网泡沫
  • 2015 HTTP/2 用二进制封装了请求头
  • 20xx HTTP/3 QUIC+UDP/目前还未形成标准

报文格式

HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。
HTTP请求/响应报文对比

请求报文格式

请求行 - 通用信息头/请求头/实体头 - 报文主体

  • 请求行:请求方法 SP URL SP HTTP协议版本 CRLF
  • 请求头:[头字段名:值CRLF][头字段名:值CRLF]…CRLF
  • 请求体:文本信息

请求行以方法字段开始,后面分别是 URL 字段和 HTTP 协议版本字段,并以 CRLF 结尾。SP 是分隔符。除了在最后的 CRLF 序列中 CR 和 LF 是必需的之外,其他都可以不要。

SP 空格Space

CRLF是Carriage-Return Line-Feed的缩写,意思是回车换行,就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)。换行在有的ASCII码表也用newline(简nl)来进行表示,这里的lf是line feed的概念,意思是一样的。

Dec(十进制) Hex (十六进制) 缩写/字符 解释
10 0x0A LF (NL line feed, new line) 换行键\n
13 0x0D CR (carriage return) 回车键\r
32 0x20 (space) 空格\s

应答报文格式

状态行 - 通用信息头/响应头/实体头 - 报文主体

  • 状态行:HTTP协议版本 状态码 状态描述 CRLF
  • 响应头
  • 响应体

状态码元由3位数字组成,表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述,状态码用来支持自动操作,而原因分析用来供用户使用。客户机无需用来检查或显示语法。

1
2
3
4
5
6
7
8
9
10
11
12
> curl -I baidu.com
HTTP/1.1 200 OK
Date: Sat, 08 May 2021 07:00:39 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sun, 09 May 2021 07:00:39 GMT
Connection: Keep-Alive
Content-Type: text/html

HTTP 请求方法

GET/POST/PUT/DELETE 属于数据类,操作数据CRUD
HEAD/TRACE/CONNECT/OPTIONS 属于指令类

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。

HTTP状态码

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

HTTP请求头/响应头

通用头字段

  • Connection Connection 头(header) 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。

    Connection: keep-alive。表明客户端想要保持该网络连接打开,HTTP/1.1的请求默认使用一个持久连接
    Connection: close。表明客户端或服务器想要关闭该网络连接,这是HTTP/1.0请求的默认值

  • Date :是一个通用首部,其中包含了报文创建的日期和时间

    Date: Wed, 21 Oct 2015 07:28:00 GMT

  • Transfer-Encoding:消息首部指明了将 entity 安全传递给用户所采用的编码形式。当这个消息首部出现在 HEAD 请求的响应中,而这样的响应没有消息体,那么它其实指的是应用在相应的 GET 请求的应答的值。

    Transfer-Encoding: chunked
    Transfer-Encoding: compress
    Transfer-Encoding: deflate
    Transfer-Encoding: gzip
    Transfer-Encoding: identity
    // Several values can be listed, separated by a comma
    Transfer-Encoding: gzip, chunked

  • Cache-Control 通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。

其他常用头

  • Server Server 首部包含了处理请求的源头服务器所用到的软件相关信息。
  • Last-Modified 是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。
  • ETag HTTP响应头是资源的特定版本的标识符。
  • Accept-Ranges 服务器使用 HTTP 响应头 Accept-Ranges 标识自身支持范围请求(partial requests)

    Accept-Ranges: bytes
    Accept-Ranges: none

  • Content-Length 是一个实体消息首部,用来指明发送给接收方的消息主体的大小,即用十进制数字表示的八位元组的数目。
  • Expires 响应头包含日期/时间, 即在此时候之后,响应过期。
  • Content-Type 实体头部用于指示资源的MIME类型 media type 。

    Content-Type: text/html; charset=utf-8
    Content-Type: multipart/form-data; boundary=something

TCP/IP协议栈

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。
是一个协议集合。

历史上这些协议是美国军方使用的技术,后来用于民用并且不断发展,并被ISO标准化。
ISO:国际标准化组织
OSI:开放式系统互联

IOS/OSI标准 实际实现
应用层
表示层
会话层
应用层
传输层 传输层
网络层 网络层
数据链路层 物理层
数据链路层 网络接口层

各层分工

应用层

HTTP协议、FTP、DNS、SMTP等

传输层

TCP协议:可靠的传输
UDP协议:无连接的传输协议。虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。用于上传/和下载等场景

网络层

IP协议:是网际互联层最终要的协议,主要解决主机到主机的通信问题

数据链路层

MAC地址

物理层

电缆,网线等网络介质

协议封装/解析过程

封装:应用层数据被包装成传输层数据,接着被网络层包装,到达物理层被转换成电/光信号传输
解析:光/电信号被转换成网络层数据,到达传输层被剥离成传输层数据,到达应用层继续被剥离称应用层数据,到达应用程序解析得到实际数据。

HTTP的工作过程

一次HTTP操作被称为一个事物,操作中的某一步出现错误,那么错误信息将返回到客户端。事物步骤如下

  • 客户机与服务器建立连接(底层TCP连接建立),HTTP工作开始
  • 建立连接后发送请求报文
  • 服务器接收到请求报文,给予响应报文
  • 客户端接收到响应报文,断开链接。进行显示

扩展

traceroute

追踪网络路由设备的命令行工具,示例:

1
2
3
4
5
6
7
8
9
10
> traceroute www.baidu.com
traceroute: Warning: www.baidu.com has multiple addresses; using 180.101.49.12
traceroute to www.a.shifen.com (180.101.49.12), 64 hops max, 52 byte packets
1 30.73.26.254 (30.73.26.254) 2.867 ms 2.219 ms 1.861 ms
2 30.73.2.73 (30.73.2.73) 0.669 ms 0.657 ms 0.353 ms
3 30.73.1.69 (30.73.1.69) 5.739 ms 2.262 ms 2.009 ms
4 30.73.1.134 (30.73.1.134) 0.795 ms 0.725 ms 0.757 ms
5 30.73.1.5 (30.73.1.5) 5.567 ms 2.629 ms 2.556 ms
6 45.112.221.193 (45.112.221.193) 9.447 ms 9.271 ms
...

上面的命令行输出中,每一个路由设备都会产生一行记录。程序利用增加存活时间(TTL/跳转计数/跳)值来实现其功能。每当数据包经过一个路由器,其存活时间就会减1。当其存活时间是0时,主机便取消数据包,并传送一个ICMP TTL数据包给原数据包的发出者。

ping

网络诊断工具,检测主机之间通信是否正常。示例:

1
2
3
4
5
6
> ping baidu.com
PING baidu.com (39.156.69.79): 56 data bytes
64 bytes from 39.156.69.79: icmp_seq=0 ttl=48 time=27.729 ms
64 bytes from 39.156.69.79: icmp_seq=1 ttl=48 time=27.372 ms
64 bytes from 39.156.69.79: icmp_seq=2 ttl=48 time=27.403 ms
64 bytes from 39.156.69.79: icmp_seq=3 ttl=48 time=28.228 ms

git
https://jacksiongt.github.io/2021/04/30/HTTP/
作者
Jacksion
发布于
2021年4月30日
许可协议