http协议

  • 当我们在浏览器中输入 http://www.baidu.com/ 访问百度的时候浏览器做了哪些事情。(这里以 Chrome 浏览器为例)

  1. 首先 Chrome 搜索自身的 DNS 缓存。(如果 DNS 缓存中找到百度的 IP 地址,就跳过了接下来查找 IP 地址步骤,直接访问该 IP 地址。)
  2. 搜索操作系统自身的 DNS 缓存。(浏览器没有找到缓存或者缓存已经失效)
  3. 读取硬盘中的 host 文件,里面记录着域名到 IP 地址的映射关系,Mac 电脑中位于 /etc/hosts。(如果前1.2步骤都没有找到)
  4. 浏览器向宽带运营商服务器或者域名服务器发起一个 DNS 解析请求,这里服务器有两种方式解析请求,这在稍后会讲到,之后浏览器获得了百度首页的 IP 地址。
  5. 拿到 IP 地址后,浏览器就向该 IP 所在的服务器建立 TCP 连接(即三次握手)。
  6. 连接建立起来之后,浏览器就可以向服务器发起 HTTP 请求了。(这里比如访问百度首页,就向服务器发起 HTTP 中的 GET 请求)
  7. 服务器接受到这个请求后,根据路径参数,经过后台一些处理之后,把处理后的结果返回给浏览器,如果是百度首页,就可以把完整的 HTML 页面代码返回给浏览器。
  8. 浏览器拿到了百度首页的完整 HTML 页面代码,内核和 JS 引擎就会解析和渲染这个页面,里面的 JS,CSS,图片等静态资源也通过一个个 HTTP 请求进行加载。
  9. 浏览器根据拿到的资源对页面进行渲染,最终把完整的页面呈现给用户。
  10. 如果浏览器没有后续的请求,那么就会跟服务器端发起 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
感谢 @林东洲

posted @ 2017-11-30 11:44  阿席巴i  阅读(158)  评论(0)    收藏  举报