HTTP学习笔记
一、HTTP方法
客户端发送的请求报文第一行为请求行,包含了方法字段。如GET请求:
GET http://www.example.com/ HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Host: www.example.com
If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
If-None-Match: "3147526947+gzip"
Proxy-Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 xxx
param1=1¶m2=2
GET
获取资源
现在大多数网络请求中,绝大部分使用的是GET方法。
HEAD
获取报文首部
与GET方法类型,但不会返回报文主体部分。主要用于确认URL的有效性以及资源更新的日期时间等。
POST
传输实体主体
POST主要同于传输数据,而GET主要用来回去资源。
PUT
上传文件
由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
PATCH
对资源进行部分修改
PUT也可以用于修改资源,但是只能完全替换原始资源;PATCH允许部分修改。
DELETE
删除文件
与PUT功能相反,并且同样不带验证机制。
OPTIONS
查询支持的方法
查询指定的URL能够支持的方法。会返回 Allow:GET,POST,HEAD,OPTIONS 这样的内容。
CONNECT
要求在与代理服务器通信是建立隧道
TRACE
追踪路径
服务器会将通信路径返回给客户端。通常不会使用 TRACE,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪)。
二、HTTP状态码
服务器返回的响应报文中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。
| 状态码 | 类别 | 含义 |
|---|---|---|
| 1XX | Informational(信息性状态码) | 接收的请求正在处理 |
| 2XX | Success(成功状态码) | 请求正常处理完毕 |
| 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
| 4XX | Client Error(客户端错误状态码) | 客户端无法处理请求 |
| 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
1XX 信息
- 100 Continue:表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。
2XX 成功
- 200 OK
- 204 No Content:请求已经成功处理,但是返回的响应保卫不包含实体的主体部分。一般只需要从客户端往服务器发送信息,而不需要返回数据时使用。
- 206 Partial Content:表示客户端进行了范围请求,响应报文包含有Content-Range指定范围的实体内容。
3XX 重定向
- 301 Moved Permanently:永久性重定向
- 302 Found:临时性重定向
- 303 See Other:和302有着相同的功能,但是303明确要求客户端应该采用GET方法获取资源。
- 304 Not Modified:如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回304状态码。
- 307 Temporary Redirect:临时重定向,与302的含义类似,但是307要求浏览器不会把重定向请求的POST方法改为GET方法。
4XX 客户端错误
- 400 Bad Request:请求报文中存在语法错误。
- 401 Unauthorized:该状态码表示发送的请求需要有认证信息(BASIC认证、DIGEST认证)。如果之前已进行过一次请求,则表示用户认证失败。
- 403 Forbidden:请求被拒绝。
- 404 Not Found:找不到页面。
5XX 服务器错误
- 500 Internal Server Error:服务器正在执行请求时发生错误。
- 503 Service Unavailable:服务器暂时处于超负载或正在停机维护,现在无法处理请求。
三、HTTPS
HTTP有以下安全性问题:
- 使用明文进行通信,内容可能会被窃听;
- 不验证通信方的身份,通信方的身份有可能遭遇伪装;
- 无法证明报文的完整性,报文有可能遭篡改。
HTTPS并不是新协议,而是让HTTP先和SSL通信,再由SSL和TCP通信,也就是说HTTPS使用了隧道进行通信。
通过使用SSL,HTTPS具备了以下特点:
- 加密(防窃听)
- 认证(防伪装)
- 完整性保护(防篡改)
HTTPS的加密算法
1.对称加密
加密和解密使用同一密钥。
- 优点:运算速度快;
- 缺点:无法安全地将密钥传输给通信方。

2.非对称加密
又称为公开密钥加密,加密和解密使用不同的密钥。
公开密钥所有人都可以获取,通信发送方获得接收方的公开密钥后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私钥解密。
- 优点:可以更安全地将公开密钥传输给通信发送方;
- 缺点:运算速度慢。

3.HTTPS采用的加密方式
上面提到的对称加密方式的传输效率更高,但是无法安全地将密钥Secret Key传输给通信方。而非对称加密方式可以保证传输的安全性,因此我们可以利用非对称加密方式将Secret Key传输给通信方。HTTPS采用混合的加密机制,正是利用了上面提到的方案:
- 使用非对称加密方式,传输对称加密方式所需要的Secret Key,从而保证安全性;
- 获取到Secret Key后,再使用对称加密方式进行通信,从而保证效率。
HTTPS的缺点
- 因为需要进行加密解密等过程,所以速度会更慢;
- 需要支付证书授权的高额费用。
四、网络传输层协议
UDP和TCP的特点
- 用户数据报协议 UDP:是无连接的,尽最大可能交付,没有拥塞控制,面向报文,支持一对一、一对多、多对一、多对多的交互通信。

- 传输控制协议 TCP:是面向连接的,提供可靠交付,有流量控制、拥塞控制,提供全双工通信,面向字节流,只能一对一。

TCP的三次握手
假设A为客户端,B为服务器端。
- 首先B处于LISTEN(监听)状态,等待客户端的连接请求;
- A想B发送连接请求报文:同步SYN=1、确认ACK=0、选择一个初始序号X;
- B收到连接请求报文后,若同意,则向A发送连接确认报文:同步SYN=1、确认ACK=1、确认号为X+1、选择一个初始序号Y;
- A收的B的连接确认后,还要向B发出确认:确认号为Y+1、序号为X+1;
- B收到A的确认后,连接建立。
TCP三次握手的原因
第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
TCP的四次挥手
以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论ACK,因为确认ACK在连接建立之后都为1。
- A发送连接释放报文:终止FIN=1;
- B收到之后发出确认,此时TCP处于半关闭状态,B能向A发送数据但A不能向B发送数据;
- 当B不再需要连接时,发出连接释放报文:终止FIN=1;
- A收到后发出确认,进入TIME-WAIT状态,等待2MSL(最大报文存活时间)后释放连接;
- B收到A的确认后释放连接。
TCP四次挥手的原因
客户端发送了FIN连接释放报文后,服务器收到了这个报文,就进入了CLOSE-WAIT状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送FIN连接释放报文。
TCP的流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送效率。将窗口字段设为0,则发送方不能发送数据。
TCP的拥塞控制
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞是,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
TCP主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!