读《图解HTTP》

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和原始明文对应的情况,有公开的彩虹表,记录了庞大的一一对应的信息库。这就是针尖对麦芒吧,没有绝对的安全,只有成本和收益之间相互的权衡。

喜欢和关注都是对我的鼓励和支持~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • 前言 如果没有体系化的认知,了解的信息越多也就越迷茫!如果对本质的认知就是错的,了解的信息越多偏差也就越大!信息绝...
    只敲代码不偷桃阅读 1,665评论 0 3
  • 不得不说相互监督,对不热爱学习、不勤于总结的孩子,是一种有效激励。 最近几天看了《图解HTTP》前五章,所以今天的...
    北四巷杂货铺的夏天阅读 378评论 2 0
  • 一、了解Web及网络基础 CERN,欧洲核子研究组织,最先提出一种能让远隔两地的研究者们共享知识的设想。 1、网络...
    大鹏鸟阅读 672评论 0 2
  • 原创 转载请注明地址 今天由于在项目过程中遇到了一个https认证失败的问题(其实是由于我的部署配置不对导致的。。...
    焱魔王阅读 4,361评论 0 2
  • 关于HTTP的知识,七七八八也了解过一些,总觉得很零散。 如果去翻看三卷本的TCP/IP的话,倒是大而全了,关键是...
    cynthia猫阅读 396评论 0 1