导言
HTTP是我们开发中最常用用到的,但对我们来说,应该是既熟悉又陌生。
为什么这么说呢?因为每一次服务请求都有使用,但我们关心的大部分是接口的入参和出参,要更多一点,也就是报文信息,而对于数据是怎么拿到的,可能就一知半解了。
是什么
HTTP,英文全称Hyper Text Transfer Protocol,中文翻译:超文本传输协议。这个大家应该都耳熟能详。顾名思义,我们最好要拆分来多了解一点。
协议
超文本传输协议,说明HTTP是一种协议,对于定语超文本和传输暂时不管,先说说什么是协议。协议更广泛的来说就是一种约定,不过不是口头吹的,要白纸黑字来写,例如在刚入职时和公司签订的保密协议,租房时需要合房东签租房协议。
协议有个特点,就是参与方不可以只有自己,需要有另外的参与者,要不然自己可以为所欲为,不需要协议。
传输
我们再来看看传输,这个也很好理解,快递从商家运送到买家手上,是传输,退货时又从买家到商家手上,也是传输,说明传输是可以双向的,Http中叫做请求方和应答方(响应方)。
请求方和应答方可能存在中间方,不仅仅是请求方A、应答方B两者。如安全认证、数据压缩、代理等等都可能需要多方的共同参与。
超文本
超文本,前端的同学肯定非常熟悉了,HTML就是超文本标记语言。就是一种超文本。那超文本和文本有什么区别呢?
文本包括图片、音频 视频等可以被浏览器或服务器上层应用渲染或处理的程序,而非被随机切割的二进制包。是一种线性结构。
而超文本中含有超链接,可以互相跳转,是一种复杂的非线性、网状结构。在我们现在的各种网站中,一般存放有其他网站的链接,可以直接跳转,但对于30年前的纯文本传输和展示的时候,仅可读,不存在这种超链接在其中。
发展历程
史前时期
20世纪60年代,由美国国防部高等研究计划署(ARPA)建立的ARPA网,它存在有4个分布在各地的节点,现代互联网由此开始。
到70年代,人们在ARPA网研究的基础上提出了TCP/IP协议,由于其稳定性和良好的分层结构的优良特性,迅速击败其他对手而赢得市场。
到80年代中期Http协议进入UNIX系统,越来越多的计算机开始接入互联网。
1989年,HTTP诞生了,从此开始了它伟大的征途。
HTTP/0.9
作为最原始的版本,它仅接受纯文本传输,并且只能GET请求,请求在响应之后立即关闭。
HTTP/1.0
1996年,HTTP/1.0 版本正式发布,新增了很多功能,如:
- HEAD、POST等方法
- 传输格式不再限于纯文本
- 增加了响应码,标记了可能的错误原因
- 引入了HTTP Header头部概念,使请求响应更加灵活
可以看出,HTTP/1.0 描述的功能与后面的版本功能已经差别不大了,但它不算是正式的标准,仅作为一份参考文档,在当时的环境,意义不大。
HTTP/1.1
1999年,HTTP/1.1发布了RFC文档,编号2616,这是一份正式的标准,有重大意义。另外,它还新增了如下功能:
- PUT、Delete请求方法
- 缓存管理和控制
- 明确了连续管理,允许持久连接
- 允许相应数据分块,利于传输大文件
- 强制要求Host头,让互联网主机托管成为可能
由于HTTP/1.1 规范内容比较多且繁杂,2014年进行了一次修订,原来的文档被一分为六,编号为7230-7236.
HTTP/2
HTTP/1.1发布之后,互联网企业雨后春笋般野蛮生长,信息量在爆炸式增长使得人们开始对性能提出了更高的要求,HTTP/1.1连接慢的问题开始暴露,Google就借势推出了SPDY,并开始在Chrome里应用于自家的服务器。2015年正式发布,RFC文档编号7540.
HTTP/2在兼容HTTP/1.1的同时在性能方面进行了大量优化,主要有以下几个:
- 二进制协议,不再是纯文本
- 可发起多个请求,废弃了HTTP/1.1的管道
- 使用专用算法压缩头部,减少数据传输量
- 允许服务器主动向客户端推送数据
- 增强了安全性,要求加密通信
HTTP/3
2018年,互联网标准化组织IETF提议将HTTP OVER QUIC更名为HTTP/3获得批准,现正处于标准化制定阶段。这仍然是Google的杰作。后面我们会专门说到它的主要新增特性和功能。
知识地图
Http涉及到的相关概念非常多,不胜枚举,下面主要列出的是比较常用,虽然可能不懂具体含义,但也经常听到。
CDN
内容分发网络。全称 Content Delivery Network.
作用
1. 加速用户请求
把用户请求的资源能尽快传输回来。应用Http的缓存和代理技术,不需要任何请求都要到源服务器中获取资源,要让请求就近获取代理服务器或缓存服务器的数据。
2. 负载均衡
3. 安全防护
应用场景
秒杀系统
某秒杀活动有大约100W人来参与,如果不做任何分流措施,100W TPS对任何单服务器来说都是灾难,十有八九得崩。这里我们就需要用到CDN了。在活动前我们可以大体搜集到本次参与秒杀活动大概的人数,来对比秒杀的数量得到一个比例。到真正秒杀的时候,CDN服务器会过滤这个比例的用户到源服务器参与秒杀活动,其他用户则提示秒杀活动已结束。
DNS
Domain Name System,域名系统。
这个很重要,估计大部分人都熟悉。http://202.108.22.5/ 这个是什么地址,不点击的话,你肯定就不知道了,百度,最常用的。
当我们输入 www.baidu.com 的时候,域名系统会进行域名解析。把它对应解析成对应的数字。
在DNS中,域名又称为主机名,为了更好的标记和记录主机名,通过分层来定义,由.号隔开,从左到右,域名层级越来越高,最右边是顶级域名,如 www.baidu.com 中,com是顶级域名,常用的顶级域名,耳熟能详的还有.cn、.edu等。
URI/URL
URL是URI的一个子集,但两者差别不大,一般不做严格的区分,意义不大。
URI,统一资源标识符,Uniform Resource Identifier。它能够标记互联网上唯一的资源信息。URL,统一资源定位符,Uniform Resource Locator. URL就是我们俗称的“网址”。
URI主要由三部分组成,以 juejin.cn/user/430664… 为例:
-
协议名:这里https就是协议名,表示访问该资源所遵守的协议
-
主机名:juejin.cn 就是主机名
-
资源路径:/user/430664291452248 这个就是访问资源的路径
现在有了URL网址,就可以开始访问服务器资源了...
Http之网络分层模型
对于传输协议,我们是不是经常会听到什么四层,七层之类的分层结构,但具体什么是四层,什么是七层,分别是怎么划分的,两者有什么区别和联系呢?可能很多同学都不是很清楚,今天我们就来梳理下,这个虽然在平时开发中可能不会直接用到,但其实也挺重要的。下面我们就具体来看看吧...
TCP/IP网络分层模型
我们都清楚,HTTP属于应用层协议,它是基于TCP/IP协议而运行的。上面我们说的四层,就是TCP/IP协议的网络分层模型。
TCP
TCP协议英文全称是:Transmission Control Protocal,翻译为传输控制协议。它在IP协议之上,提供可靠的字节流形式的传输,也是应用层如HTTP得以稳定传输的基础。
IP
IP协议:Internet Protocal,主要作用是解决寻址和路由等问题。它在TCP/IP网络分层模型中位于网际层,等会我们会详细讲到。
四层网络分层模型
如图所示:
我们从下往上看,最下层是第一层,MAC层,也可以叫做链接层,主要做的是在以太网或WIFI等底层网络上发送原始数据包,使用的是MAC地址来标记网络设备,这也是MAC层名称的由来。
再往上看第二层:网际层,刚也说了IP协议位于这一层级,我们也知道,IP协议中定义了IP地址的概念,在这一层级上,寻址不在用的是MAC地址,而是IP地址,网络的世界都是由一个个IP组成的。
第三层:传输层,这是TCP协议要完成的事情。TCP要做的就是保证数据可靠的在两个IP之间进行传输,不能出现误传、漏传或重复传输的事情。这里还涉及到一个UDP,它是无状态传输,后面再提到再具体说说。
第四层:应用层。也就是我们主要的话题HTTP协议了。但是应用层协议可不止HTTP,还有Telnet、SSH、FTP、SMTP等等。
第一层MAC层的传输单位是帧(frame),第二层网际层的传输单位是包(packet),第三层传输层的传输单位是段(segment),应用层HTTP的我们传输的是消息或报文(message),这个我们熟,浏览器中能详细看到。
OSI网络分层模型
如下图所示:
和分解TCP/IP四层分层模型一样,我们从下往上看,最下面一层也是第一层:物理层。也就是网络的硬件层,如电缆、光纤和网卡之类的。
第二层:链路层。这和TCP/IP分层模型的第一层基本对上了。
第三层:网络层。也对应的是TCP/IP分层模型的第二层。
第四层:传输层。同样相当于TCP/IP分层模型的传输层。
第五层:会话层。维护网络中的连接状态,保证请求方和发送方及其中间方之间的会话状态。
第六层:表示层。从名称来说,不是很好理解。这层主要的作用是对数据进行加工处理成可识别,语义化的结构。
第七层:应用层。很明显,这和TCP/IP最上一层应用层也是有对应关系的。
OSI网络分层模型七层就是这么划分的,和TCP/IP的四层分层模型有部分的对应关系。其实这个应该也很好理解吧。OSI是国际标准组织定义的标准模型。肯定要更全面。TCP/IP协议只是其中一个需要遵守的协议栈,肯定在标准协议中取舍,也不必全部照搬。这样说好像不太准确,因为TCP/IP出现在前,规则定义在后,应该是OSI的分层模型是借鉴TCP/IP协议的分层模型来制定出的相对更全面一点的网络分层模型。
TCP/IP协议对应了OSI网络分层模型七层中的四层,这也就是外界说的一层、五层、六层去哪儿了的原因。
报文
报文有请求报文和响应报文,但结构基本类似,由三部分组成:
-
起始行
-
头部字段集合
-
消息正文
请求行和头部字段集合,经常合称为请求头或响应头,消息正文被称为实体。
请求行
请求行也是由三部分组成:
-
请求方法:GET/POST等
-
请求目标:URI
-
版本号:HTTP协议的版本号
这三个部分通常使用空格(space)来分隔,但最后记得要用CRLF换行表示结束。
举例:
GET / HTTP/1.1
这里GET就是请求方法,/其实就是默认服务器根目录下的资源地址,HTTP/1.1是协议的版本号。
状态行
状态行指的是响应报文的起始行,一般也不会叫响应行。
响应行也是由三部分组成,分别是:
-
版本号:HTTP协议的版本号
-
状态码:一串数字,如200、500
-
原因:用于解释数字状态码的含义
举例:
HTTP/1.1 200 OK
对着看,很好理解。HTTP/1.1就是协议的版本号,200是服务器返回的状态码,OK表示请求响应成功了。
HTTP/1.1 404 Not Found
如果状态码是404,这个也是最常见的状态码之一,Not Found表示服务器没有找到请求的资源。
请求行和状态行分别是请求和响应的起始行,两者都是由三部分组成,只是具体内容不同,都比较简单。下篇我们继续来说报文的头部字段集合,这里面的字段非常多,我们主要熟悉下常用的。
常用头字段
Host
是请求字段,只会出现在请求头里,它也是HTTP/1.1协议中唯一要求必须存在的请求头字段,也就是说如果在请求头中没有Host字段,则发送的报文就是错误的,请求也无法成功。
Host字段告诉服务器请求由哪个主机来处理,如果在同一台服务器上存在多个虚拟主机,不指定Host请求字段,那这个请求就无法找到对应的响应主机在哪,导致请求失败。
User-Agent
也是请求字段,只会出现在请求头中。
我们先看下这个字段一般包括的信息:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
其实它在设计之初是为了给服务器提供一些客户端信息,让响应信息相对客户端来说更友好。但随着时间的推移,各种浏览器基于主流浏览器的内核开发了各种各样的客户端浏览器,并且都自称Mozilla、Chrome等,使得这个字段的作用不是很大了。
Date
是个通用字段,通常出现在响应头中,表示HTTP报文创建的时间。可以用于做一些缓存策略的功能。
Server
响应字段,只会出现在响应头中。它展示的是当前服务的服务名称和版本号。
但不是必须会出现的,因为可能存在隐患,如果把服务和对应的版本号暴露出来,并且这个版本出现了重大漏洞,容易受到黑客的攻击。所以一般只会给个无关紧要的信息或索性不会出现。
Content-Length
这是个通用字段,在请求头和响应头中都可以出现。表示的是请求或响应实体的长度。
例如:
看看它的响应信息:
{"e":0}长度就是7。
请求方法
HTTP/1.1规定了8种请求方法,单词都必须大写,我们来一一介绍。
GET
GET请求是我们最常用的请求方法之一了。它表示的是从服务器获取资源,是可读操作,不会修改服务器资源。
HEAD
HEAD请求是获取资源的元信息。与GET请求很类似,都是可读操作,不修改资源,仅读取。
我们可能会遇到一种场景:如果我们仅需要查询资源是否存在于服务器,而不需要知道资源的具体内容的时候,这种场景更适合用HEAD请求,而不是GET请求。
POST
POST请求也是实际开发中最常用的方法之一,像我们请求后端几乎都是POST请求,GET请求都少,单一请求包打天下,蒂姆·伯纳斯·李肯定是不会赞同的,哈哈哈...
POST请求是写操作,会修改服务器资源。例如我们在论坛发帖之类的操作就适合用POST请求。
PUT
PUT请求和POST请求也很类似,是对资源的写操作,但有细微的差别,一般新增信息用POST,而对资源进行修改则用PUT请求。拿数据库操作来举例:POST更像是insert操作,PUT操作就像是update.
DELETE
DELETE好理解,就是对服务器资源进行删除,但这个操作很危险,不会是真的从服务器删掉了,而是加了删除标记。可恢复。
OPTIONS
OPTIONS请求并非所有服务器都支持,功能有限。它主要的作用是让服务器返回可对资源进行哪些操作。在响应头的Allow字段中返回。
CONNECT
CONNECT方法比较特殊,它的作用主要是为客户端和另一台服务器之间建立一个可通信传输的通道,本身在中间承担代理的作用。
TRACE
通常是被禁用的。这主要由它的功能确定,它的作用是展示从客户端请求到服务端响应整个过程的路径信息,这无疑会暴露很多关键信息,让恶意者有机可寻,所以在服务器中一般都会被禁用。