Java【网络原理】(4)HTTP协议

news2025/4/21 10:45:15


目录

1.前言

2.正文

2.1自定义协议

2.2HTTP协议

2.2.1抓包工具

2.2.2请求响应格式

2.2.2.1URL

2.2.2.2urlencode

2.2.3认识方法

2.2.3.1GET与POST

2.2.3.2PUT与DELETE

2.2.4请求头关键属性

3.小结


1.前言

哈喽大家好啊,今天来继续给大家带来Java中网络原理的学习,本节主要学习的是HTTP协议,在讲HTTP协议之前还会补充一个知识点(自定义协议),本节学完后就是HTTPS的学习了,那么废话不多说让我们开始吧。

2.正文

2.1自定义协议

在平时写代码的时候,咱们往往跟应用层打交道,应用层中涉及到的网络通讯协议,很多都是程序员自己定制的。那么到底如何自定义协议呢?

自定义协议,分成两个阶段:

  1. 根据需求, 明确传输哪些信息
  2. 约定好信息组织的格式.

其中有许多组织信息的格式,主要包含以下四种:

设计协议时,数据组织格式直接影响可读性、传输效率、解析复杂度。以下通过生活化案例,对比四种常见格式:行文本、XML、JSON、Protobuf。


1. 行文本格式

特点:用简单分隔符(如逗号、竖线)组织数据,适合结构简单的场景。
类比:快递单上的信息——用空格或横线分隔收件人、电话、地址。

示例:用户登录协议

login|user123|e10adc3949ba59abbe56e057f20f883e|mobile
  • 字段解释

    • login:命令类型(登录)

    • user123:用户名

    • e10adc...:MD5加密后的密码

    • mobile:设备类型

优点

  • 体积小,解析简单(直接按分隔符拆分)。

  • 适合嵌入式设备或性能受限的场景。

缺点

  • 扩展性差(新增字段需调整解析逻辑)。

  • 无数据类型区分(所有内容都是字符串)。


2. XML格式

html 和 xml 都是成对的标签构成的键值对结构~
html 标签内容都是固定的。大佬们约定好的,你不能乱写,也不能创建新的标签(现在 html5 允许自定义标签了)xml 标签内容是自定义的。

特点:通过标签嵌套表示数据,适合复杂结构化数据。
类比:书本目录——用章节标题和子标题分层组织内容。

示例:订单数据传输

<order>
  <id>1001</id>
  <customer>
    <name>张三</name>
    <phone>13800138000</phone>
  </customer>
  <items>
    <item>
      <product_id>P100</product_id>
      <quantity>2</quantity>
    </item>
    <item>
      <product_id>P200</product_id>
      <quantity>1</quantity>
    </item>
  </items>
</order>

优点

  • 结构清晰,支持嵌套和复杂数据类型。

  • 可读性强(标签自带语义)。

缺点

  • 冗余标签多,体积大(传输效率低)。

  • 解析复杂。

现在xml使用的已经很少了,主要是下面的json。


3. JSON格式

特点:轻量级的键值对结构,兼顾可读性和简洁性。
类比:表格简历——用“字段名:值”清晰展示信息。

示例:用户消息推送

{
  "type": "message",
  "sender": "user123",
  "receiver": "user456",
  "content": "晚上一起吃饭吗?",
  "timestamp": 1629780000,
  "extras": {
    "emotion": "开心",
    "priority": 1
  }
}

优点

  • 语法简洁(比XML体积小)。

  • 天然支持嵌套对象和数组。

  • 广泛支持(几乎所有编程语言都有解析库)。

适用场景

  • RESTful API 接口(90%的互联网API使用JSON)。

  • 前端与后端数据交互。


4. Protobuf(Protocol Buffers)(C++用的比较多)

特点:二进制编码,高性能,需预定义数据结构(.proto文件)。
类比:密码本——收发双方需提前约定编码规则,传输时用二进制压缩。

优点

  • 体积极小(比JSON小3-10倍)。

  • 解析速度极快(无需反射,直接内存映射)。

  • 强类型约束(减少数据错误)。

缺点

  • 可读性差(二进制不可直接阅读)。

  • 需预编译生成代码(开发流程稍复杂)。


总结一下:

  1. 行文本 (最原始)
  2. xml(比较原始,可读性好,冗余较多)
  3. json(主流的方式,可读性好,冗余一般)
  4. protobuf(高性能场景下使用的方式,可读性差,冗余最小)
格式体积可读性解析速度适用场景
行文本最小简单配置、传感器数据
XML复杂企业级系统
JSON中等中等Web API、前后端交互
Protobuf最小最快高性能通信、IoT、微服务

下文就要展开我们的重点HTTP协议了。 


2.2HTTP协议

HTTP是一问一答模式的协议,客户端发来一个请求,服务器就返回一个响应,请求和响应一一对应。对于HTTP协议的学习我们需要借助抓包工具来进行。

2.2.1抓包工具

抓包工具是什么呢?是用来干什么的呢?

1. 什么是抓包?

抓包(Packet Capture)指捕获网络传输中的数据包,并对其进行分析的过程。

  • 就像在快递运输线上安装监控摄像头,记录每个包裹的来源、目的地和内容。


2. 为什么需要抓包?

有以下几个场景:

  • 调试网络问题:定位连接超时、丢包等问题。

  • 分析协议行为:查看HTTP请求、DNS解析等细节。

  • 安全审计:检测恶意流量(如DDoS攻击、数据泄露)。

  • 性能优化:分析网络延迟、带宽占用。


3. 抓包工具的工作原理

  1. 网卡混杂模式

    • 默认情况下,网卡只接收目标地址是自己的数据包。

    • 开启混杂模式后,网卡会捕获流经它的所有数据包(包括其他设备的流量)。

  2. 协议解析与过滤

    • 抓包工具根据协议规范(如TCP/IP、HTTP)解析二进制数据包,提取可读信息。

    • 支持按协议类型、IP地址、端口号等条件过滤数据。

  3. 存储与展示

    • 数据包可保存为文件(如.pcap格式),供后续分析。

    • 工具提供可视化界面,展示数据包的层次结构和字段内容。

讲完了什么是抓包,接下来介绍两个抓包工具:

1.Wireshark

官网:Wireshark · Go Deep https://www.wireshark.org/

核心功能:

  • 多协议支持:解析超过2000种协议(如HTTP、TCP、DNS、ICMP)。

  • 深度分析:展示数据包的每一层(从物理层到应用层)。

  • 过滤与统计:支持复杂过滤语法,提供流量统计图表。


2.Fiddler

官网:Web Debugging Proxy and Troubleshooting Tools | Fiddler https://www.telerik.com/fiddler

核心功能:

  • HTTP/HTTPS代理:拦截所有经过代理的Web请求。

  • 请求/响应修改:实时修改请求参数、响应内容。

  • 性能分析:统计页面加载时间、资源大小。

  • 自动化脚本:通过Fiddler Script自定义处理逻辑。


二者对比:

 

对比维度WiresharkFiddler
协议支持所有网络层协议(TCP/IP、ICMP、ARP等)主要HTTP/HTTPS,部分FTP、WebSocket
抓包层级底层(原始数据包)应用层(HTTP请求/响应)
操作系统跨平台(Windows、macOS、Linux)仅Windows(经典版)
性能影响高(捕获所有流量)低(仅代理流量)
简而言之:wireshark抓很多协议,使用门槛较高。而fiddler专门抓HTTP,功能简单,使用也简单。

这里我们往后就使用fiddler。


2.2.2请求响应格式

这里我们通过fiddler来抓一个请求与响应:

请求

  1. 首行:请求方法 URL 版本号
  2. 请求头(header):键值对结构,每一行是一个键值对,键和值之间使用:空格 分割,HTTP 请求头中的键有哪些取值,对应的值又有哪些取值,都是由标准约定的。
  3. 空行:用来标识header结束了。
  4. 正文(body):部分请求有正文,部分没有(像上面这个就没有)。

响应

  1. 首行
  2. 响应头:也是键值对
  3. 空行:表示header部分结束/
  4. 正文 

下文我们要讲解写请求与相应的关键属性。 

2.2.2.1URL

URL(Uniform Resource Locator,统一资源定位符)是互联网上资源的唯一地址,用于定位网页、图片、API 等资源。
类比:就像现实中的“快递地址”,告诉浏览器如何找到目标资源。

一个典型的 URL 格式如下:

https://www.example.com:8080/path/to/page?name=John&age=30#section1

分解为以下核心部分:

[协议]://[域名]:[端口]/[路径]?[查询参数]#[锚点]
  • 协议:定义客户端与服务器之间的通信规则。
  • 域名:将 IP 地址(如 192.168.1.1)转换为易记的名称。
  • 端口:标识服务器上的具体服务(类似“门牌号”)。
  • 路径:指定服务器上的资源位置(类似文件路径)。
  • 查询参数:向服务器传递附加参数,格式为 key=value
  • 锚点:定位页面内的特定位置(不会发送到服务器)。

2.2.2.2urlencode

为了给大家更好展示urlencode是什么,这里附上实际例子,我在浏览器搜索你好。

可以看到:

https://www.sogou.com/web?query=%E4%BD%A0%E5%A5%BD&_ast=1745143368&_asf=www.sogou.com&w=01029901&p=40040100&dp=1&cid=&s_from=result_up&sourceid=5_01_03&sessiontime=1745143614785

我们去实际抓包:

可以看到搜多的字符串均被转义。

URL编码(Percent-Encoding)是一种将特殊字符非ASCII字符转换为安全格式的机制,确保URL在互联网中正确传输和解析。

为什么需要URL编码?

URL 中本身就有一些特殊符号,代表不同的特殊含义。query string 的内容都是程序员自定义的万一 query string 里也包含了特殊含义的符号咋办?所以就需要URL编码


urlencode 把数据的二进制内容,每个字节取出来十六进制表示,前面加上%

2.2.3认识方法

方法安全幂等典型场景
GET✔️✔️获取资源
POST✖️✖️创建资源或触发操作
PUT✖️✔️替换整个资源
DELETE✖️✔️删除资源
PATCH✖️✔️*部分更新资源
HEAD✔️✔️获取响应头信息
OPTIONS✔️✔️查询支持的请求方法
TRACE✔️✔️调试(通常禁用)
CONNECT✖️✖️建立代理隧道(如 HTTPS)

tips:PATCH 的幂等性需由具体实现保证。 


下文讲解几个最常见的方法 

2.2.3.1GET与POST

HTTP 协议中,GET 和 POST 是最常用的两种方法,它们在用途、数据传输方式、安全性等方面有显著区别。

GET:通过 URL 传递参数

  • 格式http://example.com/api?name=Alice&age=30

  • 特点

    • 参数可见,适合非敏感数据(如搜索关键字)。

    • 参数会被浏览器历史记录、服务器日志记录。


POST:通过请求体传递参数

  • 格式:参数封装在请求体中,支持多种格式(如 JSON、表单数据)。

  • 特点

    • 参数不可见,适合敏感数据(如密码、支付信息)。

    • 支持复杂数据结构(如文件上传)。

两个典型场景:

  1. 登录。
  2. 上传 =>请求带有正文的,正文就是保存了当前上传的数据的内容上述请求中,图片本身是二进制的,通过特殊方式进行转码(base64 编码,把二进制转成文本)其实 body 也是可以直接填二进制数据 ~

GET与POST对比:

  • 语义上,二者可以混着用,GET与POST没有本质区别。
  • 携带数据的方式上,POST也可以带有query string,GET也可以带有body
  • GET常被设计成幂等,POST无要求。
  • GET常认为能被缓存(幂等情况下),而POST不行。
特性GETPOST
用途获取资源(查询数据)提交数据(创建或修改资源)
参数位置URL 查询字符串(?key=value请求体(Body)
数据长度限制受限(URL 长度通常 ≤2048 字符)理论上无限制(取决于服务器配置)
缓存可被浏览器缓存不可缓存
幂等性幂等(多次请求结果相同)非幂等(多次请求可能产生不同结果)
安全性参数明文暴露在 URL 中(需 HTTPS)参数在请求体中(仍需 HTTPS 加密)
书签/分享可保存为书签或分享链接不可直接保存或分享

2.2.3.2PUT与DELETE

直接开讲:

PUT 方法

  • 用途完整替换资源(客户端需提供资源的全部新数据)。

  • 特点

    • 幂等性:多次请求效果相同(重复替换结果一致)。

    • 安全性:非安全操作(修改资源)。

    • 数据位置:请求体中传递完整的资源内容。


DELETE 方法

  • 用途删除指定资源

  • 特点

    • 幂等性:多次删除同一资源效果相同(删除后资源不再存在)。

    • 安全性:非安全操作(修改资源)。

    • 数据位置:通常无需请求体,通过 URL 标识资源。


特性PUTDELETE
目的替换资源(全量更新)删除资源
幂等性✔️(多次替换结果一致)✔️(多次删除结果一致)
请求体需要(包含完整新数据)通常不需要
典型状态码200 OK / 201 Created204 No Content / 200 OK

这样,方法中重要的“增删改查”已经讲解完毕。 

2.2.4请求头关键属性

这边也是各重头戏,讲到请求头中各种关键属性,可能跟前文会有所重复,但为了内容完整还是一并写出。

1. 键值对结构

  • 定义:HTTP 头部以 键: 值 的形式组织,键与值之间用冒号分隔。(RFC标准文档)

  • 作用:提供标准化、可扩展的元数据传递方式。

  • 示例

    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
    Content-Type: application/json
  • 注意事项

    • 键不区分大小写(如 content-type 与 Content-Type 等效)。

    • 多个值可用逗号分隔(如 Accept: text/html, application/json)。


2. Host

  • 定义:指定请求的目标域名和端口(HTTP/1.1 强制要求)。

  • 作用

    • 区分同一服务器上的多个网站(虚拟主机)。

    • 帮助反向代理或负载均衡器正确路由请求。

  • 示例

    Host: example.com:8080
  • 场景

    • 访问 http://example.com 和 http://anotherexample.com 时,服务器通过 Host 头返回不同内容。


3. Content-Length

  • 定义:表示请求体或响应体(body)的字节长度(十进制数字)。

  • 作用

    • 服务器/客户端明确需读取的数据量,避免粘包问题。

    • 对于 POST 或 PUT 请求,必须准确计算。

  • 示例

    Content-Length: 1024
  • 注意事项

    • 若使用分块传输(Transfer-Encoding: chunked),无需设置此头。


4. Content-Type

  • 定义:指示请求体或响应体的媒体类型(MIME 类型)。

  • 作用

    • 告知服务器如何解析请求体(如 JSON、表单数据)。

    • 指导客户端(如浏览器)如何渲染响应内容。

  • 常见类型

    类型

    用途

    text/html

    HTML 网页

    application/json

    JSON 数据

    application/x-www-form-urlencoded

    表单提交(键值对)

    multipart/form-data

    文件上传

  • 示例

    Content-Type: application/json; charset=utf-8

5. User-Agent

  • 定义:标识客户端(如浏览器、爬虫)的类型和版本,里面表示了用户使用的设备的浏览器和操作系统的情况。

  • 作用

    • 服务器适配不同客户端(如返回移动端页面)。

    • 统计用户设备分布或检测恶意爬虫。

  • 示例

    User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1

6. Referer

  • 定义:表示当前请求的来源页面 URL。即这个页面是从哪个页面跳转来的。

  • 作用

    • 分析流量来源(如广告点击统计)。

    • 防盗链(限制图片仅允许从特定网站加载)。

  • 示例

    Referer: https://www.google.com/
  • 注意事项

    • 隐私模式下或某些浏览器可能不发送此头。


7. Cookie

  • 定义:cookie 就是浏览器允许网页在本地硬盘存储数据的一种机制,而不是让网页代码直接访问文件系统(避免风险),而是做了一层抽象。Cookie 这里是按照键值对的方式来存储数据的,浏览器中可以直接看到当前页面保存的 cookie 有哪些的。浏览器保存了这些 cookie 之后,就会在后续给服务器发送请求的时候,把这些 cookie 键值对放到 请求 cookie header 中传输给服务器。

  • 作用

    • 会话管理(如用户登录状态)。

    • 个性化设置(如语言偏好、主题)。

  • 示例

    Cookie: sessionId=abc123; theme=dark

3.小结

今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,你的支持就是对我最大的鼓励,大家加油!

 

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

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

相关文章

每天学一个 Linux 命令(27):head

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/27/index.html head 是 Linux 中用于查看文件开头部分内容的命令,默认显示文件前 10 行,适合快速预览文件结构或日志头部信息。 命令格式 head [选项] [文件]常用选项 选项说明-n <行数>指定显示前 N 行(如…

【2025软考高级架构师】——计算机系统基础(7)

摘要 本文主要介绍了计算机系统的组成&#xff0c;包括硬件和软件两大部分。硬件由处理器、存储器、总线、接口和外部设备等组成&#xff0c;软件则涵盖系统软件和应用软件。文章还详细阐述了冯诺依曼计算机的组成结构&#xff0c;包括 CPU、主存储器、外存等&#xff0c;并解…

LeetCode 打家劫舍+删除并获得点数

题目描述 打家劫舍题目传送门1 删除并获得点数传送门2 思路 这两道题看似毫无关系&#xff0c;但竟然可以用桶数组联系起来&#xff01;&#xff01; 先说打家劫舍这道题 限制条件是不能走相邻的屋&#xff0c;再联想到跳台阶&#xff08;走一格或两格&#xff09;&#x…

图解MCP:Model Context Protocol

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

【网络】数据链路层知识梳理

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的笔记吧~ 自己写自己的八股&#xff01;让未来的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 数据链路层 我们来重新理解一下这个图&#xff1a;…

积木报表查询出现jdbc.SQLServerException: 对象名 ‘user_tab_comment 的解决方法

目录 前言1. 问题所示2. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 使用帆软报表无错,后续使用积木报表查询出错: 没有显示报表: 具体错误信息如下:

数字孪生废气处理工艺流程

图扑数字孪生废气处理工艺流程系统。通过精准 3D 建模&#xff0c;对废气收集、预处理、净化、排放等全流程进行 1:1 数字化复刻&#xff0c;实时呈现设备运行参数、污染物浓度变化等关键数据。 借助图扑可视化界面&#xff0c;管理者可直观掌握废气处理各环节状态&#xff0c…

【某比特币网址请求头部sign签名】RSA加密逆向分析

目标&#xff1a;aHR0cDovL21lZ2FiaXQudmlwL21hcmtldA 直接搜索sign不方便定位&#xff0c;可以换个思路搜asi_uuid或者user_info 为什么搜这个&#xff0c;因为都是请求头里面的参数&#xff0c;基本上会在一起 实际上就是Object(h.a)((new Date).getTime()) 直接在这里打断点…

基于WebRTC技术的EasyRTC:支持任意平台设备的实时音视频通信解决方案

一、技术架构与核心优势 EasyRTC是一套基于WebRTC技术的实时音视频通信框架&#xff0c;旨在为开发者提供高效、稳定、跨平台的通信解决方案。其核心优势在于支持任意平台设备&#xff0c;包括Web端、移动端、桌面端和嵌入式设备&#xff0c;真正实现“一次开发&#xff0c;多…

DNS解析失败怎么解决?

在互联网时代&#xff0c;畅快地浏览网页、使用各类网络服务已成为生活常态。然而&#xff0c;当屏幕突然弹出 “DNS解析失败”的提示&#xff0c;原本顺畅的网络连接戛然而止&#xff0c;让人倍感困扰。DNS即域名系统&#xff0c;它如同互联网的 “电话簿”&#xff0c;负责将…

2025年4月19日

1.英语 1.单词 2.翻译 老年人食堂 In recent years, elderly population in China has continued to grow. The Chinese government is taking various measures to advance the construction of the elderly care service system and to make the later lives of the elde…

【Vue】组件通信(Props/Emit、EventBus、Provide/Inject)

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. Props/Emit 父子组件通信1.1 Props 向下传递数据1.2 Emit 向上传递事件 2. EventBus 跨组件通信2.1 创建事件总线2.2 使用事件总线2.3 EventBus 优缺点 3. Provide/Inject 深层组件通信3.1 基本使用3.2 响应式处…

QT实现串口透传的功能

在一些产品的开发的时候&#xff0c;需要将一个串口的数据发送给另外一个串口进行转发。 具体的代码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::Ma…

动态规划入门:背包问题求具体方案(以0-1背包问题为例)

本质&#xff1a;有向图最短&#xff08;长&#xff09;路问题 字典序最小方案&#xff1f;--贪心思路&#xff1f;&#xff08;本题未使用&#xff09; 分析第一个物品&#xff1a; 写代码时tip&#xff1a;要考虑“边读边做”还是“先读后做” #include<iostream> #i…

WEMOS LOLIN32 开发板引脚布局和技术规格

&#x1f517; 快速链接ESP32 Development Boards, Sensors, Tools, Projects and More https://megma.ma/wp-content/uploads/2021/08/Wemos-ESP32-Lolin32-Board-BOOK-ENGLISH.pdf WEMOS LOLIN32 Development Board Details, Pinout, Specs WEMOS LOLIN32 Development Board …

mysql中的group by用法详解

MySQL中的GROUP BY是数据聚合分析的核心功能&#xff0c;主要用于将结果集按指定列分组&#xff0c;并结合聚合函数进行统计计算。以下从基本语法到高级用法进行详细解析&#xff1a; 一、基本语法与核心功能 SELECT 分组列, 聚合函数(计算列) FROM 表名 [WHERE 条件] GROUP B…

java基础从入门到上手(九):Java - List、Set、Map

一、List集合 List 是一种用于存储有序元素的集合接口&#xff0c;它是 java.util 包中的一部分&#xff0c;并且继承自 Collection 接口。List 接口提供了多种方法&#xff0c;用于按索引操作元素&#xff0c;允许元素重复&#xff0c;并且保持插入顺序。常用的 List 实现类包…

从malloc到free:动态内存管理全解析

1.为什么要有动态内存管理 我们已经掌握的内存开辟方法有&#xff1a; int main() {int val 20;//在栈空间上开辟四个字节char arr[20] { 0 };//在栈空间上开辟10个字节的连续空间return 0; }上述开辟的内存空间有两个特点&#xff1a; 1.空间开辟的时候大小已经固定 2.数组…

AutoSAR从概念到实践系列之MCAL篇(二)——Mcu模块配置及代码详解(上)

欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 根据上一篇内容中…

【数据库】事务

目录 1. 什么是事务&#xff1f; 2. 事务的ACID特性 3. 为什么使用事务&#xff1f; 4. 如何使用事务 4.1 查看支持事务的存储引擎 4.2 语法 4.3 保存点 4.4 自动/手动提交事务 5. 事物的隔离性和隔离级别 5.1 什么是隔离性 5.2 隔离级别 5.3 查看和设置隔离级别 1…