Http

340 阅读10分钟

非专业人士撰写,仅供参考。欢迎批评和指正!

URL

统一资源定位器(Uniform Resource Locator,URL)是万维网(World Wide Web,www)程序上用于指定资源位置的表示方法。URL的语法如下:

# scheme:方案,常见的有http, https, ftp, telnet等(不区分大小写)
# username: 用户名
# password: 密码
# host: 主机名
# port: 端口
# path: 路径
<scheme>://<username>:<password>@<host>:<port>/<path>

# 无密码
<scheme>://<username>@<host>:<port>/<path>

# 无用户名和密码
<scheme>://<host>:<port>/<path>

# 无用户名、密码,使用默认端口
<scheme>://<host>/<path>

实际上,当URL中没有指明端口时,服务器会根据URL的方案,接入默认端口。通常来说,处理http的默认端口号为80,处理https的默认端口号为443。

HTTP 消息结构

HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。HTTP是TCP协议应用层的传输协议,是客户端(client)与服务端(server)进行数据传输的一种规则。

  • 客户端指HTTP请求的发起者。客户端与服务端的角色是不固定的,网络中的任意一台主机都可能在一次请求中充当客户端,在另一次请求中充当服务端。
  • HTTP是一种无状态的(stateless)协议,即HTTP不会对发送过的请求中建立的通信状态进行持久化(persistence)处理。

HTTP 请求(request)

img

如上图所示,method是请求方法,包括GET、POST等;sp是空格字符;version是http的版本号,crlf分别为回车符和换行符;header field name指头部字段名称,value就是该字段对应的值。在header lines(请求头部/报头)后有一个空行,其后就是Entity Body,即请求数据(一般简称body)。以下是一个HTTP请求示例:

POST http://api.xxxxxx.com/api/v1/blog/ HTTP/1.1
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Content-Length: 128

title:my holiday
isPublic:true

HTTP 响应(response)

response

HTTP响应与请求类似,首行略有区别。status code为状态码,紧随的phrase为状态码短语。以下是一个HTTP响应示例:

HTTP/1.1 200 OK
Date: Sat, 20 March 2021 15:34:21 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

{"message":"successfully add blog.","request_url":"http://api.xxxxxx.com/api/v1/blog/"}

HTTP 参数(parameter)

HTTP有两种传递参数的方式,一种是在URL中,在路径后面紧接一个?和一个字符串,该字符串称为查询字符串(query string),这种参数称为GET参数;还可以在body中传递参数(如HTTP请求示例中展示的样式),称为POST参数。查询字符串的格式如下:

key1=value1&key2=value2&key3=value3...

此外一般约定,当请求方法为GET时,不传递POST参数,所有参数均通过GET参数传递;当请求方法不为GET时,可以通过两种方式传递参数。两种参数的传递方式的对比如下:

  1. GET参数是与URL一起暴露的,安全性不如POST参数。
  2. 网址是由URL和query string组成的,当用户收藏网址时,浏览器会连同query string一起存储到书签中。
  3. GET参数传输的数据量较小,POST参数则不受限制(但实际上会有限制,但最大传递数据量比GET参数大得多)。
  4. 表单数据一般使用POST上传。

请求方法 (method)

#方法描述
1GET请求指定的页面信息或资源,并返回实体主体。
2HEAD类似GET,但相应中没有具体的内容,由于获取请求头部(报头)。
3POST向指定资源提交数据进行处理请求(如提交表单或上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。
4PUT从客户端向服务器传送的数据取代指定文档的内容。
5DELETE请求服务器删除指定资源。
6PATCH对指定资源应用部分修改。

实际上,请求方法只是一种规范,开发者应该遵循这个规范编写接口。虽然说编写一个POST接口用于删除指定资源是可行的,但这会使得其他使用者在调用接口时感到不解。

头信息(header field)

HTTP的头信息包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名(field name),冒号(:)和域值(value)三部分组成。

  • 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
  • 请求头标:允许客户端传递关于自身的信息和希望的响应形式。
  • 响应头标:服务器和于传递自身信息的响应。
  • 实体头标:定义被传送资源的信息。既可用于请求,也可用于响应。

头信息的请求头(request header)和响应头(response header)较多,其含义也较为复杂,具体内容可见此文1

HTTP状态码(HTTP status code)

HTTP状态码有如下五种:

区间描述
100~199服务器收到请求,需要请求者继续执行操作
200~299操作被成功接收并处理
300~399重定向,需要进一步的操作以完成请求
400~499客户端错误,请求包含语法错误或无法完成请求
500~599服务器错误,服务器在处理请求的过程中发生了错误

常见的HTTP状态码如下,全部状态码及描述请见2

短语描述
200OK请求所希望的响应头或数据体将随此响应返回。
201Created成功请求并创建了新的资源。
202Accepted已经接受请求,但未处理完成。
204No Content服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档。
301Moved Permanently请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替。
400Bad Request客户端请求的语法错误,服务器无法理解。
401Unauthorized请求要求用户的身份认证。
403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求。
404Not Found服务器无法根据客户端的请求找到资源。
422Unprocessable Entity请求格式正确,但是由于含有语义错误,无法响应。
500Internal Server Error服务器内部错误,无法完成请求。
502Bad Gateway充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。
503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。

非持久连接持久连接

客户端在短时间内发送一系列请求,服务端对每个请求进行响应。对于这些请求,如果每次都经过一个单独的TCP连接发送,称为非持久连接;反之,如果这一系列的请求和响应都经过相同的TCP连接进行发送,称为持久连接

互联网早期页面资源单一,大多是静态页面,交互能力弱,短时间内的请求较少。但如今网页愈发复杂,用户打开一个页面时,往往需要发送十几,甚至几十个请求,使用非持久连接将为服务器带来了沉重的负担和开销。为了解决这种情况,持久连接就诞生了。它的特点是在一段时间内一直保持TCP连接状态,直至遇到明确的中断要求后再中断连接。持久连接减少了通信开销,节省了通信量。

connection-types

上图中最左侧的是非持久连接,每次请求和响应结束后,都要进行close connection(关闭连接)和establish connection(建立连接)。中间的是为持久连接,它只在接收第一个请求前建立连接,在最后一个响应结束后关闭连接。

图中最右侧的是HTTP Pipelining(管道技术)是HTTP1.1推出的,即把多个HTTP请求放在同一个TCP连接中一一发送,而在发送过程中无需等待服务器对前一个请求的响应,但是客户端仍需要按照发送请求的顺序接收响应。这种技术会出现线头阻塞(Head of blocking)的问题3

HTTPS

HTTPS基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护。HTTP是明文传输文件的,可能会被窃听,造成数据泄露、数据篡改、流量劫持、钓鱼攻击等安全问题4;而HTTPS不是明文传输,这就避免了被抓包后篡改数据。HTTPS有如下特点5

  • 内容加密:采用混合加密(对称加密和非对称加密混合)技术,中间者无法直接查看明文内容。
  • 验证身份:通过证书认证客户端访问的是自己的服务器。
  • 保护数据完整性:防止传输的内容被中间人冒充或篡改。

HTTPS相比于HTTP而言,增加了一个SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全传输层协议)的组合使用,加密HTTP的通信内容。属于通信加密,即在整个通信线路中加密。

可以将HTTPS分为证书验证阶段数据传输阶段,具体的交互过程如下6

  • 证书验证阶段
    1. 浏览器发起HTTPS请求
    2. 服务端返回HTTPS证书(certificate)和公钥(public key)
    3. 客户端验证证书是否合法,如果不合法则提示警告。
  • 数据传输阶段
    1. 证书验证合法后,浏览器在本地生成一个随机数
    2. 通过公钥加密随机数,并把加密后的随机数传输到服务器端
    3. 服务端通过私钥(private key)对随机数进行解密
    4. 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输(由此可见,浏览器生成的随机数作为对称加密的密钥)

数据传输使用对称加密的原因是:非对称加密的效率非常低,HTTP的应用场景中端与端之间存在大量交互,非对称加密的效率是无法令人接受的。

HTTPS的不足:①加密和解密过程复杂,导致访问速度慢;②需要向认证机构(即颁发合法证书的机构)付费;③页面中所有请求都必须使用HTTPS(那些不包含敏感信息的请求也要使用HTTPS请求,效率低下)。

HTTP 2

http/2 究竟有多快?| http2 http1.1 http1.0 对比评测 该视频对理解HTTP2非常有帮助,专业性强,推荐观看。

HTTP2有几项技术性突破,速度比HTTP1.1有明显的提升。核心技术包括二进制分帧、多路复用(代替原来的序列和阻塞机制,解决线头阻塞问题)和头部压缩等,详见此文:一文读懂 HTTP/2 特性

Footnotes

  1. www.jb51.net/article/519…

  2. tools.jb51.net/table/http_…

  3. www.jianshu.com/p/506d05e3a…

  4. segmentfault.com/a/119000001…

  5. blog.csdn.net/xiaoming100…

  6. baijiahao.baidu.com/s?id=165214…