网络知识 | 《图解HTTP》读书笔记(上)

【网络知识作者 / Edison Zhou

这是EdisonTalk的第293篇原创内容


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

1关于《图解HTTP》

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

2HTTP协议初探

各种协议与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)实体首部字段

Ref参考资料

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

后台回复:图解HTTP,即可获得pdf下载链接哟!

姊妹篇:《图解TCP/IP》学习总结

????扫码关注EdisonTalk

设为星标,不再失联!

往期推文合集:2020年上半年推文合集

成都新鲜坑位:喜鹊生活招聘.NET开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode292周赛--6057. 统计值等于子树平均值的节点数

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

C# 中 System.Range 结构体

翻译自 John Demetriou 2020年4月6日 的文章 《C# 8 Is Introducing Ranges》我们之前讨论过的 C# 中的一个特性 System.Index 结构体,与另一特性 System.Range 结构体 是携手并进的。在 C# 8.0 之前,没有访问集合中任意部分的范围或切片的语法。开发人员…

leetcode292周赛--6056. 字符串中最大的 3 位相同数字

一:题目 二:上码 class Solution { public:string largestGoodInteger(string num) {int slowIndex 0;int count 0;vector<int> ans;for (int fastIndex 1; fastIndex < num.size(); fastIndex) {if (num[fastIndex] ! num[slowIndex]) {slowIndex;} else {//相等…

GDB 调试 .NET 程序实录 - .NET 调用 .so 出现问题怎么解决

注&#xff1a;本文重要信息使用 *** 屏蔽关键字。最近国庆前&#xff0c;项目碰到一个很麻烦的问题&#xff0c;这个问题让我们加班到凌晨三点。大概背景&#xff1a;客户给了一些 C语言 写的 SDK 库&#xff0c;这些库打包成 .so 文件&#xff0c;然后我们使用 C# 调用这些库…

leetcode236. 二叉树的最近公共祖先(java递归)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {/**思路:1.后序遍历 从下往上遍历 找到目标结点后然后做逻辑判断处理1…

WPF MVVM 弹框之等待框

WPF MVVM 弹框之等待框目录一、效果二、弹框主体改造三、等待动画用户控件四、弹窗 ViewModel 和帮助类的改造五、使用方法和代码地址独立观察员 2020年10月13日之前写过一篇《WPF MVVM 模式下的弹窗》&#xff0c;里面实现了确认框和消息框&#xff0c;经过一段时间的演化&…

设计一个具有等待队列的连接池

说到连接池相关很多人都使用过&#xff0c;常见的有数据连接池&#xff0c;HttpClient连接池等。连接池的作用是保持一定量的连接让交互过程复用这些连接&#xff0c;从而大大节省连接创建过程或过多的损耗。在连接池策略中往往当池没有连接的情况都会抛出异常告诉使用者资源无…

leetcode701. 二叉搜索树中的插入操作

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

你不该错过的2020中国开源年报,填开源开发者问卷,成为国内开源的见证者

点击上方“开源社”关注我们| 作者&#xff1a;王伟| 编辑&#xff1a;黄欣宜| 设计&#xff1a;冯艺怡| 责编&#xff1a;王玥敏卷首语一年一度的中国开源年报再度启动&#xff5e;中国开源年报由开源社发起。旨在从多种维度&#xff0c;多种方式&#xff0c;多种协作来呈现国…

leetcode450. 删除二叉搜索树中的节点(java详解版)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

.NET Core使用FluentEmail发送邮件

前言在实际的项目开发中&#xff0c;我们会遇到许多需要通过程序发送邮件的场景&#xff0c;比如异常报警、消息、进度通知等等。一般情况下我们使用原生的SmtpClient类库居多&#xff0c;它能满足我们绝大多数场景。但是使用起来不够简洁&#xff0c;许多场景需要我们自行封装…

进击吧! Blazor !第四期 组件开发

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

HttpReports 2.0 发布了 !!!

https://www.cnblogs.com/myshowtime/p/13806631.html来源???? 前言介绍HttpReports 是基于.Net Core 开发的APM监控系统&#xff0c;使用MIT开源协议&#xff0c;主要功能包括&#xff0c;统计, 分析, 可视化&#xff0c; 监控&#xff0c;追踪等&#xff0c;适合在微服务…

.NET Standard 来日苦短去日长

作者&#xff1a;Richard翻译&#xff1a;精致码农-王亮原文&#xff1a;http://dwz.win/Q4h自从 .NET 5 宣贯以来&#xff0c;很多人都在问这对 .NET Standard 意味着什么&#xff0c;它是否仍然重要。在这篇文章中&#xff0c;我将解释 .NET 5 是如何改进代码共用并取代 .NET…

leetcode538. 把二叉搜索树转换为累加树

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

【BCVP升级】泛型主键的使用

&#xff08;图片来源于SqlSugar官网&#xff0c;5年5.0&#xff09;大家假期已经结束了吧&#xff0c;还有80天左右就要到2021年了&#xff0c;你准备好了么&#xff1f;BCVP&#xff08;Blog.Core&Vue Project&#xff09;项目已经开源2年多&#xff0c;从来没有停更过&a…

leetcode404. 左叶子之和(迭代和递归)

一:题目 二:上码 迭代 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right…

Dotnet Core使用特定的SDKRuntime版本

Dotnet Core的SDK版本总在升级&#xff0c;怎么使用一个特定的版本呢&#xff1f;假期过完了&#xff0c;心情还在。今天写个短的。一、前言写这个是因为昨天刷微软官方文档&#xff0c;发现global.json在 SDK 3.0 后&#xff0c;更新了一些内容。文档提到了这个更新&#xff0…

Spring中IOC的理解(通俗易懂版)

文章目录1.IOC提出背景2:IOC的核心概念3:IOC的实现方式4:IOC的入门案例(1):思路分析(2):代码解析5:DI入门案例(1):思路分析(2):代码解析6:DI依赖注入的方式(1):前言(2):Set方式注入(3):构造器注入(4):依赖的自动装配7:注解开发模式的依赖注入(1):前言介绍(2):注解模式的依赖注入…

首个使用Blazor 技术实现的社区软件 BlazorCommunity 发布

BlazorCommunity 是首个使用Blazor 实现的开源社区软件&#xff0c; 其组件基于Element-Blazor &#xff0c; Element-Blazor 是一个 API 模仿 Element&#xff0c;CSS 直接使用 Element 样式&#xff0c;HTML 结构直接使用 Element HTML 结构 的 Web开发库。由于基于了…