本文是一篇学习笔记,学习的课程是极客时间的《透视HTTP协议》。
透视HTTP协议_HTTP_HTTPS-极客时间 (geekbang.org)
本文主要介绍跟HTTP相关的各种协议。
目录
1、TCP/IP协议
TCP/IP协议是目前网络世界“事实上”的标准通信协议,也是网络世界最常用的协议。HTTP通常运行在TCP/IP提供的可靠传输基础上;
TCP/IP协议实际上是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP,其他的还有UDP、ICMP、ARP等等,共同构成了一个复杂但有层次的协议栈。
TCP协议是“Transmission Control Protocol”的缩写,意思是“传输控制协议”,它位于IP协议之上,基于IP协议提供可靠的、字节流形式的通信,是HTTP协议得以实现的基础。
2、DNS:域名系统
在TCP/IP协议中使用IP地址来标识计算机,数字形式的地址对于计算机来说是方便了,但对于人类来说难以记忆。
“域名系统”(Domain Name System),用有意义的名字来作为IP地址的等价替代。
在DNS中,“域名”(Domain Name)又称为“主机名”(Host),为了更好地标记不同国家或组织的主机,让名字更好记,所以被设计成了一个有层次的结构。
域名用“.”分隔成多个单词,级别从左到右逐级升高,最右边的被称为“顶级域名”。对于顶级域名,可能你随口就能说出几个,例如表示商业公司的“com”、表示教育机构的“edu”,表示国家的“cn”“uk”等,买火车票时的域名还记得吗?是“www.12306.cn”。
但想要使用TCP/IP协议来通信仍然要使用IP地址,所以需要把域名做一个转换,“映射”到它的真实IP,这就是所谓的“域名解析”。
域名解析的过程,就是将IP地址跟DNS映射起来。就像手机号跟人名对应起来。
用打电话做个比喻,你想要打电话给小明,但不知道电话号码,就得在手机里的号码簿里一项一项地找,直到找到小明那一条记录,然后才能查到号码。这里的“小明”就相当于域名,而“电话号码”就相当于IP地址,这个查找的过程就是域名解析。
HTTP协议中并没有明确要求必须使用DNS,但实际上为了方便访问互联网上的Web服务器,通常都会使用DNS来定位或标记主机名,间接地把DNS与HTTP绑在了一起。
DNS域名是IP地址的等价替代,需要用域名解析实现到IP地址的映射;
3、URI/URL:统一资源标识符
DNS和IP地址只是标记了互联网上的主机,但主机上有那么多文本、图片、页面,到底要找哪一个呢?
URI(Uniform Resource Identifier),中文名称是 统一资源标识符,使用它就能够唯一地标记互联网上资源,即根据这个可以找到对应的文本、图片、视频等。
URI另一个更常用的表现形式是URL(Uniform Resource Locator), 统一资源定位符,也就是我们俗称的“网址”,它实际上是URI的一个子集,不过因为这两者几乎是相同的,差异不大,所以通常不会做严格的区分。
例如Nginx网站的URI:http://nginx.org/en/download.html
URI主要有三个基本的部分构成:
-
协议名:即访问该资源应当使用的协议,在这里是“http”;
-
主机名:即互联网上主机的标记,可以是域名或IP地址,在这里是“nginx.org”;
-
路径:即资源在主机上的位置,使用“/”分隔多级目录,在这里是“/en/download.html”。
URI是用来标记互联网上资源的一个名字,由“协议名+主机名+路径”构成,俗称URL;
4、HTTPS
在TCP/IP、DNS和URI的“加持”之下,HTTP协议终于可以自由地穿梭在互联网世界里,顺利地访问任意的网页了。但是访问网页的过程中,数据可能会被窃取,要怎么阻止这种事情?
假设你打电话找小明要一份广告创意,很不幸,电话被商业间谍给窃听了,他立刻动用种种手段偷窃了你的快递,就在你还在等包裹的时候,他抢先发布了这份广告,给你的公司造成了无形或有形的损失。
有没有什么办法能够防止这种情况的发生呢?确实有。你可以使用“加密”的方法,比如这样打电话:
你:“喂,小明啊,接下来我们改用火星文通话吧。”
小明:“好啊好啊,就用火星文吧。”
你:“巴拉巴拉巴拉巴拉……”
小明:“巴拉巴拉巴拉巴拉……”
如果你和小明说的火星文只有你们两个才懂,那么即使窃听到了这段谈话,他也不会知道你们到底在说什么,也就无从破坏你们的通话过程。
HTTPS,它的全称是“HTTP over SSL/TLS”,也就是运行在SSL/TLS协议上的HTTP。
注意它的名字,这里是SSL/TLS,而不是TCP/IP,它是一个负责加密通信的安全协议,建立在TCP/IP之上,所以也是个可靠的传输协议,可以被用作HTTP的下层。
HTTPS相当于“HTTP+SSL/TLS+TCP/IP”。
SSL的全称是“Secure Socket Layer”,由网景公司发明,当发展到3.0时被标准化,改名为TLS,即“Transport Layer Security”,但由于历史的原因还是有很多人称之为SSL/TLS,或者直接简称为SSL。
SSL使用了许多密码学最先进的研究成果,综合了对称加密、非对称加密、摘要算法、数字签名、数字证书等技术,能够在不安全的环境中为通信的双方创建出一个秘密的、安全的传输通道,为HTTP套上一副坚固的盔甲。
浏览器地址栏,如果有一个小锁头标志,那就表明网站启用了安全的HTTPS协议,而URI里的协议名,也从“http”变成了“https”。
5、代理
代理(Proxy)是HTTP协议中请求方和应答方中间的一个环节,作为“中转站”,既可以转发客户端的请求,也可以转发服务器的应答。
代理有很多的种类,常见的有:
-
匿名代理:完全“隐匿”了被代理的机器,外界看到的只是代理服务器;
-
透明代理:顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户端;
-
正向代理:靠近客户端,代表客户端向服务器发送请求;
-
反向代理:靠近服务器端,代表服务器响应客户端的请求;
由于代理在传输过程中插入了一个“中间层”,所以可以在这个环节做很多有意思的事情,比如:
-
负载均衡:把访问请求均匀分散到多台机器,实现访问集群化;
-
内容缓存:暂存上下行的数据,减轻后端的压力;
-
安全防护:隐匿IP,使用WAF等工具抵御网络攻击,保护被代理的机器;
-
数据处理:提供压缩、加密等额外的功能。
题外话:DNS与URI有什么关系?
简单来说,URI是用来标识互联网上的资源的,它就像是资源的“地址”。这个地址可能包含协议(如http)、域名(如www.example.com)以及资源在服务器上的具体位置(如/index.html)。 而DNS的主要任务是将域名解析为IP地址。因为计算机在通信时实际上是通过IP地址来定位对方的,而不是通过我们容易记忆的域名。所以,当我们尝试访问一个URI时,浏览器会首先查询DNS,将URI中的域名部分解析为对应的IP地址,然后再根据这个IP地址与服务器建立连接。 可以说,DNS为URI提供了实际定位网络资源的能力,使得我们可以通过更加人性化的域名来访问互联网资源。
题外话:用小强的角色,通过打电话来简要说明一下代理。
假设小明想要给你打电话,但由于某种原因(比如他不在国内或者他的手机信号不好),他不能直接打给你。这时,小明可以选择让小强作为他的代理来给你打电话。
小强作为代理,会接收小明想要传达的信息,并代替小明拨通你的电话。他会将小明的请求或消息传递给你,并接收你的回应,然后再将回应转告给小明。
在这个例子中,小明是客户端,你是服务器,而小强则是代理。小强负责在小明和你之间建立通信桥梁,使得小明能够间接地与你进行通信。
代理的概念在计算机网络中也类似。当一个客户端(如浏览器或应用程序)无法直接访问某个服务器或资源时,它可以配置一个代理服务器来代表它进行访问。代理服务器会接收客户端的请求,以自己的名义去访问目标服务器,并将获取到的响应返回给客户端。
通过这种方式,代理服务器可以执行一些额外的任务,如缓存内容以减少网络流量、过滤请求以保护网络安全,或者进行负载均衡以提高系统性能。