HTTP
HTTP, Hypertext Transfer Protocol 超文本传输协议
HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础,同时,也是一种客户端—服务器(client-server)协议,也就是说,请求是由接受方——通常是 Web 浏览器——发起的。完整网页文档通常由文本、布局描述、图片、视频、脚本等资源构成。
客户端与服务端之间通过交换一个个独立的消息(而非数据流)进行通信。由客户端发出的消息被称作请求(request),由服务端发出的应答消息被称作响应(response)。
HTML, Hypertext Mark Language 超文本标记语言
HTML 定义了网页内容的含义和结构。除 HTML 以外的其他技术则通常用来描述一个网页的表现与展示效果(如 CSS),或功能与行为(如 JavaScript)。
“超文本”(hypertext)是指连接单个网站内或多个网站间的网页的链接。链接是网络的一个基本方面。只要将内容上传到互联网,并将其与他人创建的页面相链接,你就成为了万维网的积极参与者。
HTTP 系统组成
HTTP 是一个客户端—服务器协议:请求由一个实体,即用户代理(user agent),或是一个可以代表它的代理方(proxy)发出。大多数情况下,这个用户代理都是一个 Web 浏览器,不过它也可能是任何东西,比如一个爬取网页来充实、维护搜索引擎索引的机器爬虫。
每个请求都会被发送到一个服务器,它会处理这个请求并提供一个称作响应的回复。在客户端与服务器之间,还有许许多多的被称为代理的实体,履行不同的作用,例如充当网关或缓存。
客户端/用户代理
用户代理是任何能够代表用户行为的工具。这类工具以浏览器为主,不过,它也可能是工程师和 Web 开发人员调试应用所使用的那些程序。
Web 服务器
通信过程的另一侧是服务器,它负责_提供_客户端所请求的文档。
代理
在 Web 浏览器和服务器之间,有许多计算机和设备参与传递了 HTTP 消息。依靠 Web 技术栈的层次化的结构,传递过程中的多数操作都位于传输层、网络层或物理层,它们对于 HTTP 应用层而言就是透明的,并默默地对网络性能产生着重要影响。还有一部分实体在应用层参与消息传递,一般被称为代理(Proxy)。代理可以是透明的,即转发它们收到的请求并不做任何修改,也可以表现得不透明,将它传递给服务端之前使用一些手段修改这个请求。代理可以发挥很多种作用:
- 缓存(可以是公开的也可以是私有的,如浏览器的缓存)
- 过滤(如反病毒扫描、家长控制...)
- 负载均衡(让多个服务器服务不同的请求)
- 认证(控制对不同资源的访问)
- 日志(使得代理可以存储历史信息)
HTTP 基本性质
简约
HTTP 报文能够被人读懂并理解,向开发者提供了更简单的测试方式
可扩展
HTTP/1.0 中引入的 HTTP Headers 让该协议易于扩展和实验。只要服务器客户端之间对新标头的语义经过简单协商,新功能就可以被加入进来。
无状态,但并非无会话
无状态,在同一个连接中,两个执行成功的请求之间是没有关系的;会话,利用标头的扩展性,HTTP Cookie 被加进了协议工作流程,每个请求之间就能够创建会话,让每个请求都能共享相同的上下文信息或相同的状态。
HTTP 流
- 打开一个 TCP 连接:TCP 连接被用来发送一条或多条请求,以及接受响应消息。客户端可能打开一条新的连接,或重用一个已经存在的连接,或者也可能开几个新的与服务器的 TCP 连接。
2.发送一个 HTTP 报文:HTTP 报文(在 HTTP/2 之前)是人类可读的。在 HTTP/2 中,这些简单的消息被封装在了帧中,这使得报文不能被直接读取,但是原理仍是相同的。
3.读取服务端返回的报文信息
4.关闭连接或者为后续请求重用连接。
当启用 HTTP 流水线时,后续请求都可以直接发送,而不用等待第一个响应被全部接收。然而 HTTP 流水线已被证明很难在现有的网络中实现,因为现有网络中有老旧的软件与现代版本的软件同时存在。因此,HTTP 流水线已在 HTTP/2 中被更健壮、使用帧的多路复用请求所取代。
HTTP 请求报文
<Method> <Path> <Protocol version>
<Headers>
[Body]
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
HTTP 响应报文
<Protocol version> <Status code> <Status message>
<Headers>
[Body]
HTTP/1.1 200 OK
date: Tue, 18 JUN 2024 10:03:55 GMT
cache-control: public, max-age=3600
control-type: text/html
HTTP 的发展
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Guides/Evolution_of_HTTP
- HTTP/0.9——单行协议
- HTTP/1.0——构建可扩展性
- HTTP/1.1——标准化的协议
- HTTP/2 ——为了更有意的表现
- HTTP/3 ——基于QUIC 的 HTTP
HTTP Method
HTTP 定义了一组请求方法,以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作。虽然它们也可以是名词,但这些请求方法有时被称为 HTTP 动词。
安全
如果说一个 HTTP 方法是安全的,是指这是个不会修改服务器的数据的方法。也就是说,这是一个对服务器只读操作的方法。
幂等
如果同样的请求被执行一次与连续执行多次,对服务器的预期影响是相同的,那么称这个 HTTP 方法是幂等的。
可缓存
可缓存的响应是可以缓存的 HTTP 响应。它被存储起来以便后续的检索和使用,省去了对服务器的新的请求。
Idx | Method | Request Body | Response Body | 安全 | 幂等 | 可缓存 | HTML 表单中使用 | Desc |
---|---|---|---|---|---|---|---|---|
1 | GET | x | o | o | o | o | o | 请求指定资源的表示。使用 GET 的请求应该只用于请求数据,而不应该包含载荷。 |
2 | HEAD | x | x | o | o | o | x | 请求一个与 GET 请求的响应相同的响应,但没有响应体。 |
3 | POST | o | o | x | x | o | o | 发送数据给服务器。请求主体的类型由Content-Type 标头指定。 |
4 | PUT | o | o | x | o | o | x | 用有效载荷请求替换目标资源的所有当前表示。 |
5 | DELETE | o | o | x | o | x | x | 删除指定的资源。 |
6 | CONNECT | x | x | x | x | x | x | 建立一个到由目标资源标识的服务器的隧道。 |
7 | OPTIONS | o | o | o | o | x | x | 用于描述目标资源的通信选项。 |
8 | TRACE | x | o | o | o | x | x | 沿着到目标资源的路径执行一个消息环回测试。 |
9 | PATCH | o | o | x | x | x | x | 用于对资源应用部分修改。 |
HTTP response status code
status code | Desc |
---|---|
100-199 | 信息响应 |
200-299 | 成功响应 |
300-399 | 重定向消息 |
400-499 | 客户端错误响应 |
500-599 | 服务端错误响应 |
status code | ||
---|---|---|
100 | continue | 这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。 |
101 | switching protocols | 该代码是响应客户端的 Upgrade 请求头发送的,指明服务器即将切换的协议。 |
102 | processing | 此代码表示服务器已收到并正在处理该请求,但当前没有响应可用。 |
103 | early hints | 此状态代码主要用于与 Link 链接头一起使用,以允许用户代理在服务器准备响应阶段时开始预加载 preloading 资源。 |
200 | ok | |
201 | created | |
202 | accepted | |
203 | non-authoritative information | |
204 | not content | 对于该请求没有的内容可发送,但头部字段可能有用。用户代理可能会用此时请求头部信息来更新原来资源的头部缓存字段。 |
205 | reset content | 告诉用户代理重置发送此请求的文档。 |
206 | partial content | 当从客户端发送Range 范围标头以只请求资源的一部分时,将使用此响应代码。 |
207 | multi-status | 对于多个状态代码都可能合适的情况,传输有关多个资源的信息。 |
226 | im used | 服务器已经完成了对资源的GET 请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。 |
300 | multiple choice | 请求拥有多个可能的响应。用户代理或者用户应当从中选择一个。(没有标准化的方法来选择其中一个响应,但是建议使用指向可能性的 HTML 链接,以便用户可以选择。) |
301 | moved permanently | 请求资源的 URL 已永久更改。在响应中给出了新的 URL。 |
302 | found | 此响应代码表示所请求资源的 URI 已 暂时 更改。未来可能会对 URI 进行进一步的改变。因此,客户机应该在将来的请求中使用这个相同的 URI。 |
303 | see other | 服务器发送此响应,以指示客户端通过一个 GET 请求在另一个 URI 中获取所请求的资源。 |
304 | not modified | 这是用于缓存的目的。它告诉客户端响应还没有被修改,因此客户端可以继续使用相同的缓存版本的响应。 |
305 | use proxy | 在 HTTP 规范中定义,以指示请求的响应必须被代理访问。由于对代理的带内配置的安全考虑,它已被弃用。 |
306 | unused | 此响应代码不再使用;它只是保留。它曾在 HTTP/1.1 规范的早期版本中使用过。 |
307 | temporary redirect | 服务器发送此响应,以指示客户端使用在前一个请求中使用的相同方法在另一个 URI 上获取所请求的资源。这与 302 Found HTTP 响应代码具有相同的语义,但用户代理 不能 更改所使用的 HTTP 方法:如果在第一个请求中使用了 POST ,则在第二个请求中必须使用 POST |
308 | permanent redirect | 这意味着资源现在永久位于由Location: HTTP Response 标头指定的另一个 URI。这与 301 Moved Permanently HTTP 响应代码具有相同的语义,但用户代理不能更改所使用的 HTTP 方法:如果在第一个请求中使用 POST ,则必须在第二个请求中使用 POST 。 |
400 | bad request | 由于被认为是客户端错误(例如,错误的请求语法、无效的请求消息帧或欺骗性的请求路由),服务器无法或不会处理请求。 |
401 | unauthorized | 虽然 HTTP 标准指定了"unauthorized",但从语义上来说,这个响应意味着"unauthenticated"。也就是说,客户端必须对自身进行身份验证才能获得请求的响应。 |
402 | payment required | 此响应代码保留供将来使用。创建此代码的最初目的是将其用于数字支付系统,但是此状态代码很少使用,并且不存在标准约定。 |
403 | forbidden | 客户端没有访问内容的权限;也就是说,它是未经授权的,因此服务器拒绝提供请求的资源。与 401 Unauthorized 不同,服务器知道客户端的身份。 |
404 | not found | 服务器找不到请求的资源。在浏览器中,这意味着无法识别 URL。在 API 中,这也可能意味着端点有效,但资源本身不存在。服务器也可以发送此响应,而不是 403 Forbidden ,以向未经授权的客户端隐藏资源的存在。这个响应代码可能是最广为人知的,因为它经常出现在网络上。 |
405 | method not allowed | 服务器知道请求方法,但目标资源不支持该方法。例如,API 可能不允许调用DELETE 来删除资源。 |
406 | not acceptable | 当 web 服务器在执行服务端驱动型内容协商机制后,没有发现任何符合用户代理给定标准的内容时,就会发送此响应。 |
407 | proxy authentication required | 类似于 401 Unauthorized 但是认证需要由代理完成 |
408 | request timeout | 此响应由一些服务器在空闲连接上发送,即使客户端之前没有任何请求。这意味着服务器想关闭这个未使用的连接。由于一些浏览器,如 Chrome、Firefox 27+ 或 IE9,使用 HTTP 预连接机制来加速冲浪,所以这种响应被使用得更多。还要注意的是,有些服务器只是关闭了连接而没有发送此消息 |
409 | conflict | 当请求与服务器的当前状态冲突时,将发送此响应。 |
410 | gone | 当请求的内容已从服务器中永久删除且没有转发地址时,将发送此响应。客户端需要删除缓存和指向资源的链接。HTTP 规范打算将此状态代码用于“有限时间的促销服务”。API 不应被迫指出已使用此状态代码删除的资源。 |
411 | length required | 服务端拒绝该请求因为 Content-Length 头部字段未定义但是服务端需要它。 |
412 | precondition failed | 客户端在其头文件中指出了服务器不满足的先决条件。 |
413 | payload too large | 请求实体大于服务器定义的限制。服务器可能会关闭连接,或在标头字段后返回重试 Retry-After 。 |
414 | uri too long | 客户端请求的 URI 比服务器愿意接收的长度长。 |
415 | unsupported media type | 服务器不支持请求数据的媒体格式,因此服务器拒绝请求。 |
416 | range not satisfiable | 无法满足请求中 Range 标头字段指定的范围。该范围可能超出了目标 URI 数据的大小。 |
417 | expectation failed | 此响应代码表示服务器无法满足 Expect 请求标头字段所指示的期望。 |
418 | i'm a teapot | 服务端拒绝用茶壶煮咖啡。笑话,典故来源茶壶冲泡咖啡 |
421 | misdirected request | 请求被定向到无法生成响应的服务器。这可以由未配置为针对请求 URI 中包含的方案和权限组合生成响应的服务器发送。 |
422 | unprocessable entity | 请求格式正确,但由于语义错误而无法遵循。 |
423 | locked | 正在访问的资源已锁定。 |
424 | failed dependency | 由于前一个请求失败,请求失败。 |
425 | too early | 表示服务器不愿意冒险处理可能被重播的请求。 |
426 | upgrade required | 服务器拒绝使用当前协议执行请求,但在客户端升级到其他协议后可能愿意这样做。 服务端发送带有Upgrade 字段的 426 响应 来表明它所需的协议(们)。 |
428 | precondition required | 源服务器要求请求是有条件的。此响应旨在防止'丢失更新'问题,即当第三方修改服务器上的状态时,客户端 GET 获取资源的状态,对其进行修改并将其 PUT 放回服务器,从而导致冲突。 |
429 | too many requests | 用户在给定的时间内发送了太多请求("限制请求速率") |
431 | request header fields too large | 服务器不愿意处理请求,因为其头字段太大。在减小请求头字段的大小后,可以重新提交请求。 |
451 | unavailable for legal reasons | 用户代理请求了无法合法提供的资源,例如政府审查的网页。 |
500 | internal server error | 服务器遇到了不知道如何处理的情况。 |
501 | not implemented | 服务器不支持请求方法,因此无法处理。服务器需要支持的唯二方法(因此不能返回此代码)是 GET and HEAD . |
502 | bad gateway | 此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。 |
503 | service unavailable | 服务器没有准备好处理请求。常见原因是服务器因维护或重载而停机。请注意,与此响应一起,应发送解释问题的用户友好页面。这个响应应该用于临时条件和如果可能的话,HTTP 标头 Retry-After 字段应该包含恢复服务之前的估计时间。网站管理员还必须注意与此响应一起发送的与缓存相关的标头,因为这些临时条件响应通常不应被缓存。 |
504 | gateway timeout | 当服务器充当网关且无法及时获得响应时,会给出此错误响应。 |
505 | HTTP version not supported | 服务器不支持请求中使用的 HTTP 版本。 |
506 | variant also negotiates | 服务器存在内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当终点。 |
507 | insufficient storage | 无法在资源上执行该方法,因为服务器无法存储成功完成请求所需的表示。 |
508 | loop detected | 服务器在处理请求时检测到无限循环。 |
510 | not extended | 服务器需要对请求进行进一步扩展才能完成请求。 |
511 | network authentication required | 指示客户端需要进行身份验证才能获得网络访问权限。 |
HTTP Header
HTTP header 允许客户端和服务器通过 HTTP 请求(request)或者响应(response)传递附加信息。
Request Headers
Header | Desc |
---|---|
Host | 请求的服务器的域名和端口号(HTTP/1.1 规范要求必须包含) |
User-Agent | 包含发出请求的客户端应用程序信息(如浏览器类型、操作系统等)。 |
Accept | 通知服务器可以发回的数据类型 |
Accept-Language | 通知希望服务器返回的人类语言。 |
Accept-Encoding | 可用于返回的资源的编码算法,通常是压缩算法。 |
Referer | 前一个网页的地址,表示从该网页链接(进入)到当前请求的页面。 |
Connection | 控制当前事务完成后网络连接是否保持打开状态。 |
Upgrade-Insecure-Requests | |
If-Modified-Since | 使请求有条件,并期望资源在给定日期后被修改时才请求传输该资源。这用于仅在缓存过期时传输数据。 |
If-None-Match | 使请求有条件,并且仅当存储的资源与给定的 ETag 都_不_匹配时才应用该方法。这用于更新缓存(用于安全请求),或防止在资源已存在时上传新资源 |
Cache-Control | 请求和响应中缓存机制的指令。 |
Origin | Web 内容的源由用于访问它的 URL 的_方案_(协议)、主机名(域名)和_端口_定义。只有当协议、主机和端口都匹配时,两个对象才具有相同的源。 |
Cookie | 包含先前由服务器使用 Set-Cookie 标头发送然后被存储的 HTTP |
Response Headers
Header | Desc |
---|---|
Access-Control-Allow-Origin | 响应标头指定了该响应的资源是否被允许与给定的来源(origin)共享。 |
Content-Encoding | 用于指定压缩算法。 |
Date | 包含消息的创建日期和时间。 |
Etag | 标识资源版本的唯一字符串。使用 If-Match 和 If-None-Match 的条件请求使用此值来更改请求的行为。 |
Keep-Alive | 控制持久连接应保持打开状态的时间。 |
Last-Modified | 资源的最后修改日期,用于比较同一个资源的多个版本。它不如 ETag 准确,但在某些环境中更容易计算。使用 If-Modified-Since 和 If-Unmodified-Since 的条件请求使用此值来更改请求的行为。 |
Server | 包含了处理请求的源服务器所用到的软件相关信息。 |
Set-Cookie | 将 cookie 从服务器发送到用户代理。 |
Transfer-Encoding | 指定用于将资源安全地传输给用户的编码形式。 |
Vary | 确定如何匹配请求标头,以决定是否可以使用缓存的响应,还是从源服务器请求新的响应。 |
Message body information
Header | Desc |
---|---|
Content-Length | 资源的大小,以十进制字节数表示。 |
Content-Type | 指示资源的媒体类型。(见 MIME 说明) |
Content-Encoding | 用于指定压缩算法。 |
Content-Location | 指示返回数据的备用位置。 |
Content-Language | 描述面向受众的人类语言,以便用户可以根据自己的首选语言进行区分。 |
Content-Disposition | 指示回复的内容该以何种形式展示,是以_内联_的形式(即网页或者页面的一部分),还是以_附件_的形式下载并保存到本地。 |
MIME, Multipurpose Internet Mail Extensions 多用途互联网邮件拓展
MIME 类型现在正式地称作“媒体类型”,但有时也被称作“内容类型”。是指示文件类型的会与文件同时发送出去的字符串,描述了内容的格式(例如,一个声音文件可能被标记为 audio/ogg
,一个图像文件可能是 image/png
)。
它与传统 Windows 上的文件扩展名有相同目的。这个术语的名字源于最初用于电子邮件的 MIME 标准。
两种主要的 MIME 类型在默认类型中扮演了重要的角色:
text/plain
表示文本文件的默认值。一个文本文件应当是人类可读的,并且不包含二进制数据。application/octet-stream
表示所有其他情况的默认值。一种未知的文件类型应当使用此类型。浏览器在处理这些文件时会特别小心,试图防止、避免用户的危险行为。
IANA 是 MIME 媒体类型的官方注册机构,并维护了官方所有 MIME 类型的列表。下面的表格列出了 Web 上的一些重要 MIME 类型:
扩展名 | 文档类型 | MIME 类型 |
---|---|---|
.aac | AAC 音频 | audio/aac |
.abw | AbiWord 文档 | application/x-abiword |
.apng | 动态可移植网络图形(APNG)图像 | image/apng |
.arc | 归档文件(嵌入多个文件) | application/x-freearc |
.avif | AVIF 图像 | image/avif |
.avi | AVI:音频视频交织文件格式(Audio Video Interleave) | video/x-msvideo |
.azw | Amazon Kindle 电子书格式 | application/vnd.amazon.ebook |
.bin | 任何二进制数据类型 | application/octet-stream |
.bmp | Windows OS/2 位图 | image/bmp |
.bz | BZip 归档 | application/x-bzip |
.bz2 | BZip2 归档 | application/x-bzip2 |
.cda | CD 音频 | application/x-cdf |
.csh | C-Shell 脚本 | application/x-csh |
.css | 层叠样式表(CSS) | text/css |
.csv | 逗号分隔值(CSV) | text/csv |
.doc | Microsoft Word | application/msword |
.docx | Microsoft Word(OpenXML) | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
.eot | MS 嵌入式 OpenType 字体 | application/vnd.ms-fontobject |
.epub | 电子出版(EPUB) | application/epub+zip |
.gz | GZip 压缩归档 | application/gzip |
.gif | 图像互换格式(GIF) | image/gif |
.htm , .html | 超文本标记语言(HTML) | text/html |
.ico | 图标(Icon)格式 | image/vnd.microsoft.icon |
.ics | iCalendar 格式 | text/calendar |
.jar | Java 归档(JAR) | application/java-archive |
.jpeg , .jpg | JPEG 图像 | image/jpeg |
.js | JavaScript | text/javascript (规范:HTML 和 RFC 9239) |
.json | JSON 格式 | application/json |
.jsonld | JSON-LD 格式 | application/ld+json |
.mid , .midi | 音乐数字接口(MIDI) | audio/midi 、audio/x-midi |
.mjs | JavaScript 模块 | text/javascript |
.mp3 | MP3 音频 | audio/mpeg |
.mp4 | MP4 视频 | video/mp4 |
.mpeg | MPEG 视频 | video/mpeg |
.mpkg | Apple 安装包 | application/vnd.apple.installer+xml |
.odp | 开放文档演示稿文档 | application/vnd.oasis.opendocument.presentation |
.ods | 开放文档表格文档 | application/vnd.oasis.opendocument.spreadsheet |
.odt | 开放文档文本文档 | application/vnd.oasis.opendocument.text |
.oga | OGG 音频 | audio/ogg |
.ogv | OGG 视频 | video/ogg |
.ogx | OGG | application/ogg |
.opus | Opus 音频 | audio/opus |
.otf | OpenType 字体 | font/otf |
.png | 便携式网络图形 | image/png |
.pdf | Adobe PDF | application/pdf |
.php | 超文本预处理器(Personal Home Page) | application/x-httpd-php |
.ppt | Microsoft PowerPoint | application/vnd.ms-powerpoint |
.pptx | Microsoft PowerPoint(OpenXML) | application/vnd.openxmlformats-officedocument.presentationml.presentation |
.rar | RAR 归档 | application/vnd.rar |
.rtf | 富文本格式(RTF) | application/rtf |
.sh | 伯恩 shell 脚本 | application/x-sh |
.svg | 可缩放矢量图形(SVG) | image/svg+xml |
.tar | 磁带归档(TAR) | application/x-tar |
.tif , .tiff | 标签图像文件格式(TIFF) | image/tiff |
.ts | MPEG 传输流 | video/mp2t |
.ttf | TrueType 字体 | font/ttf |
.txt | 文本(通常是 ASCII 或 ISO 8859-n) | text/plain |
.vsd | Microsoft Visio | application/vnd.visio |
.wav | 波形音频格式 | audio/wav |
.weba | WEBM 音频 | audio/webm |
.webm | WEBM 视频 | video/webm |
.webp | WEBP 图像 | image/webp |
.woff | Web 开放字体格式(WOFF) | font/woff |
.woff2 | Web 开放字体格式(WOFF) | font/woff2 |
.xhtml | XHTML | application/xhtml+xml |
.xls | Microsoft Excel | application/vnd.ms-excel |
.xlsx | Microsoft Excel(OpenXML) | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
.xml | XML | RFC 7303(section 4.1)推荐使用 application/xml ,但有时仍会使用 text/xml 。你可以将特定的 MIME 类型分配给具有 .xml 扩展名的文件,这取决于其内容的解释方式。例如,Atom 消息来源是 application/atom+xml ,而 application/xml 是默认的有效值。 |
.xul | XUL | application/vnd.mozilla.xul+xml |
.zip | ZIP 归档 | application/zip |
.3gp | 3GPP 音视频容器 | video/3gpp ;如果不包含视频则为 audio/3gpp |
.3g2 | 3GPP2 音视频容器 | video/3gpp2 ;如果不包含视频则为 audio/3gpp2 |
.7z | 7-zip 归档 | application/x-7z-compressed |
URI, Uniform Resource Identifier 统一资源标识符
URI 是一段用于标识超文本资源的字符序列。这个资源可以是抽象的,也可以是物理存在的,甚至可能是尚未创建的未来资源。URI 的语法设计非常灵活,能够涵盖各种使用场景。
URI 在其他地方使用时,如 HTML <a>
可用于触发获取资源以外的行为,包括打开电子邮件客户端、发送文本信息或执行 JavaScript。
scheme:[authority]host[:port][/path][?query][#fragment]
例:http://john.doe@example.com:123/forum/questions?tag=networking&order=newest#top
scheme 协议
URI 的第一个组成部分,由一个字母开头,后跟字母、数字、加号(+)、点号(.)或连字符(-)组成。虽然语法上不区分大小写,但推荐使用小写。例如:
http
、https
、mailto
。scheme 是必须的,不能省略。authority 授权信息
username@host
path 路径
由斜杠(/)分隔的路径片段组成
query 参数
可选部分,通常以问号(?)开头,包含多个键值对,用
&
或;
分隔。fragment 片段
可选部分,以井号(#)开头,用于标识资源内部的某个子部分。
URL, Uniform Resource Locator 统一资源定位符
URL 属于 URI 的一个子集,用于标识资源在网络中的位置,并说明如何获取该资源。
例:
http://example.org/wiki/main_page
<!-- 这个 URL 标识通过 HTTP 协议从 example.org 获取 HTML 页面 /wiki/main_page。 -->
URN, Uniform Resource Name 统一资源名称
URN 是 URI 的另一个子集,用于提供全球唯一持久的资源标识,即使资源不存在或无法访问
urn:<namespace>:<specific part>
例:
- 书籍 ISBN 号
urn:isbn:0451450523
表示书籍《The Last Unicorn》 - 电影 ISAN 号
urn:isan:0000-0000-2CEA-0000-1-0000-0000-Y
其他常见 URI 协议
schema | desc |
---|---|
tel | 电话号码 |
mailto | 邮箱地址 |
skype | Skype 通话 |
ftp | 文件传输 |
file | 本地文件路径 |
HTTP 使用 80 端口通信,不加密,存在安全风险;而 HTTPS 使用 443 端口加密通信并需要证书验证,安全性更高。 |
Web Server
1、建立链接:接受或拒接客户端链接请求; 2、接收请求:通过网络读取 HTTP 请求报文; 3、处理请求:解析报文并作出响应动作; 4、访问资源:访问请求报文中相关的资源; 5、构建响应:使用正确的首部生产 HTTP 响应报文; 6、发送响应:向客户端发送生成响应报文; 7、记录日志:记录完成的 HTTP 事务;
Web 服务器不提供”动态处理“(不提供解释器)
获取一个动态页面
客户端请求 -> 内核空间 (处理 tcp/ip) -> 套接字 -> 用户空间 web server -> 内核模式访问硬盘获取文件 -> 用户空间(处理文件)-> 返回客户端(HTML 格式文件)
HTTP,TCP:三次握手,四次断开
HTTP/1.1
- 缓存
- 长连接
Apache MPM
CS
- C: Client Agent (browser, spider)
- S: server
- client -> request -> server
- URI
- HTTP Method: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECTION
- HTTP status: 2xx, 3xx, 4xx, 5xx
- HTTP headers
- name: value
- server -> response -> client
- 并发响应模型:单线程/单进程、多进程/多线程、单进程多请求、多进程多请求
- Apache httpd
- Nginx
- lighttpd
单线程/单进程
多进程/多线程 https://hellogithub.com/report/netcraft
监听
阻塞
非阻塞
tcp/ip
IP
- source IP
- destination IP TCP
- source port
- destination port HTTP
- GET xxx.html
- Host: www.xxx.com(虚拟主机)
[^1]: