【Linux网络】应用层协议HTTP

📅 发布时间:2026/7/11 2:24:53 👁️ 浏览次数:
【Linux网络】应用层协议HTTP
核心特点无状态下面附上一张关于HTTP常见header的表格字段名含义样例Accept客户端可接受的响应内容类型Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,image/apng,/;q0.8Accept-Encoding客户端支持的数据压缩格式Accept-Encoding: gzip, deflate, brAccept-Language客户端可接受的语⾔类型Accept-Language: zh-CN,zh;q0.9,en;q0.8Host请求的主机名和端口号Host: www.example.com:8080User-Agent客户端的软件环境信息User-Agent: Mozilla/5.0 (Windows NT 10.0;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36Cookie客户端发送给服务器的HTTP cookie信息Cookie: session_idabcdefg12345; user_id123Referer请求的来源URLReferer:http://www.example.com/previous_page.htmlContent-Type实体主体的媒体类型Content-Type: application/x-www-formurlencoded (对于表单提交) 或 Content-Type:application/json (对于JSON数据)Content-Length实体主体的字节大小Content-Length: 150Authorization认证信息如用户名和密码Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ (Base64编码后的用户名:密码)Cache-Control缓存控制指令请求时 Cache-Control: no-cache 或 CacheControl: max-age3600 响应时 CacheControl: public, max-age3600Connection请求完后是关闭还是保持连接Connection: keep-alive 或 Connection: closeDate请求或响应的日期和时间Date: Wed, 21 Oct 2023 07:28:00 GMTLocation重定向的目标URL与3xx状态码配合使用Location:http://www.example.com/new_location.html (与302状态码配合使用)Server服务器类型Server: Apache/2.4.41 (Unix)Last-Modified资源的最后修改时间Last-Modified: Wed, 21 Oct 2023 07:20:00 GMTETag资源的唯⼀标识符用于缓存ETag: “3f80f-1b6-5f4e2512a4100”Expires响应过期的日期和时间Expires: Wed, 21 Oct 2023 08:28:00 GMT本文参语法格式Connection: keep-alive表示希望保持连接以复用TCP连接。Connection: close表示请求/响应完成后应该关闭TCP连接。持久连接长连接HTTP/1.1在HTTP/1.1协议中默认使用持久连接。当客户端和服务器都不明确指定关闭连接时连接将保持打开状态以便后续的请求和响应可以复用同一个连接。 HTTP/1.0在HTTP/1.0协议中默认连接是非持久的。如果希望在HTTP/1.0上实现持久连接需要在请求头中显式设置Connection: keep-alive。关于connection报头HTTP中的Connection字段是HTTP报文头的一部分它主要用于控制和管理客户端与服务器之间的连接状态核心作用管理持久连接 Connection 字段还用于管理持久连接也称为长连接。持久连接允许客户端和服务器在请求/响应完成后不立即关闭TCP连接以便在同一个连接上发送多个请求和接收多个响应。代码语言javascriptAI代码解释HTTP/1.1 302 Found\r\n Location: https://www.new-url.com\r\n总结无论是HTTP 301还是HTTP 302重定向都需要依赖Location选项来指定资源的新位置。这个Location选项是一个标准的HTTP响应头部用于告诉浏览器应该将请求重定向到哪个新的URL地址。6. HTTP头部字段6.1 HTTP常见HeaderContent-Type: 数据类型(text/html等) Content-Length: Body的长度 Host: 客户端告知服务器所请求的资源是在哪个主机的哪个端口上; User-Agent: 声明用户的操作系统和浏览器版本信息; Referer: 当前页面是从哪个页面跳转过来的; Location: 搭配3xx状态码使用告诉客户端接下来要去哪里访问; Cookie: 用于在客户端存储少量信息通常用于实现会话(session)的功能;代码语言javascriptAI代码解释HTTP/1.1 301 Moved Permanently\r\n Location: https://www.new-url.com\r\nHTTP状态码302临时重定向当服务器返回HTTP 302状态码时表示请求的资源临时被移动到新的位置。 同样地服务器也会在响应中添加一个Location头部来指定资源的新位置。浏览器会暂时使用新的URL进行后续的请求但不会缓存这个重定向。 例如在HTTP响应中可能会看到类似于以下的头部信息以下是仅包含重定向相关状态码的表格状态码含义是否为临时重定向应用样例301Moved Permanently否永久重定向网站换域名后自动跳转到新域名搜索引擎更新网站链接时使用302Found 或 See Other是临时重定向用户登录成功后重定向到用户首页307Temporary Redirect是临时重定向临时重定向资源到新的位置较少使用308Permanent Redirect否永久重定向永久重定向资源到新的位置较少使用关于重定向的验证以301为代表HTTP状态码301永久重定向和302临时重定向都依赖Location选项。以下是关于两者依赖Location选项的详细说明HTTP状态码301永久重定向当服务器返回HTTP 301状态码时表示请求的资源已经被永久移动到新的位置。 在这种情况下服务器会在响应中添加一个Location头部用于指定资源的新位置。这个Location头部包含了新的URL地址浏览器会自动重定向到该地址。 例如在HTTP响应中可能会看到类似于以下的头部信息5xx 服务器错误500 Internal Server Error服务器内部错误 502 Bad Gateway网关错误 503 Service Unavailable服务不可用4xx 客户端错误400 Bad Request请求语法错误 401 Unauthorized需要身份验证 403 Forbidden服务器拒绝请求 404 Not Found请求的资源不存在3xx 重定向301 Moved Permanently永久重定向 302 Found临时重定向 304 Not Modified资源未修改使用缓存5. HTTP状态码详解5.1 状态码分类在这里插入图片描述最常见的状态码比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(BadGateway)5.2 常见状态码详解2xx 成功200 OK请求成功返回请求的资源 201 Created资源创建成功 204 No Content请求成功但无内容返回示例代码语言javascriptAI代码解释POST /api/users HTTP/1.1 Host: example.com Content-Type: application/json Content-Length: 38 {name: Alice, email: aliceexample.com}适用场景用户注册、登录 提交表单 文件上传 创建资源RESTful API 中常用特点非幂等性每次 POST 可能产生新资源如新建用户、提交订单多次调用结果不同。 数据在报文体中参数放在请求体body里不会出现在 URL 中。 不可缓存默认不被缓存。 无长度限制理论上可以发送任意大小的数据受服务器配置限制。 适合提交表单、上传文件、API 数据等。4.3 POST方法定义用于向服务器发送数据通常用于创建新资源或更新现有资源。示例代码语言javascriptAI代码解释GET /api/users?id123 HTTP/1.1 Host: example.com注意不适合传输敏感信息如密码因为参数暴露在 URL 中可能被记录在日志、浏览器历史中。 不建议用于提交表单数据除非是搜索、筛选等只读操作。特点幂等性多次执行相同 GET 请求结果一致不会改变服务器状态。 安全性只读操作不修改数据。 参数在 URL 中通过查询字符串query string传递参数如 ?id123nameabc。 可被缓存浏览器或代理服务器可以缓存 GET 响应。 长度限制受限于 URL 最大长度通常几千字节不适合大数据传输。但是需要注意的是HTTP报文可能使用分块传输编码Transfer-Encoding: chunked或者有Content-Length头部来指示主体长度。因此完整读取一个报文可能需要根据这些头部信息来确定主体的长度。以下是一个基本的步骤步骤1读取数据直到遇到空行这样我们就可以先解析头部。步骤2解析头部获取重要的头部字段如Content-Length或Transfer-Encoding。步骤3根据头部信息读取主体部分如果存在Content-Length则读取指定长度的字节。如果是分块编码则需要按照分块编码的规则读取直到遇到一个长度为0的块。如果既没有Content-Length也不是分块编码那么主体可能直到连接关闭为止例如HTTP/1.0的持续连接关闭时表示主体结束。4. HTTP方法4.1 常见的 HTTP 方法方法描述幂等性安全性GET获取资源。只应用于请求数据不应产生副作用。是是POST创建新资源或提交数据如表单、文件上传。否否PUT更新/替换一个已存在的资源。是否PATCH部分更新一个资源。否否DELETE删除指定的资源。是否HEAD与 GET 类似但只获取响应头不获取响应体。用于检查资源是否存在等。是是OPTIONS用于描述目标资源的通信选项如服务器支持哪些方法。是是幂等性同样的请求执行一次与连续执行多次对服务器资源的状态改变是相同的。 安全性该方法不应改变服务器资源的状态。其中最常用的就是GET方法和POST方法.4.2 GET方法定义用于获取资源从服务器请求数据。 是最常用的 HTTP 方法。那怎么将报文中的报头和报文有效分离出来呢怎么完整读取到一个报文呢在HTTP协议中报文分为请求报文和响应报文。两者格式类似都由起始行、头部Header和主体Body组成。头部和主体之间通过一个空行即连续的\r\n\r\n来分隔。要分离报头和报文主体我们需要读取整个HTTP报文可能分多次读取。 在读取的数据中查找空行\r\n\r\n的位置。 空行之前的部分是头部之后的部分是主体。在这里插入图片描述示例在这里插入图片描述首行: [版本号] [状态码] [状态码解释] Header: 请求的属性冒号分割的键值对每组属性之间使用 \r\n 分隔遇到空行表示Header部分结束 Body: 空行后面的内容都是BodyBody允许为空字符串如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度如果服务器返回了一个html页面那么html页面内容就是在body中.一个 HTTP 响应由以下部分组成状态行包含 HTTP 版本、状态码和状态消息。HTTP/1.1 200 OK响应头包含关于响应的元信息。Server: nginx/1.18.0Content-Type: text/html; charsetutf-8Content-Length: 1234Set-Cookie: sessionIdabc123空行分隔头部和主体。 响应体服务器返回的实际内容如 HTML 文档、图片数据等。响应报文在这里插入图片描述示例在这里插入图片描述首行: [方法] [url] [版本] Header: 请求的属性冒号分割的键值对每组属性之间使用 \r\n 分隔遇到空行表示 Header 部分结束 Body: 空行后面的内容都是BodyBody允许为空字符串如果Body存在则在Header中会有一个Content-Length属性来标识Body的长度一个 HTTP 请求由以下部分组成请求行包含方法、URL 和 HTTP 版本。GET /index.html HTTP/1.1请求头包含关于请求的元信息以键值对的形式。Host: www.example.comUser-Agent: Mozilla/5.0…Accept: text/htmlCookie: namevalue空行分隔头部和主体。 请求体可选部分通常在 POST、PUT 等方法中携带要发送给服务器的数据如表单数据、JSON 等。示例 一个未编码的 URLhttps://example.com/search?qhello worldlangzh-CN编码后的 URLhttps://example.com/search?qhello%20worldlangzh-CN例如在这里插入图片描述上图中 “” 被转义成了 “%2B”注意URLDecode是URLEncode的逆过程将编码后的字符恢复为原始字符下面推荐一个编码解码的网站编码解码工具3. HTTP协议请求与响应格式请求报文2.3 URL 编码由于 URL 只能使用 ASCII 字符集中的一组有限字符字母、数字和少数符号如果 URL 中包含不在此范围内的字符如中文、空格、特殊符号就必须进行 URL 编码。规则 使用百分号 % 后跟两位十六进制数来表示该字符的 ASCII 码。将需要转码的字符转换为16进制从右到左取4位不足4位直接处理每2位作为一组前面加上%格式为%XY常见例子空格 编码为%20或编码为并不是标准的 URL 编码方式而是 特定上下文中的特殊约定。中文 如“中国”在 UTF-8 编码下会被编码为%E4%B8%AD%E5%9B%BD。符号编码为%26?编码为%3F。例子中的部分#reviews说明 片段也称为“锚点”用于指向资源内部的某个特定部分。浏览器在加载完整个页面后会自动滚动到该片段所标识的位置。它不会被发送到服务器 片段 例子中的部分?categoryelectronicspage2说明 查询字符串用于向服务器传递额外的参数。它通常用于搜索、筛选或传递用户输入。以问号 ? 开始。由多个 参数/值对 组成格式为 参数值。不同的参数对之间用 符号分隔。在上面的例子中我们向服务器传递了两个参数categoryelectronics 和 page2可能意味着请求“电子产品”分类下的第“2”页。查询字符串 例子中的部分/products/index.html说明 路径表示资源在服务器上的具体位置类似于操作系统中的文件路径。它指向特定的页面、图片或脚本等。 路径这部分通常包括主机名、端口有时还包含用户名和密码。主机名例子中的部分www.example.com说明 主机名是资源所在服务器的地址。它可以通过 DNS 解析为服务器的 IP 地址。组成部分子域名www域名example顶级域名.com端口例子中的部分:443说明 端口用于指定服务器上正在运行的特定服务或应用程序。由于 HTTP 的默认端口是 80HTTPS 的默认端口是 443所以这个部分在 URL 中通常会被省略。如果服务运行在非标准端口上则必须明确指定例如 :8080。授权机构 例子中的部分https:说明 协议指明了访问资源所需要使用的应用程序协议。它定义了客户端和服务器之间通信的规则。 常见协议http超文本传输协议未加密。https安全的 HTTP经过加密。ftp文件传输协议用于上传和下载文件。mailto用于打开电子邮件客户端。file用于访问本地计算机上的文件。2. URL2.1 什么是URLURLUniform Resource Locator统一资源定位符通俗地说它就是我们在互联网上访问一个网站、一张图片、一个视频或其他任何资源时在浏览器地址栏里输入的“网址”。它是一个标准化的地址系统告诉浏览器如何在浩瀚的互联网上精确地找到并访问特定的资源。URL是URI的一个子集。URI是一个更广泛的概念用于标识一个资源而URL不仅标识资源还提供了定位和访问它的方式。在日常交谈中两者常常混用。2.2 URL 的语法结构一个完整的 URL 由多个部分组成每个部分都有其特定的含义。其标准格式如下代码语言javascriptAI代码解释[协议] :// [主机名] : [端口] / [路径] ? [查询字符串] # [片段]让我们用一个具体的例子来分解它代码语言javascriptAI代码解释https://www.example.com:443/products/index.html?categoryelectronicspage2#reviews协议1.2 HTTP 的工作流程一次典型的网页访问建立 TCP 连接客户端浏览器首先与服务器的 80 端口HTTP或 443 端口HTTPS建立一个 TCP 连接。 发送 HTTP 请求客户端向服务器发送一个 HTTP 请求报文。 服务器处理请求服务器接收、解析请求并执行相应的操作例如查找资源、运行程序。 返回 HTTP 响应服务器将处理结果封装成一个 HTTP 响应报文发回给客户端。 关闭连接在 HTTP/1.0 中连接通常会关闭。在 HTTP/1.1 及以后版本中连接可能被保持以供后续请求复用。 客户端渲染浏览器接收到响应后解析 HTML、CSS、JavaScript并渲染出完整的页面。时代背景 (2022年发布仍在普及中):5G与万物互联 网络环境更加复杂多变对连接建立速度和稳定性要求更高。极致性能追求 电子商务、在线视频、实时游戏等应用对延迟的容忍度极低。QUIC协议的成熟 Google再次引领将QUIC从实验性协议发展为HTTP/3的标准。核心技术:基于QUIC弃用TCP HTTP/3不再使用TCP作为传输层协议而是使用基于UDP的QUIC协议。解决TCP队头阻塞 QUIC在用户空间实现了独立的流复用单个流的丢包不会影响其他流。极速连接建立 QUIC将加密和传输握手合并通常只需1-RTT甚至0-RTT即可建立安全连接而TCPTLS需要1-3个RTT。连接迁移 当用户切换网络时如WiFi切4GQUIC连接可以无缝迁移而TCP连接需要重新建立。HTTP/3.0 - 面向未来的传输时代背景 (2015):移动互联网时代 用户对页面加载速度极其敏感。复杂Web应用 单页面应用大量出现一个页面可能包含上百个资源请求。Google的推动 Google开发的SPDY协议证明了性能优化的巨大潜力并成为HTTP/2的基础。核心技术:二进制分帧 将传输的消息分解为更小的帧Frame采用二进制编码解析更高效、更紧凑。多路复用 在单个TCP连接上可以同时交错地发送多个请求和响应帧彻底解决了HTTP/1.1的队头阻塞问题。头部压缩 使用HPACK算法对头部进行压缩大大减少了冗余数据的传输。服务器推送 服务器可以主动将客户端很可能需要的资源如CSS、JS推送给客户端无需客户端解析后再请求。核心问题 虽然解决了应用层的队头阻塞但底层仍基于TCP。TCP在丢包时的重传机制会导致所有流即使未被影响等待即TCP层的队头阻塞。HTTP/2.0 - 性能革命时代背景 (1997年提出1999年作为标准):互联网普及 网民数量激增网站成为企业和个人的标配。富媒体应用 CSS、JavaScript的广泛使用使得页面资源数量大幅增加。虚拟主机盛行 需要在一台服务器上托管多个网站。核心技术:持久连接 默认保持TCP连接打开允许多个请求和响应在同一个连接上顺序进行大幅减少了延迟和CPU消耗。管道化 允许客户端在收到上一个响应之前就发送下一个请求但响应必须按请求顺序返回容易导致“队头阻塞”。分块传输编码 支持服务器逐步生成并发送响应内容。强制性 Host 头 实现了在一台IP服务器上托管多个域名网站的能力是虚拟主机的技术基础。核心问题 管道化在实践中体验不佳队头阻塞问题依然存在头部冗余严重如Cookie。HTTP/1.1 - 互联网的基石时代背景 (1996):浏览器战争 Netscape Navigator和Internet Explorer的竞争推动了Web技术的飞速发展。内容多媒体化 网页开始包含图片、音频、视频等不同格式的资源。商业化萌芽 出现了在线购物、广告等需要与服务器交互的应用。核心技术:引入HTTP头 在请求和响应中加入了元数据实现了内容协商、缓存控制、状态码等强大功能。支持新的方法 引入了POST用于提交表单和HEAD方法。支持多种内容类型 通过Content-Type字段可以传输非HTML文件。短连接模型 默认每个TCP连接只处理一个请求响应完成后立即断开。高延迟下性能极差。核心问题 频繁的TCP连接建立与销毁带来巨大的性能开销。HTTP/1.0 - 规范化与扩展时代背景 (1991):万维网的诞生 由Tim Berners-Lee在欧洲核子研究中心提出旨在方便研究人员共享文档。网络环境简单 内容几乎全是超文本没有图片、样式或脚本。目标单一 只是为了获取链接的文档。核心技术:极简设计 只有GET一种方法。无状态 服务器发送完数据后立即关闭连接不记录任何信息。无头部 无法传输元数据因此只能传输纯文本HTML。核心问题 功能过于单一无法适应复杂应用。1.1 HTTP协议的发展历程HTTP协议的发展是一部为了满足日益增长的网络需求而不断自我革新的历史。每一次升级都旨在解决前一版本的性能瓶颈和安全问题。HTTP/0.9 - 原型时代可以传输文本、图片、音频、视频等多种类型的数据 支持多种数据格式​ 经典的 HTTP 协议中请求和响应的内容都是未经加密的文本。这意味着在传输过程中数据可能被窃听或篡改。 解决方案HTTPS。它是在 HTTP 之下加入了 SSL/TLS 加密层对传输的数据进行加密和缓存控制、内容协商等。 灵活可扩展 通信总是由客户端发起一个请求然后服务器返回一个响应。 没有请求就没有响应。 基于请求/响应模型 HTTP 协议本身不会保留之前请求或响应的任何信息。每一个请求都是独立的服务器不会记住你上一次是谁。