一、HTTP超文本传输协议
HTTP
全称为Hyper Text Transfer Protocol
超文本传输协议,它是基于TCP
传输协议构建的应用层协议,作为支撑万维网www
的核心协议,为了保证其效率及处理大量事务的能力,因此在设计时,HTTP
被制定成为一种无状态协议,也就是说:**HTTP
本身不会对发送过的请求和相应的通信状态进行持久化处理**。
也正因
HTTP
的无状态特征,所以在有些需要保持状态的场景中,则需要引入其他技术来实现,比如需要保持“登录状态、授权状态”时,需要配合Cookie
来实现记录与管理状态。
HTTP
于1990年提出后,经过多年的完善和扩展,目前已经存在多个主流版本的迭代:
目前HTTP
主流应用版本还是HTTP/1.1、2.0
。
1.1、HTTP协议工作流程
HTTP
核心由请求与响应构成,是一种典型基于客户端和服务器模型的协议,在目前的网络中,浏览器作为HTTP
协议的主要载体,一般来说,“从浏览器发出请求到服务器返回响应”,这个过程被称为一次HTTP
操作,也被称为一个事务,其具体过程如下:
HTTP工作流程
-
• ①客户端连接
WEB
服务器:浏览器与服务器的HTTP/80
端口建立一个套接字连接。 -
• ②发送
HTTP
请求:根据用户的URL
,通过套接字连接向服务器发送对应的请求报文。 -
• ③服务器处理请求并返回响应结果:解析请求、定位资源、执行逻辑后将结果写到套接字,客户端从套接字中获取结果。
-
• ④释放
TCP
套接字连接:默认情况下,服务器主动终止套接字连接,客户端被动关闭。
从建立连接发出请求,到服务器处理完成后,返回响应再关闭连接,既代表着一个“事务”就完成了,但客户端接受到响应后,还会存在:解析响应报文、渲染结果数据这两步操作。
接下来我们根据
HTTP
工作流程的先后顺序,依次拉开HTTP
协议的完整序幕,如下:
-
• ①、URI资源标识符及URL资源定位符详解
-
• ②、
HTTP
报文-请求报文与响应报文 -
• ③、
HTTP
请求方法分类 -
• ④、
HTTP
请求状态码
1.2、URI资源标识符及URL资源定位符
一般网络请求的前提是:需要用户在浏览器输入或点击超链接后,得到一个目标网址才会触发,而网址的专业术语为:**URL
统一资源定位符**,而URL
又是URI
的一部分。
但URI
统一资源标识符这个词并没有URL
那么普及,因此出现在大众视野中的次数并不多,它的作用是区分网络上不同的资源,主要涵盖了URL
和URN
两部分。
接下来看看URL
的构成,一般来说完整的URL
结构如下:
URL完整结构
但上述结构使用较少,URL
的常用结构如下:
URL常用结构
我们依次分析看看:
-
•
scheme
:表示使用的协议类型,例如http、https、ftp、chrome
等。 -
•
://
:协议类型与后续描述符之间的分隔符。 -
•
domainName
:网站域名,经DNS
解析后会得到具体服务器IP
。 -
•
/path
:请求路径,代表客户端请求的资源所在位置,不同层级目录之间用/
区分。 -
•
?query1=value
:请求参数,?
后面表示请求的参数,采用K-V
键值对形式。 -
•
&query2=value
:多个请求参数,不同的参数之间用&
分割。 -
•
#fragment
:表示所定位资源的一个锚点,浏览器可根据这个锚点跳转对应的资源位置。
PS:锚点也被成为片段标识符,
#
部分之后的内容,即锚点不会被发送到服务器,锚点的作用仅是在浏览器解析时,跳转指定的位置显示。
对比完整的URL
,常用的URL
中除开用户名及密码外,还存在一点不同,即host:port
主机IP+端口变为了domainName
域名,那为什么又要这样做呢?
①
IP
不方便记忆,对于普通用户而言,一串数字远比不了“拼音缩写”,好比www.baidu.com
任何人都能记住,但14.215.177.38
却不行。
②服务器的IP
是动态多变,当网关宕机后换机部署时,IP
又不相同了,但域名却是固定的,就算服务器IP
再怎么变,域名都不会更换。
用户请求的域名又是如何变成具体IP
的呢?这里面就得提及另一个概念:DNS
解析。
1.2.1、DNS域名解析系统
在计算机网络中,每个主机都存在一个IP
地址,但由于IP
是一串数字不方便人类记忆,因此出现了一种协议名为DNS
,它可以把生涩的IP
地址转换为便于人类记忆的域名,例如百度的:www.baidu.com
。
DNS(Domain Name System)
中文的意思是域名系统,每个互联网企业WEB
网站都可以看作是它自己在网上的门户,那么每个网站的域名就类似于“门牌号”,通常情况下,为了方便正常人记忆,域名都会使用公司的名称或简称,例如www.taobao.com、www.baidu.com、www.jd.com
等,因此当你要访问一个Web
网站,但又不知道其确切域名时,那么你首先可以输入其公司名称试试看。
因特网最开始仅由几百台计算机组成,因此最初的域名与IP
映射关系都是被保存在本地的Hosts.txt
文件中,每台因特网中的机器都从服务器上下载Hosts
文件,然后发送请求时就从本地查询IP
信息,但随着接入因特网的设备越来越多,因此原有的这种方式无法满足日益增长的因特网需求。
毕竟全球的设备都在不断的接入因特网,上网时都在使用域名访问,不过世界上并不存在一台DNS
服务器可以映射所有的IP
,所以域名系统最终被设计成了一个:带有层次结构的分布式K-V
数据库,整个DNS
由很多服务器共同组成的,大体结构如下:
DNS域名系统-分层结构
PS:比如
www.baidu.com
,实际上完整的域名为:www.baidu.com.
,根域则是最后的.
,系统做了兼容,不需要用户手动写出。
因特网上的域名服务系统也是按照域名的层次来划分的,每一个域名服务器都只对域名体系中的一部分进行管辖,DNS
服务器主要分为三类:
-
• ①根域名服务器
-
• ②
TLD
顶级域名服务器 -
• ③授权域名(子域)服务器
除此之外,还存在一种本地DNS
服务器,但这个并不归纳在域名系统的分层结构中,不过本地DNS
服务器却是DNS
至关重要的一环。
DNS域名查询
DNS
中主要分为递归查询、迭代查询两种方式:
-
• ①全递归查询:
递归查询
递归查询的意思是指:客户端只需发出一次请求,就能得到相应的解析结果。 -
• ②先递归+后迭代查询:
迭代查询
迭代查询的意思是指:客户端需经过多次请求查询,才能得到相应的解析结果。
当然,上述过程无论是迭代还是递归查询,对于上层DNS
服务器而言,全球的访问压力都足以让其瘫痪,因此DNS
中还存在一个重要的概念:DNS
缓存:
-
• 本地
DNS
/非授权服务器缓存:各大运营商或大公司都有自己的DNS
服务器,一般部署在距离用户较近地方,代替用户访问核心DNS
系统,同时这些DNS
服务器可以缓存之前的查询结果,下次出现相同的DNS
解析请求时,可直接返回已缓存的IP
。 -
• 本地计算机
DNS
缓存:计算机本地缓存主要分为操作系统缓存与浏览器缓存两种:-
• 浏览器缓存一般会有时间限制,如
Chrome
浏览器默认是1min
,一分钟内请求该域名,都会直接从本地缓存中获取IP
。 -
• 操作系统缓存是指本地的
hosts
文件,在浏览器中无法获取映射IP
时,会尝试从hosts
文件中获取。
-
注意:主机和本地域名服务器之间的查询方式是递归查询,本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大,也就是代表着:一般情况下
DNS
解析请求都采用先递归+后迭代方式。
当用户在浏览器向一个域名发出请求后,DNS
解析请求具体查询过程如下:
-
• ①客户端输入域名准备访问网站。
-
• ②先查询「浏览器的
DNS
缓存」,命中直接向IP
发起访问,未命中继续往下。 -
• ③继续查询「
OS
的hosts
文件」,如果仍然未命中,则向「本地域名服务器」发起「递归查询」请求。 -
• ④「本地域名服务器」先查询自身缓存,未命中则向「根域名服务器」进行「迭代查询」:
-
• A.「根域名服务器」返回「顶级域名服务器」的地址
-
• B.「本地域名服务器」再根据地址向「顶级域名服务器」发起查询
-
• C.「顶级域名服务器」返回负责该「域名」的「授权域名服务器」地址
-
• D.「本地域名服务器」再根据地址向「授权域名服务器」发起查询
-
• E.「授权域名服务器」返回「域名」的具体
IP
地址
-
-
• ⑤「本地域名服务器」将
IP
返回给客户端并将「域名/IP
映射」缓存起来。 -
• ⑥「浏览器」得到
IP
后,向其发出具体的「用户请求」,并将「域名/IP
映射」缓存。
1.3、HTTP报文的组成结构
浏览器访问服务器的过程中,解析域名得到具体IP
后,会将用户的请求组装成HTTP
报文,HTTP
报文主要分为请求报文与应答(响应)报文两类。
1.3.1、请求报文
用户请求服务器时,发送的报文被称为请求报文,大体结构如下:
请求报文
请求报文主要由请求行、请求头、空行、请求主体四部分组成。
请求行
请求行也被称为起始行,主要包含请求方法、资源路径以及协议版本三部分,具体如下:
GET /index.html HTTP/1.1
注意:报文中每个不同的部位之间必须要用SP
空格隔开,末尾需要有一个CRLF
回车换行符,遵循ABNF
语法规范。
请求头
不管是请求头亦或是响应头,都可以算是HTTP
报文中最复杂的内容,因为其中可选字段是非常多的,一般来说头部字段遵循如下规范:
-
• 每个字段名与字段值以