http协议
-
当我们在浏览器中输入 http://www.baidu.com/ 访问百度的时候浏览器做了哪些事情。(这里以 Chrome 浏览器为例)
- 首先 Chrome 搜索自身的 DNS 缓存。(如果 DNS 缓存中找到百度的 IP 地址,就跳过了接下来查找 IP 地址步骤,直接访问该 IP 地址。)
- 搜索操作系统自身的 DNS 缓存。(浏览器没有找到缓存或者缓存已经失效)
- 读取硬盘中的 host 文件,里面记录着域名到 IP 地址的映射关系,Mac 电脑中位于 /etc/hosts。(如果前1.2步骤都没有找到)
- 浏览器向宽带运营商服务器或者域名服务器发起一个 DNS 解析请求,这里服务器有两种方式解析请求,这在稍后会讲到,之后浏览器获得了百度首页的 IP 地址。
- 拿到 IP 地址后,浏览器就向该 IP 所在的服务器建立 TCP 连接(即三次握手)。
- 连接建立起来之后,浏览器就可以向服务器发起 HTTP 请求了。(这里比如访问百度首页,就向服务器发起 HTTP 中的 GET 请求)
- 服务器接受到这个请求后,根据路径参数,经过后台一些处理之后,把处理后的结果返回给浏览器,如果是百度首页,就可以把完整的 HTML 页面代码返回给浏览器。
- 浏览器拿到了百度首页的完整 HTML 页面代码,内核和 JS 引擎就会解析和渲染这个页面,里面的 JS,CSS,图片等静态资源也通过一个个 HTTP 请求进行加载。
- 浏览器根据拿到的资源对页面进行渲染,最终把完整的页面呈现给用户。
- 如果浏览器没有后续的请求,那么就会跟服务器端发起 TCP 断开(即四次挥手)。
至此,整个访问过程就结束了,可见浏览器帮我们做了许多的事。这里只是简单的概括,实际情况远比这些复杂
-
服务器在接受 DNS 解析请求的时候一般会有两种处理方式,它们分别是递归名称解析和迭代名称解析。
递归名称解析: 用户在向根名称服务器发送请求如图中为访问网址为 ftp.cs.vu.nl 之后就不用管后续的请求了,该服务器知道 nl 服务器地址,并向其询问其子域 ftp.cs.vu 的地址,之后不断递归,最终返回给用户最终的 IP 地址
迭代名称解析: 客户端向根名称服务器发送查询 ftp.cs.vu.nl 的地址时候,根名称服务器只知道 nl 地址,它并不管后续的请求,而是将该地址直接返回给用户,而用户在获得地址后继续向 nl 结点服务器询问 ftp.cs.vu 的地址。相当于后续查询需要自己用户来完成,最后拿到 ftp.cs.vu.nl 的 IP 地址。
-
HTTP 请求:
HTTP 定义了在与服务器交互的不同方式,最常用的方法有 4 种,
| 请求方式 | 对应操作 |
|---|---|
| GET | 查询 |
| POST | 修改 |
| PUT | 增添 |
| DELETE | 删除 |
URL 全称为资源描述符,可以这么认为:一个 URL 地址,对应着一个网络上的资源.
-
状态码
| 状态码 | 含义 |
|---|---|
| 1xx | 表示请求已经接受了,继续处理。 |
| 2xx | 表示请求已经处理掉了。 |
| 3xx | 重定向。 |
| 4xx | 一般表示客户端有错误,请求无法实现。 |
| 5xx | 一般为服务器端的错误。 |
常见状态码对应含义:
| 状态码 | 含义 |
|---|---|
| 200 | OK 客户端请求成功。 |
| 301 | Moved Permanently 请求永久重定向。 |
| 302 | Moved Temporarily 请求临时重定向。 |
| 304 | Not Modified 文件未修改,可以直接使用缓存的文件。 |
| 400 | Bad Request 由于客户端请求有语法错误,不能被服务器所理解。 |
| 401 | Unauthorized 请求未经授权,无法访问。 |
| 403 | Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因。 |
| 404 | Not Found 请求的资源不存在,比如输入了错误的URL。 |
| 500 | Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。 |
| 503 | Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。 |
-
HTTP 请求头:
- Accept:指定客户端能够接收的内容类型,如常见的 text/html 等,最后返回的百度首页也是个 HTML 文件。
- Accept-Encoding:表示浏览器有能力解码的编码类型。
gzip是 GNU zip 的缩写,它是一个 GNU 自由软件的文件压缩程序,也经常用来表示 gzip 这种文件格式。deflate是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
- Accept-Language:表示浏览器所支持的语言类型。(这里指中文、简体中文和英文)
- Cache-Control:指定请求和响应遵循的缓存机制。(这里表示不需要缓存)
- Connection:表示是否需要持久连接。(HTTP 1.1 默认进行持久连接即为 keep-alive, HTTP 1.0 则默认为 close)
- Cookie:用于会话追踪,在本文后面就继续介绍。
- Host:表示请求的服务器网址
- User-Agent:用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
- Content-Length: 请求的内容长度
- Referer: 先前访问的网页的地址,当前请求网页紧随其后,说明你是先前是从哪个网址点击访问到该页面的,如果没有则不填。
- Content-Type:内容的类型,GET 请求无该字段,POST 请求中常见的有 application/x-www-form-urlencoded 为普通的表单提交,还有文件上传为 multipart/form-data
-
HTTP 响应头:
- Date:原始服务器消息发出的时间。
- Last-Modified:请求资源的最后修改时间。
- Expires:响应过期的日期和时间,如果下次访问在时间允许的范围内,可以不用重新请求,直接访问缓存。
- Set-Cookie: 设置Http Cookie,下次浏览器再次访问的时候会带上这个 Cookie 值。
- Server:服务器软件名称,常见的有 Apache 和 Nginx。
更多请求头参数请移步: http://tools.jb51.net/table/http_header
本文摘自: https://zhuanlan.zhihu.com/p/24913080
感谢 @林东洲

浙公网安备 33010602011771号