1 历史
时光回到1989年,地处瑞典日内瓦的一个研究所,门口的牌子上写着欧洲核子研究组织的烁金大字,里面的一个研究员蒂姆.伯纳斯.李提出了一种设想:利用现在的通信技术,让不同地方的研究员方便地共享知识文档。1990年底,该组织研发了第一台Web服务器和Web浏览器。按照这个设计的实现,如果不同地方的研究员,都搭建一个类似的服务站,他们之间就可以互相自由访问,结果就形成了一张覆盖所有站点的大网。随着新站点的不断加入,这张大网的维度就会不断膨胀,也就是现在称为万维网的原因。
当年用来浏览网站的Web浏览器客户端,名称叫WWW,现在人们已经习惯用WWW代指万维网。现代的万维网系统提出了3项构建技术:1 指定文档所在地址的URL;2 用来展现文档的超文本标记语言HTML;3 传递文档的协议HTTP。可以说,HTTP协议是构成万维网的重要基石之一。
作为万维网的入口——浏览器客户端,对其的所有权爆发了一系列的争夺战。PC时代,微软通过操作系统预装IE的优势,战胜网景,成为霸主。后面随着移动端崛起的变化,霸主地位不断被谷歌、苹果等其他众多公司挑战,现在知名的浏览器客户端有Chrome\Safari\Edge\Firfox\百度\夸克等。
万维网的服务器端,最知名的莫过于Apache,可以运行在几乎所有的Unix、Linux、Windows、MacOS操作系统上,除此之外,现在经常使用的还有Nginx、Tomcat等。
而HTTP自从1997年1月公布HTTP/1.1版本后,一直延续至2015年,期间几乎没有变化,现在还在大规模使用。2015年发布的HTTP/2.0,还在不断的推广中。
2 体系
两个人的顺利交流,需要使用相同的语言和相同的理解方式。不同的计算机要想通过网络顺利通信,也必须基于相同的数据传递方式。这种计算机相互通信的规则,统称为协议。
那协议为什么要分层呢?还是拿两个人的对话为例,一个人的声音首先经过发生器官——声带来振动,然后通过嘴巴、空气,到达对方的耳朵中,接听后的人将声音传送到大脑当中进行处理,最后理解了对方所说的意思。如果采用一个协议来规范这整个通话的过程,那任何一处变化就会引起整体的变化。比如如果在太空中,根本不存在空气。通话就需要更换成无线电、或者观察对方口型的方式,按照规定,这个通话的协议就要跟着变化。
换一种方式,如果采用分层的方式,就可以避免上面变化的情况。比如在顶层规定:110就代表有紧急情况要处理。至于传输和接收的方式,放在其他层次去协定。这样当一个人不能发声时,可以采用手写、摆放石头、修理稻田等方式,也可以采用像「孤注一掷」中被困主角那样,在衬衫上留下6(二进制为110)的方式。这样顶层的规定不变,只需要变化传输和接收这个层次的协议就可以了。
为了顺利实现计算机的网络通信,定义了多个分层的协议,统称为TCP/IP协议簇。TCP/IP协议按照层次分为4层:应用层、网络层、传输层和数据链路层。其中HTTP处于应用层。
3 组成
在应用层,规定了系统与用户交互的具体接口。下面是一个简化的网络请求和响应报文:
请求
-------------------
GET / HTTP/1.1
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:no-cache
User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36
(空行)
-------------------
响应
-------------------
HTTP/1.1 200 0K
Date:Wed, 18 Oct 2023 06:35:36 GMT
Server:TLB
Content-Type:text/html
X-Tt-Trace-Tag:id=06;cdn-cache=miss;type=dyn
(空行)
报文体
-------------------
请求报文分为请求行、请求头部和请求体。响应报文分为状态行、响应头部和响应体。客户端将请求报文传递给传输层时,会加上传输层头部信息;向下传递给网络层时,会加上网络层头部信息;再向下传递给数据链路层,会加上数据链路层的信息。发送给服务端后,服务端会按照相反的方式层层解析,最后收到请求的内容,处理后会将结果按照同样的方式进行返回。
一次请求中,通过响应头的状态码可以快速确定响应的具体情况。状态码由3位数字和原因短语组成,比如200 OK。第一位指定了响应的类别,响应类别有如下5种:
状态码的类别 | 类别 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的谴求正在处理 |
2XX | Success(成功状态码) | 请求正赏处理完毕 |
3XX | Redirection( 重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无达处理请求 |
5XX | Server Error (服务器错误状态码) | 服务器处理请求出错 |
在实际使用中,根据具体使用情况,会对HTTP传输的数据进行优化处理。比如压缩传输的数据以加快传输效率、分割大数据为小块进行传输、集成不同数据格式的内容统一返回等等,这些措施大大丰富了HTTP的使用场景。
4 演化
HTTP协议是无状态的协议,也就是不记录客户端的状态变化。这在展示页面的Web类应用上无影响,但是随着时代的发展,出现了很多复杂的Web应用,比如在线交流、在线购物等Web应用,需要对客户端的身份状态进行管理。现在常见的方式是通过在HTTP首部添加Cookie,来区别用户的不同身份和状态。
随着Facebook、Twitter和微博这种SNS网站的出现,要求用户能够近实时地观看到海量用户发布的内容。使用HTTP时,要想知道服务端是否存在内容更新,需要不断的轮询服务器,这样就会存在大量的无效请求。为了应对这种使用场景,出现了不同的处理技术。比如Ajax,利用异步JavaScript和DOM的操作,可以局部更新页面,减少请求的通信量。Comet可以让客户端发送请求后,服务端不立即返回,而是延迟到内容更新时。
不过最有效的解决方式,还是谷歌的SPDY协议。它是在HTTP和TCP之间,新增加了一个会话层。而且考虑到安全性,规定通信中必须使用SSL。相比HTTP,SPDY有以下优点:1 多路复用,一个TCP链接,可以处理任意多的HTTP请求;2赋予请求优先级,在并发请求时,可以适配低带宽时的响应慢问题;3 压缩HTTP首部,使请求和响应的字节数都有效减少;4 推送功能,服务器可以主动向客户端推送新内容;5 提示客户端,在资源更新时提示客户端,避免其继续使用缓存。不过SPDY只能对单个域名的通信实现多路复用,如果一个网站使用了不同域名的资源,改善效果就会有限制。
随着HTML5的不断发展,出现了一个针对HTTP瓶颈问题进行解决的新协议——WebSocket。WebSocket在2011年发布了第一个标准版本,可以让浏览器客户端和服务端之间实现全双工通信。通信过程中,可以互相发送JSON、XML、HTML、或图片等任意格式的数据。WebSocket链接时,客户端首先发送一次HTTP请求,请求切换为WebSocket协议通信。服务端成功处理后,客户端和服务端后续通信就会切换到WebSocket。
在SPDY和WebSocket的基础上,标准组织发布了HTTP2.0。它集成了二者的优点,并且在网络和服务器资源占用等性能方面进行了进一步改进和完善。
随着在线办公概念的兴起,对在线操控文档的需求越来越强烈。WebDAV(Web-based Distributed Authoring and Versioning, 基于万维网的分布式创作和版本控制)就是为了适配这种场景出现的新协议。通过WebDAV,可以方便的对文件进行复制、修改、加锁、移动等操作。
5 安全
HTTP是明文传输,内容可能会被窃听,而且通信对方的身份也无法确认,通信的内容也可能被修改。为了解决以上问题,出现了加密、身份认证和完整性保护的技术。基于这些技术,诞生了有效解决以上问题的方式——HTTPS。HTTPS在通信时,首先通过证书签名来认证对方身份。当通信开始时,使用证书中的公钥对信息进行加密,另一方通过私钥获取信息,然后双方协商出正常通信的对称密钥,这样就有效保证了通信内容的安全。
针对HTTP网站的攻击,大致可以分为主动攻击和被动攻击两种。主动攻击是针对服务上的资源,传入攻击代码。最有代表性的是SQL注入和OS命令注入。被动攻击是对客户端进行伪装,诱发用户点击动过手脚的页面,从而获取用户账户、密码等私有信息,最常见的有跨站脚本(XSS)、钓鱼网站等攻击方式。还有一种容易被攻击的情况是开发者对错误处理的相关提示,比如网站提示账户未注册、带有MySQL/PHP等关键字等。这样就会给攻击者以特定的提示,有针对性地进行下一步攻击。
为了防止密码泄漏,服务端一般都会将用户的密码,首先进行加盐,再计算MD5散列值进行存储。这样就算密码在服务端不小心被泄漏,攻击者也不知道用户的原始密码。不过针对这种MD5和原始明文对应的情况,有公开的彩虹表,记录了庞大的一一对应的信息库。这就是针尖对麦芒吧,没有绝对的安全,只有成本和收益之间相互的权衡。
喜欢和关注都是对我的鼓励和支持~