美文网首页
HTTP 协议

HTTP 协议

作者: wuchao226 | 来源:发表于2021-08-18 17:50 被阅读0次

HTTP 协议

HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协 议。

我们使用 http 来访问 Web 上某个资源,比如 html/文本、word、avi 电影、 其他资源。官方协议网站:https://tools.ietf.org/html/rfc2608

HTTP 使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和 建立连接。URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的信息。

URL,全称是 UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。

URI 和 URL 的区别:

URI 是个纯粹的句法结构,用于指定标识 Web 资源的字符串的各个不同部分。
URL 是 URI 的一个特例,它包含了定位 Web 资源的足够信息。其他 URI,比如
mailto:cay@horstman.com 则不属于定位符,因为根据该标识符无法定位任何资源。

URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子 类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto 就是一个 URN 的示例。

URL 是 uniform resource locator,统一资源定位器,它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。

一个完整的 URL

包括以下几部分:
http://www.baidu.com:8080/news/index.asp?boardID=5&ID=24618&page= 1#name

  1. 协议部分:该 URL 的协议部分为“http:”,这代表网页使用的是 HTTP 协议。在 Internet 中可以使用多种协议,如 HTTP,FTP 等等本例中使用的是 HTTP 协议。在"HTTP"后面的“//”为分隔符

  2. 域名部分:该 URL 的域名部分为“www.baidu.com”。一个 URL 中, 也可以使用 IP 地址作为域名使用

  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。 端口不是一个 URL 必须的部分,如果省略端口部分,将采用默认端口

  4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个 URL 必须的部分。本例中的虚拟目录是 “/news/”

  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个 URL 必须的部分,如果省略该部分,则使用默认的文件名

  6. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

  7. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。 锚部分也不是一个 URL 必须的部分

一次完整 http 请求的过程

  1. 首先进行 DNS 域名解析(本地浏览器缓存、操作系统缓存或者 DNS 服务器)
    a)首先会搜索浏览器自身的 DNS 缓存(缓存时间比较短,大概只有 1 分钟, 且只能容纳 1000 条缓存)
    b)如果浏览器自身的缓存里面没有找到,那么浏览器会搜索系统自身的 DNS 缓存
    c)如果还没有找到,那么尝试从 hosts 文件里面去找
    d)在前面三个过程都没获取到的情况下,就去域名服务器去查找

  2. 三次握手建立 TCP 连接
    在 HTTP 工作开始之前,客户端首先要通过网络与服务器建立连接,HTTP 连接是通过 TCP 来完成的。HTTP 是比 TCP 更高层次的应用层协议,根据规则, 只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连 接,一般 TCP 连接的端口号是 80;

  3. 客户端发起 HTTP 请求

  4. 服务器响应 HTTP 请求

  5. 客户端解析 html 代码,并请求 html 代码中的资源
    浏览器拿到 html 文件后,就开始解析其中的 html 代码,遇到 js/css/image 等静态资源时,就向服务器端去请求下载

  6. 客户端渲染展示内容

  7. 关闭 TCP 连接
    一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接, 然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive , TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求,也就是说前面的 3 到 6,可以反复进行。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

DNS 劫持和 HTTP 劫持

DNS 是 Domain Name System 的简写,即域名系统,它作为可以将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。简单地说,如果我们想访问 DNS.COM 的官网,本来需要输入网站主机的 IP 地址,但是 DNS 可以将 www.dns.com 解析成对应的 IP 地址,我们就不需要记住复杂的 IP 地址 了。

DNS 劫持就是通过劫持了 DNS 服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原 IP 地址转入到修改后的指定 IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS 劫持通过篡改 DNS 服务器上 的数据返回给用户一个错误的查询结果来实现的。

DNS 劫持常见于使用自动的 DNS 地址,所以,不管有没有被劫持,尽量不要使用运营商默认的 DNS。

HTTP 劫持:
在运营商的路由器节点上,设置协议检测,一旦发现是 HTTP 请求,而且是 html 类型请求,则拦截处理。后续做法往往分为 2 种,1 种是类似 DNS 劫持返回 302 让用户浏览器跳转到另外的地址,还有 1 种是在服务器返回的 HTML 数据中插入 js 或 dom 节点(广告)。比如访问 GitHub,出现了“我是渣渣辉,是兄 弟就来砍我”之类的小弹窗。

有两种 HTTP 劫持防劫持思路

  1. 采用 https 协议加密请求。但是 https 多了 ssl 握手的过程,会耗费一定的时间和性能。

  2. 隐藏 http 请求的特征,例如使用对称加密算法加密整个 url。市面上的各大手机应用商店都采用了这种做法。相较于 https,url 加密的兼容性更好,并且对 CDN 节点带来的解密额外负担可以忽略,但是 url 加密需要 CDN 节点的密切配合。

相关文章

网友评论

      本文标题:HTTP 协议

      本文链接:https://www.haomeiwen.com/subject/quigbltx.html