HTTP权威指南 -- 读书笔记 -- 第一部分 HTTP:Web的基础
HTTP权威指南 -- 读书笔记
第一部分 HTTP:Web的基础
第一章 HTTP概述
1.Web(http)服务器与客户端
可能你每天都在使用 HTTP 客户端。最常见的客户端就是Web浏览器, 比如微软的Internet Explorer。Web浏览器向服务器请求HTTP对象,并将这些对象显示在你的屏幕上。
浏览一个页面时,浏览器会向服务器www.oreilly.com发送一条HTTP请求。服务器会去寻找所期望的对象(在这个例子中就是 /index.html,如果成功,就将对象、对象类型、对象长度以及其他一些信息放在 HTTP 响应中发送给客户端
2.资源
注意:一切能提供web内容的东西都是web资源包括:图片文件,文本文件,摄像头网关,搜索引擎网关等.
- http对全部通过web传输的对象都带上MIME(mime.type)类型的数据格式标签,标记类型
URI(统一资源标识符) 包含两类 URL(统一资源定位符) 以及 URN(统一资源名)
- URL的第一部分被称为方案(scheme),说明了访问资源所使用的协议类型。这部分通常就是HTTP协议(http://)。
- 第二部分给出了服务器的因特网地址(比如,www.joes-hardware.com)。
- 其余部分指定了Web服务器上的某个资源(比如,/specials/,saw-blade.gif)。
现在,几乎所有的URI都是URL。
URN作为特定内容的唯一名称使用,与目前的资源所在地无关,在试验阶段并未大范围使用.无特殊说明,资源定位使用URL
3.事务
一个 HTTP 事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。这种通信是通过名HTTP 报文(HTTPmessage)的格式化数据块进行的
3.1 方法
HTTP 支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method).每条 HTTP 请求报文都包含一个方法。 这个方法会告诉服务器要执行什么动作.
http方法 | 动作 |
---|---|
GET | 从服务器向刻划断发送命名资源 |
PUT | 将来自客户端的数据存储到一个命名的服务器资源中去 |
DELETE | 从服务器删除命名资源 |
POST | 将客户端数据发送到一个服务器网关应用软件 |
HEAD | 仅发送命名资源相应中的http首部 |
3.2 状态码
每条 HTTP 响应报文返回时都会携带一个状态码。 状态码是一个三位数字的代码,告知客户端请求是否成功, 或者是否需要采取其他动作。
常见HTTP状态码 | 描述 |
---|---|
200 | ok,文档正确返回 |
302 | 重定向(Redirect) |
404 | Not Found 无法找到资源 |
注意:web页面可以包含多个对象,一般的web页面是一组资源的集合,并且对每一个嵌入式资源使用一个单独的http事务
4.报文
从 Web 客户端发往 Web 服务器的 HTTP 报文称为请求报文(request_message)。从服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的HTTP 报文。 HTTP 请求和响应报文的格式很类似。
HTTP 报文包括以下三个部分。
- 起始行
报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。 - 首部字段
起始行后面有零个或多个首部字段。 每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。 添加一个首部字段和添加新行一样简单。 - 主体
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给 Web 服务器的数据; 响应主体中装载了要返回给客户端的数据。 起始行和首部都是文本形式且都是结构化的,而主体则不同, 主体中可以包含任意的二进制数据( 比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本
5.连接
HTTP 是个应用层协议。HTTP无需操心网络通信的具体细节;它把联网的细节都交给了通用、可靠的因特网传输协议TCP/IP。
- 浏览器从 URL 中解析出服务器的主机名;
- 浏览器将服务器的主机名转换成服务器的 IP 地址;
- 浏览器将端口号(如果有的话) 从URL中解析出来;
- 浏览器建立一条与 Web 服务器的 TCP 连接;
- 浏览器向服务器发送一条 HTTP 请求报文;
- 服务器向浏览器回送一条 HTTP 响应报文;
- 关闭连接, 浏览器显示文档。
6.Telnet模拟web客户端
Telnet 程序可以将键盘连接到某个目标 TCP 端口,并将此TCP端口的输出回送到显示屏上。Telnet 常用于远程终端会话, 但它几乎可以连接所有的 TCP 服务器,包括 HTTP 服务器。
可以通过 Telnet 程序直接与 Web 服务器进行对话。通过 Telnet 可以打开一条到某台机器上某个端口的 TCP 连接,然后直接向那个端口输入一些字符。 Web 服务器会将 Telnet 程序作为一个 Web 客户端来处理,所有回送给 TCP 连接的数据都会显示在屏幕上。
【问题】: http 版本的区别? 1.0,2.0,3.0?
7.web组件
- 代理
位于客户端和服务器之间的HTTP中间实体。
出于安全考虑,通常会将代理作为转发所有Web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。 - 缓存
HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。
Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了.
客户端从附近的缓存下载文档会比从远程Web服务器下载快得多。HTTP定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。 - 网关
连接其他应用程序的特殊 Web 服务器。
网关( gateway) 是一种特殊的服务器, 作为其他服务器的中间实体使用。 通常用于将 HTTP 流量转换成其他的协议。 网关接受请求时就好像自己是资源的源端服务器一样。 客户端可能并不知道自己正在与一个网关进行通信 - 隧道
对 HTTP 通信报文进行盲转发的特殊代理。
隧道( tunnel) 是建立起来之后, 就会在两条连接之间对原始数据进行盲转发的HTTP 应用程序。 HTTP 隧道通常用来在一条或多条 HTTP 连接上转发非 HTTP 数据, 转发时不会窥探数据。
HTTP 隧道的一种常见用途是通过 HTTP 连接承载加密的安全套接字层( SSL,Secure Sockets Layer) 流量, 这样 SSL 流量就可以穿过只允许 Web 流量通过的防火墙了。 HTTP/SSL 隧道收到一条 HTTP 请求, 要求建立一条到目的地址和端口的输出连接, 然后在 HTTP 信道上通过隧道传输加密的 SSL 流量, 这样就可以将其盲转发到目的服务器上去了。 - Agent 代理
发起自动 HTTP 请求的半智能 Web 客户端
用户 Agent 代理( 或者简称为 Agent 代理) 是代表用户发起 HTTP 请求的客户端程序。 所有发布 Web 请求的应用程序都是 HTTP Agent 代理。到目前为止, 我们只提到过一种 HTTP Agent 代理: Web 浏览器, 但用户 Agent 代理还有很多其他类型
2022/4/30 22:27:36 未完待续
第二章 URL与资源
2.1 互联网资源
URL的第一分(http)是URL方案(scheme)。方案可以告知Web客户端怎样访问资源。在这个例子中,URL说明要使用HTTP协议。
URL的第二部分(www.joes-hardware.com)指的是服务器的位置。这部分告知Web客户端资源位于何处。
URL的第三部分(/seasonal/index-fall.html)是资源路径。路径说明了请求的是服务器上哪个特定的本地资源。
URL 方案://服务器位置/路径
例 ftp://ftp.lots-o-books.com/pub/complete-price-list.xls
使用文件传输协议ftp获取文件;
服务器ftp.lots-o-books.com域名;
路径/pub/complete-price-list.xls
2.2 URL语法
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
组件 | 描述 | 默认值 |
---|---|---|
方案(scheme) | 访问服务器以获取资源时要使用哪种协议 | 无 |
用户 | 某些方案访问资源时需要的用户名 | |
密码 | 用户名后面可能要包含的密码,中间由冒号(😃 | <E-mail地址> |
主机 | 分隔资源宿主服务器的主机名或点分P地址 | 无 |
端口 | 资源宿主服务器正在监听的端口号。很多方案都有默认端口号(HTTP的默认端口号为80) | 方案特有 |
路径 | 服务器上资源的本地名,由一个斜杠(/)将其与前面的URL组件分隔开来。路径组件的语法是与服务器和方案有关的(URL路径可以分为若干个段,每段都可以有其特有的组件。) | 无 |
参数 | 某些方案会用这个组件来指定输入参数。参数为名/值对。URL中可以包含多个参数字段,它们相互之间以及与路径的其余部分之间用分号(:)分隔 | 无 |
查询 | 某些方案会用这个组件传递参数以激活应用程序(比如数据库、公告板、搜索引攀以及其他因特网关)。查询组件的内容没有通用格式。用字符“?”将其与URL的其余部分分隔开来 | 无 |
片段 | 一小片或一部分资源的名字。引用对象时,不会将frag字段传送给服务器,这个字段是在客户端内部使用的。通过字符“#”将其与URL的其余部分分隔开来 | 无 |
下面以 http://www.baidu.com:80/index.html 为例介绍
方案:http 主机为:www.baidu.com 端口:80 路径:/index.html
-
方案(scheme) 使用什么协议
实际上是规定如何访问指定资源的主要标识符,它会告诉负责解析URL的应用程序应该使用什么协议。方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL的其余部分分隔开来。方案名是大小写无关的,例http://www.baidu.com:80/index.html 使用 http协议 -
主机与端口
要想在因特网上找到资源,应用程序要知道是哪台机器装载了资源,以及在那台机器的什么地方可以找到能对目标资源进行访问的服务器。URL的主机和端口组件提供了这两组信息。
主机组件标识了因特网上能够访问资源的宿主机器。可以用上述主机(www.baidu.com),或者IP地址(14.215.177.39)来表示主机名。比如,下面两个URL就指向同一个资源一第一个URL是通过主机名,第二个是通过IP地址指向服务器的 -
用户名和密码
很多服务器都要求输人用户名和密码才会允许用户访问数据。FTP服务器就是这样一个常见的实例。这里有几个例子:
ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous@ftp.prep.ai.mit.edu/pub/gnu
ftp://anonymous:my_passwd@ftp.prep.ai.mit.edu/pub/gnu
http://joe:joespasswd@www.joes-hardware.com/sales_info.txt -
第一个例子没有用户或密码组件,只有标准的方案、主机和路径。如果某应用程序使用的URL方案要求输入用户名和密码,比如FTP,但用户没有提供,它通常会插入一个默认的用户名和密码。比如,如果向浏览器提供一个FTP URL,但没有指定用户名和密码,它就会插入anonymous(匿名用户)作为你的用户名,并发送一个默认的密码(Internet Explorer会发送IEUser,Netscape Navigator则会发送mozilla)。
-
第二个例子显示了一个指定为anonymous的用户名。这个用户名与主机组件组合在一起,看起来就像E-mail地址一样。字符“@”将用户和密码组件与URL的其余部分分隔开来。
-
第三个例子中,指定了用户名(anonymous)和密码(my_passwd),两者之间由字符“:”分隔。
-
路径
URL的路径组件说明了资源位于服务器的什么地方。路径通常很像一个分级的文件系统路径。比如:http://www.joes-hardware.com:80/seasonal/index-fall.html 这个URL中的路径为/seasonal/index-fall.html,很像UNIX文件系统中的文件系统路径。路径是服务器定位资源时所需的信息。可以用字符“”将HTTP URL的路径组件划分成一些路径段(path segment)(还是与UNIX文件系统中的文件路径类似)。每个路径段都有自己的参数(param)组件。 -
参数
对很多方案来说,只有简单的主机名和到达对象的路径是不够的。除了服务器正在监听的端口,以及是否能够通过用户名和密码访问资源外,很多协议都还需要更多的信息才能工作。负责解析URL的应用程序需要这些协议参数来访问资源。否则,另一端的服务器可能就不会为请求提供服务,或者更糟糕的是,提供错误的服务。比如,像FTP这样的协议,有两种传输模式,二进制和文本形式。你肯定不希望以文本形式来传送二进制图片,这样的话,二进制图片可能会变得一团糟。
为了向应用程序提供它们所需的输入参数,以便正确地与服务器进行交互,URL中有一个参数组件。这个组件就是URL中的名值对列表,由字符“;”将其与URL的其余部分(以及各名值对)分隔开来。它们为应用程序提供了访问资源所需的所有附加信息。比如:
ftp://prep.ai.mit.edu/pub/gnu;type=d
在这个例子中,有一个参数type=d,参数名为type,值为d。如前所述,HTTP URL的路径组件可以分成若干路径段。每段都可以有自己的参数。比如:
http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
这个例子就有两个路径段,hammers和index.html。hammers路径段有参数sale,其值为false。index.html段有参数graphics,其值为true。
查询与片段在此处略过
2.3 URL快捷方式
- 2.3.1 相对UPL
URL有两种方式:绝对的和相对的。到目前为止,我们只见过绝对URL。绝对URL中包含有访问资源所需的全部信息。另一方面,相对URL是不完整的。要从相对URL中获取访问资源所需的全部信息,就必须相对于另一个,被称为其基础(base)的URL进行解析。相对URL是URL的一种便捷缩略记法。
相对URL只是URL的片段或一小部分。处理URL的应用程序(比如浏览器)要能够在相对和绝对URL之间进行转换。
还需要注意的是,相对URL为保持一组资源(比如一些HTML页面)的便携性提供了一种便捷方式。如果使用的是相对URL,就可以在搬移一组文档的同时,仍然保持链接的有效性,因为相对UL都是相对于新基础进行解释的。这样就可以实现在其他服务器上提供镜像内容之类的功能了。
- 基础URL
转换处理的第一步就是找到基础URL。基础URL是作为相对URL的参考点使用的。可以来自以下几个不同的地方。
- 在资源中显式提供
有些资源会显式地指定基础URL。比如,HTML文档中可能会包含一个定义了
基础URL的HTML标记,通过它来转换那个HTML文档中的所有相对URL。 - 封装资源的基础URL
如果在一个没有显式指定基础URL的资源中发现了一个相对URL,可以将它所属资源的URL作为基础。 - 没有基础URL
在某些情况下,没有基础URL。这通常意味着你有一个相对URL,但有时可能只是一个不完整或损坏了的URL。
- 解析相对引用
前面介绍了URL的基本组件和语法。要将相对URL转换为一个绝对URL,下一步要做的就是将相对URL和基础URL划分成组件段。实际上,这样只是在解析URL,但这种做法会将其划分成一个个组件,因此通常会称作分解(decomposing)URL。只要将基础和相对URL划分成了组件,就可以应用相应算法完成转换
以例2使用上图算法
(1)路径为./hammers.html,基础URL为 http:/www.joes-hardware.comtools.html.
(2)方案为空,沿着图表的左半边向下处理,继承基础URL方案(HTTP)。
(3)至少一个组件非空,一直处理到底端,继承主机和端口组件。
(4)将来自相对URL(路径:.hammers.html)的组件与我们继承来的组件(方案:http, 主机:www.joes-.hardware.com,端口:80合并起来,得到新的绝对URL: http://www.joes-hardware.com/hammers.html.
- 2.3.2 自动扩展URL
- 主机名扩展 例:输入yahoo 就会自动插入www .com构建为www.yahoo.com
- 历史扩展 浏览器节省用户输入URL的时间,将访问过的URL历史存储起来
2.4 常见方案
2022/5/9 9:29:37 未完待续
<此处提出反思,对读书笔记应该更加精简,简化阅读中冗余的内容,多使用概括性的话,图表等>
第三章 HTTP报文
3.1 报文流
报文是HTTP应用程序间发送的数据块,流程可以理解为: 客户端发送报文 -> (经过代理) -> 报文流入远端服务器 -> 服务器工作完成后流回用户的代理中 -> (经过代理) -> 客户端. HTTP报文像河水一样向下游流动
3.2 报文组成部分详解
报文分为请求报文与响应报文.有三个部分组成
- 起始行 对报文进行描述
- 首部块 包含属性
- 主体 包含数据(可选)
起始行与首部是由行分隔的ASC||码,每行以一个回车一个换行符(合在一起为CRLF序列)作为终止序列
主体是可选的数据块,二进制文件
3.2.1 语法
- 请求报文语法格式
<method> <request-URL> <version> ----起始行
<headers> ----首部
<entity-body> ----主体
- 方法(method)
客户端希望对资源的操作 (GET,PSOT,HEAD等) - 请求URL(request-URL)
命名了所请求资源,或者完整url - 版本(version)
报文使用的HTTP版本 HTTP/版本格式
- 响应报文语法格式
<version> <status> <reason-phrase> ----起始行
<headers> ----首部
<entity-body> ----主体
-
状态码(status-code)
三位数字描述请求过程所发生的情况,第一位数字描述一般状态(成功,失败等) -
原因短语(reason-phrase)
数字状态码的可读版本 -
首部(header)
**0个或多个首部 **每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CLF。首部是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始。 -
实体主体部分(entity-body)
任意数据组成的数据块
3.2.2 起始行
- 请求行
<method> <request-URL> <version>
字段由空格分隔
例:GET /test/hi-there.txt HTTP/1.1
- 方法
- 响应行
<version> <status> <reason-phrase>
字段由空格分隔
例:HTTP/1.0 200 OK
-
状态码
可以通过三位数字代码对不同状态码进行分类。200到299之间的状态码表示成功。300到399之间的代码表示资源已经被移走了。400到499之间的代码表示客户端的请求出错了。500到599之间的代码表示服务器出错了。
-
原因短语 作用:解释状态码
常见状态码
状态码 | 原因短语 | 含义 |
---|---|---|
200 | ok | 成功,请求的所有数据都在响应主体中 |
401 | Unauthorized(未授权) | 需要输入用户名和密码 |
404 | Not Found(未找到) | 服务器无法找到请求URl对应资源 |
- 版本号
3.2.3 首部
注意:首部可以是0个或多个
- 首部分为通用首部,请求首部,响应首部,实体首部(描述主体长度和内容),扩展首部.
3.2.4 实体的主体部分
HTTP报文的负荷,即传输内容,注意:HTTP报文可以承载很多类型的数字数据:图片,视频,HTML文档,软件应用程序,电子邮件等
注意:HTTP 0.9版本是鼻祖,报文也由请求和响应组成,请求中只包含方法和URL,响应中支行实体
3.3 方法
安全方法GET和HEAD DELETE和PUT方法
3.3.1 GET方法
GET是最常用的方法。通常用于请求服务器发送某个资源。HTTP1.1要求服务器实现此方法。下图显示了一个例子,在这个例子中,客户端用GET方法发起了一次HTTP请求。
3.3.2 HEAD方法
HEAD方法与GET方法的行为很类似,但服务器在响应中只返回首部。不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。使用HEAD,可以:
- 在不获取资源的情况下了解资源的情况(比如,判断其类型);
- 通过查看响应中的状态码,看看某个对象是否存在;
- 通过查看首部,测试资源是否被修改了。
服务器开发者必须确保返回的首部与GET请求所返回的首部完全相同。遵循HTTP1.1规范,就必须实现HEAD方法。图3-8显示了实际的HEAD方法。
3.3.3 PUT方法
与GET从服务器读取文档相反,PUT方法会向服务器写入文档。有些发布系统允许用户创建Web页面,并用PUT直接将其安装到Web服务器上去。
PUT方法的语义就是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,或者如果那个URL已经存在的话,就用这个主体来替代它。
因为PUT允许用户对内容进行修改,所以很多Wb服务器都要求在执行PUT之前,用密码登录。
3.3.4 POST方法
POST方法起初是用来向服务器输入数据的3。实际上,通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器,然后由服务器将其发送到它要去的地方(比如,送到一个服务器网关程序中,然后由这个程序对其进行处理)。下图显示了一个用POST方法发起HTTP请求一向服务器发送表单数据一的客户端。
3.3.5 TRACE方法
客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可能会修改原始的HTTP请求。TRACE方法允许客户端在最终将请求发送给服务器时,看看它变成了什么样子。
TRACE请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹回一条TRACE响应,并在响应主体中携带它收到的原始请求报文。这样客户端就可以查看在所有中间HTTP应用程序组成的请求/响应链上,原始报文是否,以及如何被毁坏或修改过。
TRACE方法存在缺点,其假定中间应用程序对不同类型请求是一样的,TRACE不能区分代理的方法响应机制,通常中间应用程序会自行决定对TRACE请求的处理方式.
注意:TRACE请求不能带有实体的主体部分,TRACE响应的实体主体部分包含了响应服务器手袋的请求的精确副本
3.3.6 OPTIONS方法
OPTIONS方法请求Wb服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。(有些服务器可能只支持对一些特殊类型的对象使用特定的操作)。
3.3.7 DELETE方法
DELETE方法所做的事情就是请服务器删除请求URL所指定的资源。但是,客户端应用程序无法保证删除操作一定会被执行。因为HTTP规范允许服务器在不通知客户端的情况下撤销请求。
2022/5/10 9:48:18 未完待续
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体