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
协议部分:该 URL 的协议部分为“http:”,这代表网页使用的是 HTTP 协议。在 Internet 中可以使用多种协议,如 HTTP,FTP 等等本例中使用的是 HTTP 协议。在"HTTP"后面的“//”为分隔符
域名部分:该 URL 的域名部分为“www.baidu.com”。一个 URL 中, 也可以使用 IP 地址作为域名使用
端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。 端口不是一个 URL 必须的部分,如果省略端口部分,将采用默认端口
虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个 URL 必须的部分。本例中的虚拟目录是 “/news/”
文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个 URL 必须的部分,如果省略该部分,则使用默认的文件名
参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。 锚部分也不是一个 URL 必须的部分
一次完整 http 请求的过程
首先进行 DNS 域名解析(本地浏览器缓存、操作系统缓存或者 DNS 服务器)
a)首先会搜索浏览器自身的 DNS 缓存(缓存时间比较短,大概只有 1 分钟, 且只能容纳 1000 条缓存)
b)如果浏览器自身的缓存里面没有找到,那么浏览器会搜索系统自身的 DNS 缓存
c)如果还没有找到,那么尝试从 hosts 文件里面去找
d)在前面三个过程都没获取到的情况下,就去域名服务器去查找三次握手建立 TCP 连接
在 HTTP 工作开始之前,客户端首先要通过网络与服务器建立连接,HTTP 连接是通过 TCP 来完成的。HTTP 是比 TCP 更高层次的应用层协议,根据规则, 只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连 接,一般 TCP 连接的端口号是 80;客户端发起 HTTP 请求
服务器响应 HTTP 请求
客户端解析 html 代码,并请求 html 代码中的资源
浏览器拿到 html 文件后,就开始解析其中的 html 代码,遇到 js/css/image 等静态资源时,就向服务器端去请求下载客户端渲染展示内容
-
关闭 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 劫持防劫持思路
采用 https 协议加密请求。但是 https 多了 ssl 握手的过程,会耗费一定的时间和性能。
隐藏 http 请求的特征,例如使用对称加密算法加密整个 url。市面上的各大手机应用商店都采用了这种做法。相较于 https,url 加密的兼容性更好,并且对 CDN 节点带来的解密额外负担可以忽略,但是 url 加密需要 CDN 节点的密切配合。