百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

一文学完《图解HTTP》(《图解 http 》)

csdh11 2025-03-17 17:01 14 浏览

作为一个专业的IT技术人,一个Web应用开发者,不了解网络基础和协议,怎么能行?本文是我阅读《图解HTTP》一书的读书笔记,希望对你有所帮助!

1 关于《图解HTTP》

目前国内讲解HTTP协议的书实在太少了,记忆中有两本被誉为经典的书《HTTP权威指南》与《TCP/IP详解,卷1》,但内容晦涩难懂,学习难度较大。其实,HTTP协议并不复杂,理解起来也不会花费太多学习成本,这本书的出现就及时缓解了该问题。对基础及核心部分的深入学习是成为一名专业技术人员的前提,以不变应万变才是立足之本。此外,这本书也是我在2016年度读书计划中的一本,它和《图解TCP/IP》一起作为计算机网络基础部分为我温故知新了一把,谢谢作者和译者,画了这么多图解让我们理解。

2 HTTP协议初探

各种协议与HTTP协议的关系

请求处理相应模型

HTTP协议规定,请求从客户端发出,最后服务端响应应该请求并返回。

请求报文:由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。

响应报文:由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

HTTP协议是一种无状态协议

HTTP协议对于发送过的请求或响应都不做持久化处理:协议本身并不保留之前一切的请求或响应报文的信息,这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。

Cookie根据服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端自动在请求报文中加入Cookie值后发送出去。服务端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

告知服务器意图的HTTP方法

(1)GET:获取资源

(2)POST:传输实体主体 → POST的主要目的并不是获取响应的主体内容

(3)PUT:传输文件 → 就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置

但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,所以存在安全性问题,因此一般的Web网站不使用该方法。

(4)HEAD:获得报文首部 → HEAD与GET一样,只是不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等等。

(5)DELETE:删除文件 → DELETE与PUT相反,DELETE按请求URI删除指定资源。

但是,HTTP/1.1的DELETE方法本身与PUT方法一样不带验证机制,所以一般的Web网站也不使用DELETE方法。

(6)OPTIONS:询问支持的方法 → 查询针对请求URI指定的资源所支持的方法(例如该资源支持GET、POST、PUT等)。

(7)TRACE:追踪路径 → 让Web服务器端将之前的请求通信还回给客户端的方法。(不常用,容易引发XST攻击)

(8)CONNECT:要求用隧道协议连接代理 → 要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经过网络隧道传输。

CONNECT方法的格式:CONNECT 代理服务器名:端口号 HTTP版本

持久连接

在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。因此,每次的请求都会造成无谓的TCP连接建立与断开,增加通信量的开销。为了解决这个问题,HTTP/1.1想出了持久连接(也称为HTTP keep-alive),其特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。

持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器的负载,也使得HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应的提高了。在HTTP/1.1中,所有的连接默认都是持久连接。

3HTTP报文详解

用于HTTP协议交互的信息就被称为HTTP报文,请求段的叫做请求报文,响应端的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。

HTTP报文结构

(1)HTTP报文大致可以分为报文首部和报文主体两块

 (2)请求报文和响应报文的结构实例

部分内容的范围请求

通常下载一个大文件时如果遇到网络中断的情况,那就必须重头开始,因此为了解决上述问题,就需要一种可恢复的机制。所谓恢复就是指从之前下载的中断处恢复下载。要实现该功能需要制定下载的实体范围,这就叫范围请求(Range Request)。

对一份10000字节大小的资源,如果使用范围请求,可以只请求5001~10000字节内的资源。执行范围请求时,就会用到Range来指定资源的byte范围。

内容协商机制

内容协商机制就是指在客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会议响应资源的语言、字符集、编码方式等作为判断的基准。

So,有哪些判断的基准呢?

Accept Accept-Charset

Accept-Encoding

Accept-Language

Content-Language

HTTP状态码

HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。

(1)2XX 成功 → 表明请求被正常处理了,如200 OK,204 No Content,206 Partial Content

(2)3XX 重定向 → 表明浏览器需要执行某些特殊的处理以正确处理请求。如301 Moved Permanently(永久移动),302 Found(临时移动),303 See Other(资源的URI已更新,是否能临时按新的URI访问)、304 Not Modified(资源已找到,但未符合条件请求)、307 Temporary Redirect(临时重定向)

(3)4XX 客户端错误 → 表明客户端是发生错误的原因所在。如400 Bad Request(请求报文中存在语法错误),401 Unauthorized(认证失败或未认证)、403 Forbidden(不允许访问这个资源)、404 Not Found(服务器上没有请求的资源)。

(4)5XX 服务器错误 → 表明服务器本身发生错误。如500 Internal Server Error(服务器端在执行请求时发生了错误,也可能是Web应用存在的Bug或某些临时的故障),503 Service Unavailable(表明服务器暂时处于超负载或正在停机维护,无法处理请求)。

HTTP首部

 HTTP/1.1规范定义了如下47种首部字段:

(1)通用首部字段

(2)请求首部字段 

 (3)响应首部字段

 (4)实体首部字段

3 确保Web安全

HTTPS

在HTTP协议中有可能存在信息窃听或者身份伪装等安全问题,即使已经过加密处理的通信,也会被窥视到通信内容。例如:使用一些抓包软件如Packet Capture或Sniffer就可以抓取相同段上的通信。使用HTTPS(HTTP Secure)通信机制就可以有效地防止这些问题。

HTTP + 加密 + 认证 + 完整性保护 = HTTPS

HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。通常情况下,HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简而言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。

SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说,SSL是当今世界上应用最为广泛的网络安全技术。在采用了SSL之后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。

既然HTTPS安全可靠,那为何所有的Web网站不一直使用HTTPS?

一是因为与纯文本通信相比,加密通信会消耗更多的CPU以及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定会随之减少。

二是购买证书的开销也很大,要进行HTTPS通信,证书是必不可少的,而使用的证书必须要向认证机构(CA)购买。通常,一年的授权费用需要600人民币左右。  

所以,如果是非敏感信息一般都使用HTTP通信,只有在包含个人信息等敏感数据时,才会使用HTTPS加密通信。

Edison补充:建议所有to C的Web应用都使用HTTPS!

确认访问用户身份的认证

某些Web页面只想让特定的人浏览,或者干脆本人可见。为达到这个目标,必不可少的就是认证功能。

HTTP/1.1使用的认证方式如下:

(1)BASIC认证(基本认证) → 不够灵活,达不到多数Web网站期望的安全性等级(直接发送明文密码BASE64编码),因此它并不常用。

(2)DIGEST认证(摘要认证) → 采用质询响应方式,相比BASIC认证,密码泄露的可能性就降低了。

(3)SSL客户端认证 → 借助HTTPS的客户端证书完成认证,凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端。

(4)FormBase认证(基于表单认证)

通常情况下,一种安全的保存方法是:先利用密码加盐(Salt)的方式增加额外信息,再使用散列(Hash)函数计算出散列值后保存。

4 Web的攻击技术

针对Web应用的攻击模式

(1)主动攻击:攻击者通过直接访问Web应用,把攻击代码传入的攻击模式。最具典型的攻击就是 SQL注入攻击和OS命令注入攻击。

(2)被动攻击:利用圈套策略执行攻击代码的攻击模式,在被动攻击过程中,攻击者不直接对目标Web应用访问发起攻击。

跨站脚本攻击(XSS)

跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript脚本进行攻击的一种攻击。

跨站脚本攻击可以造成以下影响:

(1)利用虚假输入表单骗取用户个人信息。

(2)利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。

(3)显示伪造的文章或者图片。

SQL注入攻击

SQL注入(SQL Injection)是指针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。该安全隐患有可能引起极大地威胁,有时会直接导致个人信息及机密信息的泄露。

SQL注入攻击有可能造成以下影响:

(1)非法查看或篡改数据库内的数据。

(2)规避认证。

(3)执行和数据库服务器业务关联的程序等。

OS命令注入攻击

OS命令注入攻击是指通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。

HTTP首部(Header)注入攻击

HTTP首部注入攻击是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主题的一种攻击。属于被动攻击模式。

因会话管理疏忽引发的安全漏洞

(1)会话劫持:攻击者通过某种手段拿到了用户的会话ID,并非法使用此会话ID伪装成用户,达到攻击的目的。

(2)会话固定攻击:强制用户使用攻击者指定的会话ID,属于被动攻击。

(3)跨站点请求伪造(Cross-Site Request Forgeries,CSRF):攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。

CSRF有可能造成以下影响:

1、利用已通过认证的用户权限更新设定信息等;

2、利用已通过认证的用户权限购买商品;

3、利用已通过认证的用户权限在留言板上发表言论等;

DoS攻击

DoS攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫作服务停止或拒绝服务攻击。主要有以下两种DoS攻击方式:

(1)集中利用访问请求造成资源过载,资源用尽的同时,实际上也就呈停止状态。

单纯来讲,就是发送大量的合法请求,服务器很难分辨何为正常请求,何为攻击请求,因此很难防止DoS攻击。多台计算机发起的DoS攻击成为DDoS攻击(Distributed Denial of Service attack),DDoS攻击通常利用那些感染病毒的计算机作为攻击者的攻击跳板。

(2)通过攻击安全漏洞使服务停止。

5 拓展阅读

关于第二部分的Web攻击技术及ASP.NET Web应用安全这个主题,推荐阅读一下我的另外一篇文章《白帽子讲Web安全-学习总结》,里面有我学习学习《白帽子讲Web安全》一书的总结,也有一些适用于ASP.NET Web应用站点的安全扫描工具的介绍。此外,也推荐一个适用于.NET Core的代码安全分析工具Security Code Scan,它是一款开源的代码安全分析工具,可以直接在Visual Studio Marketplace中找到。我也有一篇文章介绍了SCS的使用,参考《一个适合.NET Core的代码安全分析工具-SCS》。

另外,推荐阅读吴翰清老师的《白帽子讲Web安全》一书,这是评分较高的一本(豆瓣评分7.4),虽然现在看来有点过时(很多的漏洞案例都早已被修复),但是基础的知识点都有覆盖,是建立安全思维的好书!此外,它对于安全开发流程与运营的介绍,同样具有深刻的行业指导意义。

参考资料

[日]上野宣,《图解HTTP》

往期精彩

一文学完《图解TCP/IP》(上)

一文学完《图解TCP/IP》(下)

本文作者EdisonZhou,架构师,阿里云MVP,博客园"推荐博客"博主,Scrum联盟认证CSM,爱好阅读与分享。

相关推荐

NUS邵林团队发布DexSinGrasp基于强化学习实现物体分离与抓取统一

本文的作者均来自新加坡国立大学LinSLab。本文的共同第一作者为新加坡国立大学实习生许立昕和博士生刘子轩,主要研究方向为机器人学习和灵巧操纵,其余作者分别为硕士生桂哲玮、实习生郭京翔、江泽宇以及...

「PLC进阶」如何通过编写SCL语言程序实现物料分拣?

01、前言SCL作为IEC61131-3编程语言的一种,由于其高级语言的特性,特别适合复杂运算、复杂数学函数应用的场合。本文以FactoryIO软件中的物料分拣案例作为硬件基础,介绍如何通过SCL来实...

zk源码—5.请求的处理过程一(http1.1请求方法)

大纲1.服务器的请求处理链...

自己动手从0开始实现一个分布式 RPC 框架

前言为什么要自己写一个RPC框架,我觉得从个人成长上说,如果一个程序员能清楚的了解RPC框架所具备的要素,掌握RPC框架中涉及的服务注册发现、负载均衡、序列化协议、RPC通信协议、Socket通信、异...

MLSys’25 | 极低内存消耗:用SGD的内存成本实现AdamW的优化性能

AIxiv专栏是机器之心发布学术、技术内容的栏目。过去数年,机器之心AIxiv专栏接收报道了2000多篇内容,覆盖全球各大高校与企业的顶级实验室,有效促进了学术交流与传播。如果您有优秀的工作想要分享,...

线程池误用导致系统假死(线程池会自动销毁吗)

背景介绍在项目中,为了提高系统性能使用了RxJava实现异步方案,其中异步线程池是自建的。但是当QPS稍微增大之后却发现系统假死、无响应和返回,调用方出现大量超时现象。但是通过监控发现,系统线程数正常...

大型乘用车工厂布局规划(六大乘用车基地)

乘用车工厂的布局规划直接影响生产效率、物流成本、安全性和未来扩展能力。合理的布局应确保生产流程顺畅、物流高效、资源优化,并符合现代化智能制造和绿色工厂的要求。以下是详细的工厂布局规划要点:1.工厂布...

西门子 S7-200 SMART PLC 连接Factory IO的方法

有很多同学不清楚如何西门子200smart如何连接FactoryIO,本教程为您提供了如何使用西门子S7-200SMARTPLC连接FactoryIO的说明。设置PC和PLC之间的...

西门子博图高级仿真软件的应用(西门子博途软件仿真)

1.博图高级仿真软件(S7-PLCSIMAdvancedV2.0)S7-PLCSIMAdvancedV2.0包含大量仿真功能,通过创建虚拟控制器对S7-1500和ET200SP控制器进行仿真...

PLC编程必踩的6大坑——请对号入座,评论区见

一、缺乏整体规划:面条式代码问题实例:某快递分拣线项目初期未做流程图设计,工程师直接开始编写传送带控制程序。后期增加质检模块时发现I/O地址冲突,电机启停逻辑与传感器信号出现3处死循环,导致项目延期2...

统信UOS无需开发者模式安装软件包
统信UOS无需开发者模式安装软件包

原文链接:统信UOS无需开发者模式安装软件包...

2025-05-05 14:55 csdh11

100个Java工具类之76:数据指纹DigestUtils

为了提高数据安全性,保证数据的完整性和真实性,DigestUtils应运而生。正确恰当地使用DigestUtils的加密算法,可以实现数据的脱敏,防止数据泄露或篡改。...

麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包

#秋日生活打卡季#原文链接:...

Java常用工具类技术文档(java中工具类的作用)

一、概述Java工具类(UtilityClasses)是封装了通用功能的静态方法集合,能够简化代码、提高开发效率。本文整理Java原生及常用第三方库(如ApacheCommons、GoogleG...

软路由的用法(自动追剧配置)(软路由教学)

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:值友98958248861环境和需求...