UP | HOME

HTTP 协议相关

目录

1 前言

最近在阅读源码的过程中, 因为对 HTTP 协议了解的太少, 使得源码的阅读难以推进。

所以暂停了源码的阅读, 腾出时间来解决阅读源码的过程中遇到的问题。

这篇博客是对 HTTP 协议及相关内容的简单总结。

2 URL 相关

首先来看 统一资源定位符 URL.

常见的 URL 的格式是这样的:

scheme:[//host[:port]][/path][?query][#fragment]

还有一种不常见的:

scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

这种格式中的 userpassword 是访问资源时需要的凭证信息, 因为安全问题几乎被遗弃了。

其它组成的含义如下:

名称 含义 例子
scheme 协议类型 http, https, ftp, file
host 服务器地址 github.com, 127.0.0.1
port 端口号(默认为 80) 80, 8080
path 资源层级 UNIX 文件路径 /explore
query 查询字符串(使用 & 链接不同项) ?game=snake&score=100
fragment 页内链接 #top
URL 的编码

由于 URL 只能包含部分 ASCII 字符, 所以其他字符都需要进行 百分号编码.

百分号编码 类似于 %E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81, 通常为字符对应的 UTF-8 字节序和转义字符 % 的组合。

当然, 也可能遇到特殊情况, 需要了解的可以看一下阮一峰老师的博客 关于URL编码.

更多的内容:

3 HTTP 概览

首先, HTTP 是一个协议, 主要规定了 客户端服务端 之间数据传输的 格式.

简单来说就是: HTTP 规定了 客户端服务端 传输的数据的 结构, 而没有规定怎样将数据传过去。

3.1 HTTP 报文

HTTP 报文 在一定程度是就是 HTTP 协议的数据结构。

有两种 HTTP 报文的类型, 请求与响应, 每种都有其特定的格式:

请求

由客户端向服务端发送。

HTTP_Request.png

响应

服务端对客户端请求的反馈。

HTTP_Response.png

HTTPMsgStructure2.png

请求响应 报文的结构都可以划分为 Status line, Header, Body 三个部分。

请求状态行 包含了 请求方法, 资源路径协议版本.

响应状态行 包含了 协议版本, 状态码状态信息.

常用的 请求方法:

方法 作用
GET 获取资源
POST 发送数据到服务端

创建的 状态码:

状态码 状态信息 含义  
200 OK 请求成功  
401 Unauthorized 当前请求需要用户验证  
403 Forbidden 服务器已经理解请求, 但是拒绝执行它  
404 Not Found 请求资源不存在或已被墙  
500 Internal Server Error 服务器遇到了不知道如何处理的情况  

注: 状态信息可以由服务端自己定义。

3.2 HTTP 消息头

HTTP 消息头 的格式为 Name: Value.

其中, Name 不区分大小写, Value 不能有 换行符. 同时 Value 前面的空格会被忽略。

客户端服务端 可以通过 消息头 来传递额外的信息。

消息头 也使得 HTTP 协议易于扩展, 只要 客户端服务端消息头 上达成共识。

User-Agent
用户代理
Set-Cookie
响应 头部, 设置 Cookie
Cookie
请求 头部, 发送 Cookie
WWW-Authenticate
响应 头部, 指定身份验证的方法
Authorization
请求 头部, 包含证明用户代理身份的凭证
Proxy-Authenticate
响应 头部, 指定身份验证的方法
Proxy-Authorization
请求 头部, 包含证明用户代理身份的凭证

3.3 HTTP Cookie

由于 HTTP无状态 的协议, 因此无法直接判断两个 请求 之间的关系。

如果需要对 请求 进行辨识, 那么就可以使用 Cookie 来实现。

服务端 可以通过 响应头 来设置 客户端保存Cookie 信息, 客户端 在发起新的请求的时候会将 Cookie 信息一同发送。

这时 服务端 可以通过 Cookie 来判断 请求.

Cookie 和其他 消息头 的最大区别应该就是可以 保存 吧.

Cookie 的格式为 name=value, 不同的键值使用 ; 分隔。

如果要了解如何 创建 Cookie, 可以前往 ☞ 创建Cookie.

Session

Cookie 都有了, Session 怎么能少呢 ?

HTTP 没有规定 Session 的实现, Session 通常是在 服务端 创建的某种 数据结构.

用于保存某些信息, 比如用户的在线信息。

当用户上线后创建一个 Session 保存用户的在线信息, 并在返回的 响应头 中包含与这个 Session 相关的数据。

再次获得用户的 请求 后, 通过 请求头CookieSession 中查询对应的用户信息。

如果存在就代表 用户在线, 不存在便可以要求用户 登录.

当然, 这些只是一种设想, 实际的实现肯定有所区别。

3.4 HTTP 身份验证

某些情况下, 客户端服务端 发送请求后, 服务端 会返回 401 状态码, 说明需要验证消息,并在 WWW-Authenticate 头中指定 验证方式.

HTTPAuth.png

类似的, 服务端 还可以返回 407 状态码说明需要 代理认证, 并在 Proxy-Authenticate 中指明验证方式。

客户端 可以通过 AuthorizationProxy-Authorization 发送验证信息。

WWW-AuthenticateProxy-Authenticate 的格式为:

WWW-Authenticate: <type> realm=<realm>
Proxy-Authenticate: <type> realm=<realm>

其中, <type> 指明验证方案的类型, realm 描述进行保护的区域.

请求头 的格式与之类似:

Authorization: <type> <credentials>
Proxy-Authorization: <type> <credentials>

<type> 为验证方案类型, <credentials> 为验证信息。

对于验证方案的使用, 可以前往 ☞ 基本验证方案.

4 参考链接

版权声明:本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可