0%

HTTP 详解

HTTP

HTTP (超文本传输协议)是应用层最重要的协议,默认端口是TCP 80。

基本特性

HTTP分为请求报文和响应报文。

无连接

HTTP客户端,即浏览器发出请求后,客户端等待响应。服务器处理该请求并发送回响应,然后客户端断开连接。客户端和服务器仅在当次请求中互相了解,至于上一次是否有连接或者连接的信息是无从得知的。

独立于媒体

这意味着,只要客户端和服务器都知道如何处理数据内容,任何类型的数据都可以通过HTTP发送。客户端和服务器都需要使用适当的 MIME 类型 指定内容类型。

无状态

如上所述,HTTP 是无连接的,这是 HTTP 是无状态协议的直接结果。服务器和客户端仅在当前请求期间彼此知道,之后他们俩彼此忘记。由于协议的这种性质,客户端和浏览器都无法在整个网页的不同请求之间保留信息。

HTTP Request

一个HTTP请求报文由请求行请求首部请求体组成。
在传递响应后,Web 服务器将关闭连接。这种连接称为无状态连接,因为它仅在数据交换期间存在。

请求行

1
Method Request-URI HTTP-Version CRLF 

Method表示请求方法;
Request-URI是一个统一资源标识符;
HTTP-Version表示请求的HTTP协议版本;
CRLF 表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CRLF字符)。
请求方法:

1
2
3
4
5
6
7
8
GET : 请求获取Request-URI所标识的资源
POST :在Request-URI所标识的资源后附加新的数据
HEAD :请求获取由Request-URI所标识的资源的响应消息报头
PUT : 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE :请求服务器删除Request-URI所标识的资源
TRACE :请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT:保留将来使用
OPTIONS :请求查询服务器的性能,或者查询与资源相关的选项和需求

请求首部

HTTP请求首部包括:请求首部字段通用首部字段实体首部字段,每一个报头域都是由名字 + : + 空格 + 组成,消息报头域的名字是大小写无关的。

请求体

请求的内容

HTTP Response

HTTP响应报文由状态行响应首部响应体组成。

状态行

状态码用于告知请求方当次请求的状态是成功还是失败:

类别 说明
1XX Informational(信息性状态码)
2XX Success(成功状态码)
3XX Redirection(重定向)
4XX Client Error(客户端错误状态码)
5XX Server Error(服务器错误状态码)

响应首部

HTTP响应首部包括:响应首部字段通用首部字段实体首部字段,每一个报头域都是由名字 + : + 空格 + 组成,消息报头域的名字是大小写无关的。

响应体

响应的正文

HTTP请求首部和响应首部的所有字段

请求首部和响应首部分别作为h请求报文和响应报文的重要组成部分,包括请求首部字段响应首部字段通用首部字段实体首部字段。其中通用首部字段实体首部字段请求和响应报文共有的。
通用首部字段:
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。

字段名 说明
Cache-Control 控制缓存行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Transfer-Encoding 指定报文传输主体的编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

请求首部字段:
允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。

字段名 说明
Accept:text/html application/xml 告诉服务器客户端浏览器这边可以出里什么数据
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Authorization Web认证信息
Except 期待服务器的特定行为
Host 请求资源所在的服务器
if-Match 比较实体标记(ETag)
if-Modified-Since 比较资源的更新时间
Range 实体的字节范围请求
Refer 实体的字节范围请求
TE 传输编码的优先级
User-Agent HTTP客户端程序的信息

响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。常见的响应报头包括:

字段名 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过的时间
ETag 资源的匹配信息
Location 令客户端重定向至指定UPI
Proxy-Authenticate 代理服务器对客户端的认证信息
WWW-Authenticate 服务器对客户端的认证信息
Server HTTP服务器的安装信息
Vary 代理服务器的管理信息

实体首部字段
请求和响应消息都可以传送一个实体。一个实体由实体首部域和实体正文组成,但并不是说实体首部域和实体正文要在一起发送,可以只发送实体报头域。实体首部字段定义了关于实体正文和请求所标识的资源的元信息。

字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小
Content-Location 替代对应资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
EXpires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间

HTTP的多个版本

HTTP 0.9

第一个版本的HTTP协议,已过时。它的组成极其简单,只允许客户端发送GET这一种请求,且不支持请求头。由于没有协议头,造成了HTTP 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言格式化,同时无法插入图片。

HTTP 1.0

HTTP协议的第二个版本,相对于HTTP 0.9 增加了如下主要特性:

  • 请求与响应支持头域
  • 响应对象以一个响应状态行开始
  • 响应对象不只限于超文本
  • 开始支持客户端通过POST方法向Web服务器提交数据,支持GET、HEAD、POST方法
  • (短连接)每一个请求建立一个TCP连接,请求完成后立马断开连接。这将会导致2个问题:连接无法复用,head of line blocking。连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类请求影响较大。head of line blocking会导致带宽无法被充分利用,以及后续健康请求被阻塞。

HTTP 1.1

HTTP协议的第三个版本,是目前使用最广泛的协议版本
HTTP 1.1引入了许多关键性能优化:keepalive连接,chunked编码传输字节范围请求请求流水线

Persistent Connection(keepalive连接)

允许HTTP设备在事务处理结束之后将TCP连接保持在打开的状态,以便未来的HTTP请求重用现在的连接,直到客户端或服务器端决定将其关闭为止。在HTTP1.0中使用长连接需要添加请求头 Connection: Keep-Alive,而在HTTP 1.1 所有的连接默认都是长连接,除非特殊声明不支持( HTTP请求报文首部加上Connection: close )。服务器端按照FIFO原则来处理不同的Request。

chunked编码传输

该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束,这在实体长度未知时特别有用(比如由数据库动态产生的数据)

字节范围请求

HTTP1.1支持传送内容的一部分。比方说,当客户端已经有内容的一部分,为了节省带宽,可以只向服务器请求一部分。该功能通过在请求消息中引入了range头域来实现,它允许只请求资源的某个部分。在响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。如果服务器相应地返回了对象所请求范围的内容,则响应码206(Partial Content)

Pipelining

Pipelining

HTTP 2.0

HTTP 2.0是下一代HTTP协议,目前应用还非常少。

多路复用 (二进制分帧)

将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。
Multiplexing

HTTPS

Hypertext Transfer Protocol Secure
简单讲HTTPS就是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTP和HTTPS不同点

  1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

SSL(Secure Socket Layer)的握手过程

SSL

TLS和SSL的区别

两者虽然不是一个东西,但是区别极小,可以理解为版本更迭

1
2
3
TLS 1.0 = SSL 3.1
TLS 1.1 = SSL 3.2
TLS 1.2 = SSL 3.3