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


目录

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.mzph.cn/diannao/79766.shtml

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

相关文章

Android学习总结之APK打包流程

一、预处理阶段&#xff08;编译前准备&#xff09; 1. AIDL 文件处理&#xff08;进程间通信基础&#xff09; 流程&#xff1a; 用于实现 Android 系统中不同进程间的通信&#xff08;IPC&#xff09;。在项目构建时&#xff0c;AIDL 编译器会将 .aidl 文件编译为 Java 接口…

BDO分厂积极开展“五个一”安全活动

BDO分厂为规范化学习“五个一”活动主题&#xff0c;按照“上下联动、分头准备 、差异管理、资源共享”的原则&#xff0c;全面激活班组安全活动管理新模式&#xff0c;正在积极开展班组安全活动&#xff0c;以单元班组形式对每个班组每周组织一次“五个一”安全活动。 丁二醇单…

【音视频】FLV格式分析

FLV概述 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式&#xff0c;由于其封装后的⾳视频⽂件体积⼩、封装简单等特点&#xff0c;⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。 FLV封装格式是由⼀个⽂件头(file header)和…

Java表达式1.0

Java开发工具 在当今的Java开发领域&#xff0c;IntelliJ IDEA已然成为了众多开发者心目中的首选利器&#xff0c;它被广泛认为是目前Java开发效率最快的IDE工具。这款备受瞩目的开发工具是由JetBrains公司精心打造的&#xff0c;而JetBrains公司总部位于风景如画的捷克共和国首…

Map遍历

第一种遍历方式键找值&#xff1a; 增强for循环&#xff1a; 通过获取元素中的键&#xff0c;get到对应的值&#xff0c;通过增强for循环获取集合里的键&#xff0c;然后用get方法通过键获取值 代码演示&#xff1a; import java.text.ParseException; import java.util.*;…

内网穿透服务器—FRP

某天某刻空闲的时候跟同事聊的本地的存储服务如果我想让其他公网内的用户使用&#xff08;这个存储服务只是一个临时文件传递站&#xff0c;碎文件&#xff0c;安全低的&#xff09;&#xff0c;然后我们就探讨到了FRP一个比较久远的技术&#xff0c;来做内网穿透&#xff0c;下…

力扣每日打卡16 781. 森林中的兔子(中等)

力扣 781. 森林中的兔子 中等 前言一、题目内容二、解题方法1. 哈希函数&#xff08;来自评论区大佬的解题方法&#xff09;2.官方题解2.1 方法一&#xff1a;贪心 前言 这是刷算法题的第十六天&#xff0c;用到的语言是JS 题目&#xff1a;力扣 781. 森林中的兔子 (中等) 一、…

基于深度学习的线性预测:创新应用与挑战

一、引言 1.1 研究背景 深度学习作为人工智能领域的重要分支&#xff0c;近年来在各个领域都取得了显著的进展。在线性预测领域&#xff0c;深度学习也逐渐兴起并展现出强大的潜力。传统的线性预测方法在处理复杂数据和动态变化的情况时往往存在一定的局限性。而深度学习凭借…

黑马点评redis改 part 3

优惠券秒杀 全局唯一id 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a;实际开发中数据库ID一般不会参与业务逻辑 增加一个订单号字段就好…

低代码开发平台:企业数字化转型的加速器

一、引言 在数字化时代&#xff0c;企业的转型需求日益迫切。为了在激烈的市场竞争中保持领先地位&#xff0c;企业需要快速响应市场变化、优化业务流程、提升运营效率。然而&#xff0c;传统的软件开发模式往往面临开发周期长、成本高、灵活性差等问题&#xff0c;难以满足企业…

个人所得税

文章目录 一、名词解释二、个人所得税计算方法 (举例)1.累计预扣预缴应纳税所得额、本期应预扣预缴税额2.个人所得税预扣率表一3.个人所得税计算举例 三、专项附加扣除政策介绍四、年度汇算清缴政策介绍五、常见问答 一、名词解释 累计预扣法是指扣缴义务人在一个纳税年度内预…

二进制和docker两种方式部署Apache pulsar(standalone)

#作者&#xff1a;闫乾苓 文章目录 1、二进制安装部署Pulsar(standalone)1.1 安装配置JDK1.2 下载解压pulsar安装包1.3 启动独立模式的Pulsar 集群1.4 创建主题测试1.5 向主题写入消息测试1.6 从主题中读取消息测试 2.docker安装部署Pulsar(standalone)2.1 使用docker 启动Pul…

如何在 Go 中创建和部署 AWS Lambda 函数

AWS Lambda 是一个无服务器计算平台&#xff0c;您可以使用自己喜欢的编程语言编写代码&#xff0c;无需担心设置虚拟机。 您只需为 Lambda 函数的调用次数和运行时间&#xff08;毫秒&#xff09;付费。 我们大多数人都了解 JavaScript 和 Python&#xff0c;但它们的内存效率…

STM32配置系统时钟

1、STM32配置系统时钟的步骤 1、系统时钟配置步骤 先配置系统时钟&#xff0c;后面的总线才能使用时钟频率 2、外设时钟使能和失能 STM32为了低功耗&#xff0c;一开始是关闭了所有的外设的时钟&#xff0c;所以外设想要工作&#xff0c;首先就要打开时钟&#xff0c;所以后面…

[安全实战]逆向工程核心名词详解

逆向工程核心名词详解 一、调试与执行类 1. 断点&#xff08;Breakpoint&#xff09; 定义&#xff1a;在代码中设置标记&#xff0c;使程序执行到此处时暂停类型&#xff1a; 普通断点&#xff1a;通过INT3指令实现条件断点&#xff1a;满足特定条件时触发内存断点&#xf…

Mac mini 安装mysql数据库以及出现的一些问题的解决方案

首先先去官网安装一下mysql数据库&#xff0c;基本上都是傻瓜式安装的流程&#xff0c;我也就不详细说了。 接下来就是最新版的mysql安装的时候&#xff0c;他就会直接让你设置一个新的密码。 打开设置&#xff0c;拉到最下面就会看到一个mysql的图标&#xff1a; 我设置的就是…

聚宽策略----国九条后中小板微盘小改,年化135.40%

最近在研究的聚宽策略&#xff0c;一般技术分析的我直接转qmt了&#xff0c;财务因子有一点麻烦&#xff0c;我直接利用我开发强大的服务器系统&#xff0c;直接读取信号&#xff0c;最近在优化一下系统&#xff0c;最近在开发对接bigquant的交易系统&#xff0c;完成了api数据…

C语言状态字与库函数详解:概念辨析与应用实践

C语言状态字与库函数详解&#xff1a;概念辨析与应用实践 一、状态字与库函数的核心概念区分 在C语言系统编程中&#xff0c;"状态字"和"库函数"是两个经常被混淆但本质完全不同的概念&#xff0c;理解它们的区别是掌握系统编程的基础。 1. 状态字&…

End-to-End从混沌到秩序:基于LLM的Pipeline将非结构化数据转化为知识图谱

摘要:本文介绍了一种将非结构化数据转换为知识图谱的端到端方法。通过使用大型语言模型(LLM)和一系列数据处理技术,我们能够从原始文本中自动提取结构化的知识。这一过程包括文本分块、LLM 提示设计、三元组提取、归一化与去重,最终利用 NetworkX 和 ipycytoscape 构建并可…

Leetcode 3523. Make Array Non-decreasing

Leetcode 3523. Make Array Non-decreasing 1. 解题思路2. 代码实现 题目链接&#xff1a;3523. Make Array Non-decreasing 1. 解题思路 这一题思路上来说就是一个栈的问题&#xff0c;就是从后往前依次考察每一个元素&#xff0c;显然&#xff0c;当前位置要么被舍弃&…