【HTTP 协议1】图文详解 HTTP 请求和应答报文

这篇具有很好参考价值的文章主要介绍了【HTTP 协议1】图文详解 HTTP 请求和应答报文。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

前几篇文章介绍了传输层的 TCP 协议的几大重要机制, 认识了传输层协议之后, 本片开始陆续介绍应用层的 HTTP 协议的相关知识

本篇主要介绍 HTTP 请求报文和应答报文中需要掌握和认识的知识点


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、认识 HTTP 协议

1, 什么是 HTTP 协议

HTTP (“超文本传输协议”) 是一种应用非常广泛的 应用层协议, 我们平时打开一个网站, 就是通过 HTTP 协议来传输数据的
HTTP 往往是基于传输层的 TCP 协议实现的, (HTTP1.0, HTTP1.1(最主流), HTTP2.0 均为TCP, HTTP3 基于 UDP 实现)

当我们在浏览器中输入一个 CSDN 的"网址" (URL) 时, 浏览器就给 CSDN 的服务器发送了一个 HTTP 请求, CSDN 的服务器返回了一个 HTTP 响应

这个响应结果被浏览器解析之后, 就展示成我们看到的页面内容, (这个过程中浏览器可能会给服务器发送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片, 字体等信息).

HTTP 协议是一问一答式的, 一个请求对应一个响应


2, HTTP 协议的报文格式

我们使用 fiddler 抓包工具, 打开 CSDN 网站时就可以看到各种各样的包

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

先初步观察请求/响应报文的格式, 然后再详细介绍

HTTP 请求报文的格式 :

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

  • 首行: [方法] + [url] + [版本号]
  • Header: 请求的属性, 冒号+空格分割的键值对, 每组属性之间使用\n分隔, 遇到空行表示 Header 部分结束
  • Body: 空行后面的内容都是 Body . Body 允许为空字符串

HTTP 响应报文的格式 :

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

  • 首行: [版本号] + [状态码] + [状态码解释]
  • Header: 请求的属性, 冒号分割的键值对, 每组属性之间使用\n分隔, 遇到空行表示 Header 部分结束
  • Body: 空行后面的内容都是 Body . Body 允许为空字符串

这里看到正文部分是乱码, 是因为, 为了减少网络传输的数据量, 节省带宽, 正文部分往往是被压缩的, 点击这里可以看到解压缩的正文,
然后再用记事本打开
【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码
【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

所以, 当浏览器打开一个网站时, 实际上就是给该网站的服务器发送了一个请求, 然后返回了一个响应, 这个响应就携带了这个网站的页面, 当然还有其他的响应, 可能包括 CSS, JavaScript, 音视频等资源


二、HTTP 请求报文

1, 认识方法

HTTP 请求报文中的首行的第一个属性就标识了: 这个请求使用的方法, 方法描述了这个请求打算干嘛

例如刚刚我们访问 CSDN 页面的请求的方法就是 GET

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

HTTP 协议常用的方法如图所示 :

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

绝大多数场景使用的都是 GET 和 POST ! ! ! 只需要重点认识这两个方法即可, GET 方法表示: 从服务器里获取, POST 方法表示: 往服务器里提交


1.1, GET 和 POST 辨析(重点)

GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源, 在浏览器中访问网站, 此时浏览器就会发送出一个 GET 请求, 另外, HTML 中的 link, img, script 等标签也会触发 GET 请求, 或者使用 JavaScript 中的 ajax 也能构造 GET 请求

POST 多用于提交用户输入的数据给服务器(例如登陆页面), 或者长传文件. 通过 HTML 中的 form 标签可以构造 POST 请求, 或者使用 JavaScript 的 ajax 也可以构造 POST 请求

我们看一下登录 CSDN 时, 使用 fiddler 抓到的包
【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

可以看到, POST 和 GET 不同, POST 请求的报文是有正文的, 因为登陆时需要提交相关材料(比如密码, 此处是被加密过的)

  • 提问 : GET 和 POST 有什么区别呢?
    本质上没有区别 :
    1, 不同的方法只是代表不同的语义, 但不一定严格遵守
    2, 使用 GET 的场景一般都可以使用 POST 代替, 这二者一般是可以相互代替的
    3, GET 也可以有正文, POST 也可以没有正文, 并非绝对
    使用习惯上有区别 :
    1, GET 习惯用来表示"获取数据", POST 习惯表示"提交数据"
    2, GET 一般没有正文, 需要携带的数据可以写在 UR L的 query string 中, POST 一般有正文
    3, GET 一般被设计成"幂等"的, POST 无要求
    4, GET 可以被缓存(前提是幂等), POST 不可以

这里的"幂等"是指 : 多次请求得到的响应一致, 这也是可以被缓存的原因
虽然官方标准建议 GET 设计成幂等, 但并不绝对, 比如现在很多网站都有"猜你喜欢"功能, 就是根据用户历史访问记录实时做出更新的

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码


1.2, 其他方法

PUT : 与 POST 相似,只是具有幂等特性,一般用于更新
DELETE : 删除服务器指定资源
OPTIONS : 返回服务器所支持的请求方法
HEAD : 类似于GET,只不过响应体不返回,只返回响应头
TRACE : 回显服务器端收到的请求,测试的时候会用到这个
CONNECT : 预留,暂无使用


2, 认识 URL

请求报文中的第二个属性就是 URL, 如图

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

URL (Uniform Resource Locator 统一资源定位符), 就是平时俗称的"网址", 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它

上图中的URL中有很多信息被省略了, 完整的 URL 应该如下图所示 :

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

  • 协议方案名: 常见的有 http 和 https, 也有其他的类型.(例如访问 mysql 时用的jdbc:mysql )
  • 登陆信息: 现在的网站进行身份认证一般不再通过 URL 进行了, 一般都会省略
  • 服务器地址: 此处是一个 “域名”, 域名会通过 DNS 系统解析成一个具体的 IP 地址
  • 端口号: 上面的 URL 中端口号被省略了, 当端口号省略的时候, 浏览器会根据协议类型自动决定使用哪个端口 (例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口)
  • 带层次的文件路径: 标识要访问的服务器的哪一个资源
  • 查询字符串(query string): 具体的表示了请求的资源是什么, 本质是一个键值对结构. 键值对之间使用 & 分隔, 键和值之间使用 = 分隔.
  • 片段标识: 主要用于页面内跳转

3, 认识 Header

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

其中键和值之间用冒号+空格分隔, Header 中的键值对可以用 N 个, 没有限制, 大部分键值对都是由 HTTP 协议规定的, 还有一部分是允许程序员自定义的

接下来介绍一部分键值对的含义


3.1, Host

标识当前要访问的服务器的地址(和端口)

在 URL中虽然已经写入了域名, 通常情况下这两个是一致的, 但如果不是直接访问, 而是通过代理访问服务器, 这二者就不同了


3.2, Content-Length

标识 Body 的长度(单位是字节)

如果是 GET 方法获取的请求, 一般没有 Body, 所以就不显示这个键值对了


3.3 Content-Type

标识 Body 中的数据格式(和字符集)

如果是 GET 方法获取的请求, 一般没有 Body, 所以就不显示这个键值对了

如果是 POST 或其他的方法, Content-Type 一般是以下两种 :
1, application/json, 是浏览器和 HTTP 服务器交互最常见的一种格式,正文中形如 JavaScript 中的对象
2, application/x-www-from-urlencoded, 是 HTML 中的 from 表单提交数据生成的, 正文中形如 URL 中的 query string

上述两种格式一般在请求报文中使用, 如果是响应报文, 数据的格式还有上文提到过的 text/html, text/css, application/javascript, image/jpg等等


3.4, User-Agent

标识用户的客户端操作系统型号和版本, 以及使用的浏览器的版本

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

User-Agent 的设计是一个历史遗留问题, 如今的作用大不如前, 不过至少可以用来区分用户是使用电脑/手机/平板


3.5, Referer

标识当前页面从哪跳转过来的

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码
(如果直接在地址栏输入 URL 或者通过收藏夹进行访问, 是没有 Referer 的)

3.6, Cookie(重点)

Cookie 是浏览器在本地存储用户自定义数据的一种关键机制

如下图所示, Cookie 里有很多键值对(数据可以由程序员自定义), 键值对之间用分号分割, 键和值之间用等号分割, 具体这些键值对表示的含义是什么, 咱不知道, 只有开发这个网站的程序员知道

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码
浏览器作为客户端, 需要向该网站的服务器发送请求来获取资源, 显然服务器是需要存储一些数据的, 而浏览器这边也需要存储一些数据, 比如说用户的登录信息

既然客户端这边要存储数据, 能否直接存在用户的硬盘上? 一定不可以, 不能允许网页操作本机的硬盘, 文件系统, 否则如果被恶意网站植入病毒, 硬盘中的数据都可能受到威胁, 所以浏览器是禁止网页访问硬盘的

Cookie 就是解决这一问题的重要机制, 浏览器允许网页把重要的信息存储在各自网页的 Cookie 中, 同一个网站(主页和子页)共享一份 Cookie

  • 1, Cookie 从哪里来?
    Cookie (中存储的数据)从服务器来: 第一次登陆一个网站的时候, 服务器会返回一个响应, 在这个响应报文中, 通过 Set-Cookie 把需要存储的值返回给客户端, 客户端进行存储

比如在我的 gitee 主页上可以查看已经存储的 Cookie, 方便观察我们把这些都删除

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码
【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

删除 Cookie 之后, 其中存储的有关用户登录的信息就没了, 有些网站可能会主动退出登录, 或者自动重新登陆, 通过 fiddler 可以抓包看到登陆时的响应报文中确实有 Set-Cookie 字段

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

里面包含了一个 gitee-session-n 这样的属性, 属性值是一串很长的加密之后的信息. 这个信息就是用户当前登陆的身份标识. 也称为 “令牌(token)”

  • 2, Cookie 到哪里去?
    Cookie 要回到服务器, 当客户端收到 Set-Cookie 中的数据后, 后续每次请求网页的时候, 给服务器发送的请求报文中都有一个 Cookie 字段, 相当于把 Cookie 里面的值再带给服务器

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

请求你中的 Cookie 字段也包含了一个 gitee-session-n 属性, 里面的值和刚才服务器返回的值相同, 后续只要访问 gitee 这个网站, 就会一直带着这个令牌, 直到令牌过期/下次重新登陆

  • Cookie 有什么用?
    Cookie 是一浏览器客户端在本地存储用户自定义数据的一种机制, 比如存储用户的身份信息, 让服务器通过 Cookie 来识别用户身份

三、HTTP 响应报文

1, 认识状态码

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

状态码表示访问一个页面的结果 (是访问成功, 还是失败, 还是其他的一些情况…), 接下来简单介绍一些常见的状态码


序号 分类 描述
1xx 信息性 服务器收到请求, 正在处理
2xx 成功 请求接收成功, 处理完毕
3xx 重定向 需要进一步操作以完成请求
4xx 客户端错误 请求包含语法错误或无法完成请求
5xx 服务器错误 服务器处理请求出错
  • 200 OK
    这是一个最常见的状态码, 表示访问成功, 一般用于GET与POST请求

  • 404 Not Found
    找不到资源, 服务器无法根据客户端的请求找到资源(网页), 通过此代码, 网站设计人员可设置"您所请求的资源无法找到"的个性页面
    (浏览器输入一个 URL, 目的就是为了访问对方服务器上的一个资源. 如果这个 URL 标识的资源不存在, 那么就会出现 404)
    【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

  • 403 Forbidden
    拒绝访问, 有的页面通常需要用户具有一定的权限才能访问(比如登陆后才能访问), 如果用户没有登陆直接访问, 就容易见到 403.
    【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码

  • 405 Method Not Allowed
    方法不支持, 前面介绍了 HTTP 中所支持的方法( GET, POST, PUT, DELETE 等), 但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法)

  • 500 Internal Server Error
    服务器内部出错, 可能是服务器端的代码出 bug 了或者异常崩溃了, 一般在访问主流网站时很少见到这个状态码, 但后端程序员在写代码的时候可能比较常见

  • 504 Gateway Timeout
    访问超时, 服务器访问量大, 无法及时处理请求并返回响应

  • 301 Moved Permanently
    永久重定向, 请求的资源已被永久的移动到新的 URI, 返回信息会包括新的 URI, 浏览器会自动定向到新 URI, 今后任何新的请求都应使用新的 URI 代替

重定向就是值访问旧的资源地址时, 自动被引导到新的资源地址, 俗称页面跳转

  • 302 Found
    临时重定向, 资源只是临时被移动, 下一次请求时是否被移动, 不一定, 所以客户端应继续使用原有 URI

在登陆页面中经常会见到 302, 用于实现登陆成功后自动跳转到主页.
响应报文的 header 部分会包含一个 Location 字段, 表示要跳转到哪个页面
【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码


总结

以上就是本篇的全部内容, 主要介绍了如何 HTTP 协议的请求和响应报文的格式, 重点介绍了 HTTP 方法中的 GET 和 POST 的辨析, 以及 Header 中有关 Cookie 的相关知识

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

【HTTP 协议1】图文详解 HTTP 请求和应答报文,JavaEE初阶,http,网络协议,网络,Cookie,状态码
文章来源地址https://www.toymoban.com/news/detail-518548.html

到了这里,关于【HTTP 协议1】图文详解 HTTP 请求和应答报文的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTTP协议 | 一文详解HTTP报文结构

    目录 🌳 HTTP/HTTPS简介 🌳 HTTP工作原理 HTTP三点注意事项 1. HTTP是无连接的 2. HTTP是媒体独立的 3. HTTP是无状态的 HTTPS 作用 🌳 HTTP消息结构 HTTP请求消息 1. 请求行 2. 请求头 3. 空行 4. 请求数据 HTTP请求实例 HTTP请求GET和POST的区别 1. 传输数据的方式不同 2. 传输数据的大小不同 3

    2024年02月03日
    浏览(31)
  • HTTP 协议详解(图文介绍)

    当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等。 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,内容较多,希望大家耐心看。也希望对大家的开

    2024年02月08日
    浏览(32)
  • 10000字讲解TCP协议(确认应答,超时重传,三次握手,四次挥手等等众多机制)以及UDP协议(UDP报文,校验和)

    UDP它是属于TCP/IP协议族中的一种。是无连接的协议,发送数据前不需要建立连接,因为不需要建立连接,所以可以在网络上以任何可能的路径传输,至于有没有传输到目的地,UDP是不关心的,所以,UDP它是天然支持广播的,就类似学校的广播,只需要将声音传递给每个学生即

    2024年01月21日
    浏览(40)
  • 第1关:HTTP 基本请求与应答

    创作不易,赏个赞吧!!! 任务描述 本关任务:能分析出 HTTP 请求与应答中各字段的作用及取值。 相关知识 为了完成本关任务,你需要掌握: 了解 HTTP协议; 识别 HTTP 请求报文构成及各字段含义; 识别 HTTP 响应报文构成及各字段含义; Wireshark 中加载保存的报文文件。

    2024年02月04日
    浏览(21)
  • HTTP协议请求详解

    ✏️✏️✏️今天给大家分享的是 HTTP 请求部分的基础知识。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! ✈️✈️✈️动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛 目

    2024年01月17日
    浏览(29)
  • 【JavaEE初阶】 TCP协议详细解析

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 源/目的端口号:表示数据是从哪个进程来,到哪个进程去; 32位序号/32位确认号:后面详细讲; 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以

    2024年02月05日
    浏览(22)
  • 【JavaEE初阶】TCP/IP协议(二)

    协议头格式如下: 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。IPv6就是6. 4位头部长度(header length):描述了IP报头多长。(IP报头是变长的)报头中有一个选项部分 是变长的。是可有可无的。 此处的单位也是四字节。 8位服务类型(Type Of Service):3位优先

    2024年02月12日
    浏览(28)
  • 《二》HTTP 请求报文和响应报文、请求方法、状态码

    请求报文: 客户端向服务器发送的请求信息,就叫做请求报文。 客户端发送一个 HTTP 请求到服务器,请求信息包含四部分:请求行、请求头、空行、请求体。 请求行:包含三部分,分别是请求方法、请求资源的路径、协议版本。 请求头:头信息,告诉服务器一些信息,在客

    2023年04月26日
    浏览(35)
  • 【JavaEE初阶】网络原理|认识协议|协议分层|TCP/IP模型|封装和分用

    目录 一、认识协议 1.概念 2.作用(为什么需要协议?) 二、协议分层 1.为什么需要⽹络协议的分层? 2. 协议分层是什么 3.分层带来的好处 三、TCP/IP五层(或四层)模型 (1)物理层 (2)数据链路层 (3)网络层 (4)传输层 (5)应用层 四、封装和分用(协议的层和层之间

    2024年04月23日
    浏览(31)
  • Jmeter提取协议报文、请求头、请求体、响应体

    参看文章: https://blog.csdn.net/qq_40308101/article/details/125545245 https://www.thinbug.com/q/34918343 https://www.cnblogs.com/peak911/p/9238738.html 1、 prev (用于后置处理器、断言) prev 提供对当前取样器结果的访问能力 prev 映射 org.apache.jmeter.samplers 的 SampleResult 类 官方文档: https://jmeter.apache.org/ap

    2024年02月11日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包