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外,不允许出现单独的CR或LF字符)。
请求方法:1
2
3
4
5
6
7
8GET : 请求获取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

HTTP 2.0
HTTP 2.0是下一代HTTP协议,目前应用还非常少。
多路复用 (二进制分帧)
将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。
HTTPS
Hypertext Transfer Protocol Secure
简单讲HTTPS就是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTP和HTTPS不同点
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
SSL(Secure Socket Layer)的握手过程

TLS和SSL的区别
两者虽然不是一个东西,但是区别极小,可以理解为版本更迭1
2
3TLS 1.0 = SSL 3.1
TLS 1.1 = SSL 3.2
TLS 1.2 = SSL 3.3