探秘HTTP与URL:解锁网络通信的密钥

目录

[一、HTTP 协议概述](#一、HTTP 协议概述)

[二、URL 结构解析](#二、URL 结构解析)

1、协议方案名

常见应用层协议汇总

2、登录认证信息

3、服务器地址

[1. 域名 vs IP 地址](#1. 域名 vs IP 地址)

[2. 一句话概括DNS(域名系统)](#2. 一句话概括DNS(域名系统))

[3. 一个生动的比喻:找房子](#3. 一个生动的比喻:找房子)

[4. DNS 查询的简要过程](#4. DNS 查询的简要过程)

[5. 总结 DNS 的核心作用](#5. 总结 DNS 的核心作用)

4、服务器端口号

常见协议默认端口

5、资源路径

路径结构特点

6、查询字符串

7、片段标识符

8、技术要点总结

三、网络资源获取的本质与形式

[1、资源以什么形式存在?------ 一个文件!](#1、资源以什么形式存在?—— 一个文件!)

2、获取资源的前提条件

目标服务器的IP(或域名)

端口(Port)

3、从HTTP角度看"资源"

4、人的上网行为

[四、协议固定端口号 与 全球知名DNS域名服务器](#四、协议固定端口号 与 全球知名DNS域名服务器)

1、协议固定端口号

使用netstat命令查看

2、全球知名DNS域名服务器

根DNS服务器(13组,全球分布)

公共递归DNS服务器

顶级域(TLD)DNS服务器

3、DNS层级结构

查询示例:

[五、DNS 与 域名服务器](#五、DNS 与 域名服务器)

[1、DNS vs 域名服务器](#1、DNS vs 域名服务器)

[1. DNS(域名系统)](#1. DNS(域名系统))

[2. 域名服务器](#2. 域名服务器)

2、工作流程示例

3、类比解释

4、常见混淆的原因

为什么人们会混用?

正确说法:

5、你的项目中如何应用

访问过程:

如果你要绑定域名:

6、总结

六、URL编码(urlencode)与解码(urldecode)

1、为什么需要URL编码?

编码格式

2、URL编码机制

[1. 编码规则详解](#1. 编码规则详解)

[2. 编码示例](#2. 编码示例)

[3. 中文编码的特殊性](#3. 中文编码的特殊性)

3、URL解码过程

4、编码/解码工具使用

[在线工具示例:站长工具(UrlEncode编码/UrlDecode解码 - 站长工具)](#在线工具示例:站长工具(UrlEncode编码/UrlDecode解码 - 站长工具))

5、实际应用场景

[1. 表单提交](#1. 表单提交)

[2. API调用](#2. API调用)

[3. 文件路径处理](#3. 文件路径处理)

6、注意事项与最佳实践(了解即可)

[1. 编码级别选择](#1. 编码级别选择)

[2. 字符集一致性](#2. 字符集一致性)

[3. 双重编码问题](#3. 双重编码问题)

[4. 空格处理](#4. 空格处理)

7、安全性考虑

8、动态交互式网站中的URL特殊字符编码与解码机制

[1. 动态交互式网站与URL的重要性](#1. 动态交互式网站与URL的重要性)

[2. URL中的特殊字符及其问题](#2. URL中的特殊字符及其问题)

[3. 客户端的URL编码(URL Encode)](#3. 客户端的URL编码(URL Encode))

[4. 服务器端的URL解码(URL Decode)](#4. 服务器端的URL解码(URL Decode))

[5. 编码与解码的意义和作用](#5. 编码与解码的意义和作用)

9、总结


一、HTTP 协议概述

HTTP (HyperText Transfer Protocol,超文本传输协议)是一种基于请求-响应 模式的应用层通信协议。该协议通常运行于TCP/IP协议栈之上,是万维网(World Wide Web)数据通信的基础。

在网络编程实践中,开发者虽然可以自定义通信协议,但实际开发中通常会采用由专业工程师设计的成熟应用层协议。其中,HTTP 协议因其简洁性、灵活性和广泛支持而成为最典型的代表。


二、URL 结构解析

URL (Uniform Resource Locator,统一资源定位符),俗称"网址",是互联网中用于精确定位资源的标识方法。一个完整的 URL 由以下组成部分构成:

1、协议方案名

http://https:// 标识了通信所使用的应用层协议。HTTPS 是在 HTTP 基础上增加了 SSL/TLS 加密层的安全版本,通过传输加密和身份认证机制确保数据传输的安全性。

常见应用层协议汇总

协议名称 全称 主要功能
DNS Domain Name System 域名解析服务
FTP File Transfer Protocol 文件传输
TELNET Telnet Protocol 远程终端控制
HTTP Hyper Text Transfer Protocol 超文本传输
HTTPS HTTP over Secure Socket Layer 安全超文本传输
SMTP Simple Mail Transfer Protocol 电子邮件发送
POP3 Post Office Protocol v3 邮件接收
SNMP Simple Network Management Protocol 网络设备管理
TFTP Trivial File Transfer Protocol 简单文件传输

2、登录认证信息

username:password@ 部分包含访问资源所需的身份凭证(用户名、密码)。 尽管 URL 标准支持此语法,但实际应用中极少使用,主要原因包括:

  • 安全风险:密码以明文形式暴露在 URL 中

  • 维护困难:URL 可能被浏览器历史、日志记录等保存

  • 替代方案:现代系统通常采用独立的认证机制(如 Cookie、Token、OAuth)

3、服务器地址

www.example.com域名(Domain Name),是服务器的易记标识。与直接使用 IP 地址相比,域名具有显著优势:

1. 域名 vs IP 地址

  • 可读性www.baidu.com14.215.177.38 更易于理解和记忆

  • 品牌价值:域名承载企业品牌形象

  • 灵活性:同一域名可映射到多个 IP,实现负载均衡

虽然IP地址可以标识公网中的主机,但它并不适合直接展示给用户。举例来说,当我们使用ping命令分别查询www.baidu.com和www.qq.com时,会得到它们对应的IP地址(如下ping命令输出的IP地址)。

如果用户只看到这两个IP地址,在访问前根本无法判断网站的性质。但如果看到的是www.baidu.com和www.qq.com这样的域名,就能立即知道它们分别属于哪家公司。由此可见,域名具有更强的自描述性。

实际上,域名和IP地址在计算机通信层面是等价的,两者可以互换使用。但在URL中,出于用户友好性的考虑,我们总是使用域名而非IP地址来表示服务器地址。 技术上,域名通过 DNS 系统解析为 IP 地址,两者在网络层等效,但域名在用户体验层面更优。

2. 一句话概括DNS(域名系统)

DNS(域名系统)是互联网的"电话簿"或"导航仪"。 它负责将我们容易记住的网站名称(如 www.google.com)转换成一串计算机能识别的数字地址(如 142.251.42.206),这个数字地址就是 IP 地址。

3. 一个生动的比喻:找房子

想象一下互联网是一个巨大的城市,每个网站(如 Google、百度)就是一栋房子。

  • 域名 :就像房子的地址牌,比如"谷歌大厦"。人类很容易记住这个名字。

  • IP 地址 :就像房子的经纬度坐标,比如"北纬37.4度,东经-122.1度"。这是计算机和网络设备寻找目标的精确位置,但对人类来说非常不友好。

DNS 的作用就是:当你在浏览器里输入"谷歌大厦"并按下回车时,DNS 系统会立刻帮你查到这个地址牌对应的精确"经纬度坐标",然后带你找到那栋房子。没有DNS,你就得记住所有你想访问网站的复杂IP地址,这几乎是不可能的。

4. DNS 查询的简要过程

当你访问一个网站时,DNS 的查询过程通常如下(这是一个简化的流程):

  1. 浏览器缓存:你的浏览器会首先检查自己的"小本本"(缓存),看最近是否访问过这个网站,如果有记录,直接使用。

  2. 操作系统缓存:如果浏览器没有记录,它会去问电脑的操作系统(如 Windows、macOS)的"小本本"。

  3. 路由器缓存:如果电脑上也没记录,请求会发送到你家的路由器,路由器也会有自己的缓存。

  4. ISP 的 DNS 服务器:如果前面都找不到,你的请求就会被发送到你的网络服务提供商(如中国电信、中国移动)的 DNS 服务器。这是查询的主力军。

  5. 递归查询与根域名服务器

    • ISP 的 DNS 服务器会从一个"全球地址总目录"------根域名服务器开始问路。根服务器不直接给出答案,但它会告诉你".com"区域的负责人在哪里。

    • 然后,ISP 的服务器再去问 .com 顶级域名服务器 。这个服务器也不会直接给出答案,但它会告诉你"google.com"这个域的负责人在哪里。

    • 最后,ISP 的服务器去问 google.com 的权威域名服务器 。这个服务器才是最终掌管 google.com 所有信息的"管家",它会给出 www.google.com 对应的正确 IP 地址。

  6. 返回结果:ISP 的 DNS 服务器拿到 IP 地址后,会把它返回给你的电脑,并且自己也会缓存一份,方便下次快速查询。

  7. 网站访问:你的电脑拿到 IP 地址后,浏览器就可以向这个地址发起连接,最终打开你想要访问的网站。

这个过程非常快,通常只在毫秒之间完成。

5. 总结 DNS 的核心作用

  1. 翻译官:将人类可读的域名翻译成机器可读的 IP 地址。

  2. 分布式数据库:它是一个全球性的、层次化的分布式系统,没有单点故障,非常稳定。

  3. 简化互联网使用:让我们无需记忆复杂的数字串,极大地便利了上网体验。

所以,简单来说,DNS 是互联网最基础、最关键的服务之一,没有它,我们今天所熟悉的便捷互联网将不复存在。

4、服务器端口号

:80 指定服务监听的网络端口。HTTP协议(应用层协议)与套接字编程同属应用层技术。在套接字编程中,我们需要为服务器绑定特定IP和端口,同样地,应用层协议也必须指定明确的端口号。

常见协议默认端口

协议 默认端口 用途
HTTP 80 标准网页传输
HTTPS 443 加密网页传输
SSH 22 安全远程登录
FTP 21 文件传输控制

在使用特定协议时,该协议本质上为我们提供了服务功能。由于常见协议与端口号的对应关系已经标准化,实际使用时通常无需特别指定端口号。因此,在URL地址中,由于标准服务使用公认端口,URL 中的端口号(服务器端口号)通常可以省略

5、资源路径

/dir/index.html 标识目标资源在服务器文件系统中的位置。当通过域名和端口访问服务器时,需要明确指定目标资源的存储位置,以便服务器能够准确返回所需内容。

当我们在浏览器中输入百度网址(或者域名)后,浏览器会自动加载并显示百度的首页内容。如下:

首先我们按照步骤打开浏览器的开发者工具(或者直接按F12),如下:

当我们发起网页请求时,实际上获取的是网页的源代码数据。浏览器会解析这些代码(如下第2步),最终将其渲染成我们看到的网页界面。 我们可以将这类资源统称为网页资源 。除了网页本身,服务器还会提供视频、音频、图片等多种资源。HTTP被称为"超文本"传输协议而非简单的"文本"传输协议,正是因为它能处理各种非文本类型的资源。

路径结构特点

  • 层次化专门设置了一个字段来标识目标资源的存储路径,即 使用 / 作为路径分隔符**(正斜杠"/"而非反斜杠"\")**,体现资源的层级关系

  • 跨平台:采用 Unix/Linux 风格分隔符,反映多数 Web 服务器运行在类 Unix 系统

  • 资源类型:可指向 HTML 页面、图片、视频、API 端点等各种资源

HTTP 被称为"超文本"传输协议,正是因为其传输的资源类型远超普通文本,包括:

  • 结构化文档(HTML、XML、JSON)

  • 多媒体内容(图片、音频、视频)

  • 应用程序数据

6、查询字符串

uid=1 是请求中传递的附加参数,这些参数以键值对形式存在,通过&符号分隔。 ?key1=value1&key2=value2 以键值对形式向服务器传递附加参数。

实际应用示例:在百度搜索"HTTP"时,URL中会包含多个参数,其中wd参数(表示搜索关键词)的值就是"HTTP",即wd=HTTP。因此,双方在网络通信过程中可以通过URL传输用户数据。

查询字符串是客户端与服务器交互的重要数据载体,支持:搜索过滤条件、分页参数、用户偏好设置、API 调用参数

7、片段标识符

ch1是片段标识符,主要用于标识资源的特定部分。例如在浏览组图时,URL中的片段标识符会随着图片切换而动态更新,以反映当前查看的图片位置。

#section1 指向资源内部的特定片段,主要用于:

  • 页面内导航:跳转到指定章节或锚点

  • 单页应用:现代前端路由的重要组成

  • 内容分片:如图集浏览时的图片定位

片段标识符的特别之处在于不会发送到服务器,仅由客户端(浏览器)处理。

8、技术要点总结

  1. HTTP 本质:无状态的请求-响应协议,构建于可靠的 TCP 传输层之上

  2. URL 设计哲学:通过统一格式定位任意网络资源,支持扩展和灵活使用

  3. 安全性演进:从 HTTP 到 HTTPS 的转变反映了对数据传输安全性的重视

  4. 用户体验:域名系统、默认端口等设计降低了用户使用门槛

  5. 扩展性:查询字符串、片段标识符等机制支持复杂的 Web 应用需求

理解 HTTP 和 URL 的工作原理,是掌握现代 Web 技术和网络编程的重要基础。


三、网络资源获取的本质与形式

1、资源以什么形式存在?------ 一个文件!

  • 在互联网中,我们日常访问的各种"资源",如短视频、视频、网页、图片、音频等,本质上都是以文件的形式存储在服务器上的。

  • 这些文件可能存储在Linux服务器的特定路径下,例如 /var/www/html 这样的常见网页存储路径。

  • 从网络通信的角度来看,获取这些资源的过程本质上是基于socket通信的。Socket(套接字)是网络通信中用于实现不同计算机之间数据传输的端点。

  • 在HTTP或HTTPS协议下,客户端(如浏览器)和服务器之间通过建立socket连接来进行数据的交互,客户端发送请求获取特定文件,服务器响应并将文件内容传输给客户端。

2、获取资源的前提条件

在我们想要获取远端服务器上的资源时,必须明确两个关键信息:

目标服务器的IP(或域名)

  • IP地址是互联网上设备的唯一标识,具有唯一性。例如,11.22.33.44 这样的IPv4地址可以唯一确定一台服务器。

  • 而域名(如 www.douyin.com)则是为了方便人们记忆而设置的,通过DNS(Domain Name System,域名系统)可以将域名解析为对应的IP地址。

  • DNS就像是一个互联网的"电话簿",将易于记忆的域名映射到实际的IP地址上。

  • 例如,Google提供的公共DNS服务器(IPv4地址为 8.8.8.88.8.4.4)以及Cloudflare DNS(IPv4地址为 1.1.1.11.0.0.1)等,在全球范围内广泛用于域名解析。

端口(Port)

  • 不同的协议使用不同的端口号,端口号用于标识服务器上运行的不同服务。默认情况下,每个协议固定对应单独的端口号!!!

  • 例如,HTTP协议默认使用80端口,HTTPS协议默认使用443端口,SSH协议默认使用22端口。

  • 在如 http://www.douyin.com:80/somepath 这样的URL中,www.douyin.com 是域名,80 就是指定的端口号,/somepath 则指向服务器上特定路径下的文件。

3、从HTTP角度看"资源"

  • 在HTTP协议的视角下,"资源"就是文件。

  • 每个资源都可以通过一个全网内唯一的标识来定位,这个标识由域名(或IP地址)、端口和路径组成。

  • 例如,对于一个存储在服务器特定路径下的网页文件,其完整的访问路径可以是 https://www.example.com:443/index.html

  • 其中,www.example.com 是域名,443 是HTTPS协议的默认端口,/index.html 则是该网页文件在服务器上的路径。

4、人的上网行为

人的上网行为主要可以归结为两种:

  • 从远端拿下来数据:也就是客户端从服务器获取资源的过程。比如,我们在浏览器中输入网址访问网页,浏览器作为客户端向服务器发送请求,服务器将网页文件(包含文本、图片、视频等各种资源)传输给浏览器,浏览器再将其解析展示给用户。

  • 将自己本地的数据上传到远端:例如,我们使用网盘上传文件,或者在一些网站上提交表单信息等,都是将本地数据上传到远端服务器的过程。

以常见的短视频平台为例,当我们打开抖音的网页或APP时,APP作为客户端会向抖音的服务器发送请求,服务器根据请求返回对应的短视频文件(视频文件以及相关的描述信息等文件),客户端接收到这些文件后进行解析和展示,这就是从远端获取数据的过程。而当用户上传自己制作的短视频时,则是将本地的视频文件上传到抖音的服务器上。

总之,互联网上的资源获取和交互都是基于明确的地址标识(IP/域名、端口、路径)和socket通信来实现的,理解这些基本概念有助于我们更好地理解网络工作的原理。


四、协议固定端口号 与 全球知名DNS域名服务器

1、协议固定端口号

端口号 协议/服务 说明
20, 21 FTP 文件传输协议(21控制,20数据)
22 SSH 安全Shell,远程登录
23 Telnet 明文远程登录
25 SMTP 简单邮件传输协议(发邮件)
53 DNS 域名系统
67, 68 DHCP 动态主机配置协议
80 HTTP 网页服务
110 POP3 邮局协议(收邮件)
123 NTP 网络时间协议
143 IMAP 互联网消息访问协议(收邮件)
161, 162 SNMP 简单网络管理协议
179 BGP 边界网关协议
443 HTTPS 安全HTTP
465 SMTPS 加密SMTP
587 SMTP提交端口 邮件客户端提交端口
993 IMAPS 加密IMAP
995 POP3S 加密POP3
1080 SOCKS 代理协议
1433 Microsoft SQL Server 数据库
1521 Oracle数据库 数据库
1723 PPTP VPN协议
1883 MQTT 物联网消息协议
3306 MySQL 数据库
3389 RDP 远程桌面协议
5432 PostgreSQL 数据库
5900 VNC 远程桌面
6379 Redis 内存数据库
8080 HTTP备用端口 常用替代端口
8443 HTTPS备用端口 常用替代端口
27017 MongoDB 数据库
5060, 5061 SIP VoIP协议

使用netstat命令查看

netstat 是一个网络统计工具 ,用于查看系统的网络连接、路由表、接口统计等信息 。我们可以使用netstat命令来查看详细地信息:

bash 复制代码
netstat -ltp

参数解释

  • -l:仅显示监听状态的套接字

  • -t:仅显示 TCP 连接

  • -p:显示进程名/PID

示例输出

对比:有 -n 和没有 -n

不加 -n(显示名字)

bash 复制代码
netstat -ltp
# 输出:0.0.0.0:http  ← 显示协议名

-n(显示数字)

bash 复制代码
netstat -ltpn
# 输出:0.0.0.0:80    ← 显示端口号

区别

  • :http → 人类易读的名字

  • :80 → 机器理解的数字

最实用的组合:查看所有监听端口(最常用)

bash 复制代码
netstat -tulpn

参数

  • -t:TCP

  • -u:UDP

  • -l:监听状态

  • -p:进程信息

  • -n以数字显示端口(不解析服务名)

示例输出

查看自己的 HTTP 服务器

bash 复制代码
# 查看 8080 端口
netstat -tlnp | grep :8080

# 或者
netstat -tulpn | grep 8080

2、全球知名DNS域名服务器

根DNS服务器(13组,全球分布)

名称 运营机构 分布
a.root-servers.net Verisign 全球多地
b.root-servers.net USC-ISI 全球多地
c.root-servers.net Cogent通信 全球多地
d.root-servers.net 马里兰大学 全球多地
e.root-servers.net NASA 全球多地
f.root-servers.net 互联网系统联盟 全球多地
g.root-servers.net 美国国防部 全球多地
h.root-servers.net 美国陆军 全球多地
i.root-servers.net Netnod 全球多地
j.root-servers.net Verisign 全球多地
k.root-servers.net RIPE NCC 全球多地
l.root-servers.net ICANN 全球多地
m.root-servers.net WIDE Project 全球多地

公共递归DNS服务器

服务商 主要DNS 备用DNS 特点
Google Public DNS 8.8.8.8 8.8.4.4 快速、安全
Cloudflare DNS 1.1.1.1 1.0.0.1 隐私保护、快速
Quad9 9.9.9.9 149.112.112.112 安全、屏蔽恶意网站
OpenDNS 208.67.222.222 208.67.220.220 思科旗下,家庭过滤
阿里云DNS 223.5.5.5 223.6.6.6 中国访问快
腾讯云DNS 119.29.29.29 - 中国访问快
114DNS 114.114.114.114 114.114.115.115 中国电信
CNNIC 1.2.4.8 210.2.4.8 中国互联网络信息中心
Level3 209.244.0.3 209.244.0.4 大型运营商
Comodo Secure DNS 8.26.56.26 8.20.247.20 安全DNS
Neustar 156.154.70.1 156.154.71.1 性能优化
Yandex DNS 77.88.8.8 77.88.8.1 俄罗斯搜索引擎
Verisign 64.6.64.6 64.6.65.6 基础设施服务

顶级域(TLD)DNS服务器

  • .com, .net:由Verisign运营

  • .org:由PIR(Public Interest Registry)运营

  • .cn:由中国互联网络信息中心(CNNIC)运营

  • .uk, .co.uk:由Nominet运营

  • .de:由DENIC运营

  • .jp:由日本注册服务(JPRS)运营

3、DNS层级结构

查询示例

查询baidu.com的DNS记录,如下:

bash 复制代码
# 查询baidu.com的DNS记录
dig @8.8.8.8 baidu.com

流程:

  • 向8.8.8.8查询

  • 8.8.8.8向根服务器查询 .com

  • 根服务器指向 .com 服务器

  • .com 服务器指向 baidu.com 的权威服务器

  • 返回IP给用户


五、DNS 与 域名服务器

1、DNS vs 域名服务器

对比项 DNS(域名系统) 域名服务器
本质 完整的系统/协议 系统中的服务器
类比 整个邮政系统 具体的邮局
组成 协议 + 服务器 + 数据库 + 客户端 只是硬件/软件服务器
功能 域名解析的完整体系 提供域名解析服务的服务器
包含关系 包含域名服务器 是 DNS 的一部分

1. DNS(域名系统)

DNS 是一个完整的分布式数据库系统,用于将域名转换为 IP 地址。

DNS 包含的组件

  • 协议标准:定义如何查询和响应

  • 域名服务器:存储域名记录的服务器

  • 解析器:客户端软件(如操作系统中的 stub resolver)

  • 数据库:分布式的域名记录

  • 缓存系统:提高查询效率

2. 域名服务器

只是 DNS 系统中提供服务的服务器实例

常见的域名服务器

  • 根服务器:全球13组,管理顶级域信息

  • TLD 服务器:管理 .com、.cn 等顶级域

  • 权威服务器 :管理具体域名的记录(如 baidu.com

  • 递归服务器:为用户提供查询服务(如 8.8.8.8)

2、工作流程示例

当你在浏览器输入 www.baidu.com

  • 整个链条 = DNS 系统

  • 每个节点 = 域名服务器

3、类比解释

类比 DNS 系统 域名服务器
快递系统 整个快递网络(下单-揽收-分拣-运输-派送) 某个快递站点
图书馆系统 完整的图书检索借阅系统 图书馆的书架/柜台
电话系统 完整的电话号码拨号通话系统 电话交换机
你的项目 完整的 HTTP 服务器系统 你的 ./server 程序
  • DNS 是协议(像 HTTP),域名服务器是程序(像你的 HTTP 服务器)

4、常见混淆的原因

为什么人们会混用?

  1. 日常用语简化:"DNS 挂了" 实际是 "DNS 服务器挂了"

  2. 配置界面:网络设置中 "DNS 地址" 实际是 "DNS 服务器地址"

  3. 服务商宣传:"使用 Google DNS" 实际是 "使用 Google 的 DNS 服务器"

正确说法

  • ❌ "DNS 是域名服务器"

  • ✅ "DNS 是一个系统,包含域名服务器"

  • ✅ "8.8.8.8 是一个 DNS 服务器"

  • ✅ "我在配置 DNS 服务器地址"

5、你的项目中如何应用

当你的服务器运行在 113.45.79.2

访问过程

  1. 用户输入 http://113.45.79.2:8080后,不需要 DNS 解析(直接使用 IP)

  2. 用户输入 http://your-domain.com:8080

    bash 复制代码
    浏览器 → DNS系统 → 域名服务器 → 返回 113.45.79.2 → 你的服务器

如果你要绑定域名

  1. 在域名注册商处设置 DNS 记录:

    bash 复制代码
    your-domain.com A 记录 → 113.45.79.2
  2. 用户的 DNS 查询会经过多个域名服务器

  3. 最终找到你的服务器 IP

6、总结

概念 是什么 例子
DNS 系统/协议 像 "HTTP协议"、"TCP/IP协议栈"
域名服务器 系统中的一个组件 像 "Apache服务器"、"你的server程序"
关系 DNS 系统由许多域名服务器组成 像 "互联网由许多服务器组成"

简单记忆

  • DNS = 整个快递公司(系统)

  • 域名服务器 = 具体的快递站点(组件)

所以,DNS 不仅仅是域名服务器,域名服务器只是 DNS 系统的一部分。就像 HTTP 不仅仅是 Web 服务器,Web 服务器只是 HTTP 系统的一部分。


六、URL编码(urlencode )与解码(urldecode

1、为什么需要URL编码?

在HTTP通信中,URL用于标识和定位网络资源。然而,URL本身包含多种具有特殊含义的字符,这些字符用于区分URL的不同组成部分。URL 中像 /、?、: 等字符具有特殊含义,不能直接使用。如果参数需要包含这些特殊字符,必须进行转义处理。例如:

  • 路径分隔符/

  • 查询参数起始符?

  • 参数分隔符&

  • 键值对连接符=

  • 片段标识符起始符#

当用户希望在URL中传递包含这些特殊字符的数据时(如搜索包含"?"的关键字),就会产生歧义 。为了解决这一问题,URL编码应运而生。

编码格式

bash 复制代码
%XX%XX...
  • %:编码标识符,表示后面跟随的是十六进制编码

  • XX:两位十六进制数,表示字符的 ASCII/Unicode 值

| 字符 | 用途 | ASCII值 | 十六进制 | 编码结果 |
| 空格 | 参数分隔 | 32 | 20 | %20 |
| + | 空格替代符号 | 43 | 2B | %2B |
| / | 路径分隔符 | 47 | 2F | %2F |
| ? | 查询起始符 | 63 | 3F | %3F |
| # | 片段标识符 | 35 | 23 | %23 |

& 参数分隔符 38 26 %26

2、URL编码机制

URL编码(又称百分号编码)将不安全或保留字符转换为以%开头的十六进制表示形式。也就是说,将待转码字符转换为十六进制形式,从右至左每四位为一组进行处理(不足四位则直接处理),再将每两位组合成一个单元,并在前面添加百分号,最终编码为%XY格式。转义规则如下:

  1. 字符识别:判断字符是否需要编码

  2. 字符转换:获取字符的编码值(ASCII 或 Unicode)

  3. 将需要转码的字符转换为16进制

  4. 从右到左取4位(不足4位直接处理)

  5. 每2位作为一组,前面加上%符号(格式组装 :添加 % 前缀,确保为两位十六进制数**)**

  6. 编码成%XY格式

例如:"+" 转义为 "%2B"。URL解码(urlencode)则是编码(urldecode)的逆过程。

操作 功能 示例
URL编码 (urlencode) 将特殊字符转换为 %XX 格式 空格 → %20@%40
URL解码 (urldecode) %XX 格式转换回原始字符 %20 → 空格,%40@

1. 编码规则详解

字符转换过程

  • 将待编码字符转换为其对应的ASCII码值

  • 将ASCII码值转换为十六进制表示

  • 在十六进制值前添加%前缀

技术细节

  • 字符:"?"

  • ASCII码值:63(十进制)

  • 十六进制:3F

  • 编码结果:%3F

标准依据:遵循RFC 3986标准,将URL中允许的字符分为:

  • 保留字符; / ? : @ & = + $ , #

  • 非保留字符 :字母、数字、- _ . ~

  • 不安全字符 :空格、< > " % { } | \ ^ [ ] `````

2. 编码示例

示例1:C++ 的编码

  • 原始搜索词:C++

  • + 号的ASCII码:43(十进制) → 0x2B(十六进制)

  • 编码结果:C%2B%2B

当用户搜索"C++"时,由于加号"+"在URL中是特殊字符,它会被转换为十六进制值0x2B,每个"+"符号在编码后会变成"%2B",也就是说浏览器自动将+编码为%2B,确保URL解析器不会将+误解为空格。

示例2:复杂搜索词的编码

  • 原始搜索词:C++/Python?基础

  • 编码结果:C%2B%2B%2FPython%3F%E5%9F%BA%E7%A1%80

  • 分解说明:

    • + → %2B

    • / → %2F (路径分隔符,需要编码)

    • ? → %3F (查询起始符,需要编码)

    • 中文字符 → %E5%9F%BA%E7%A1%80

3. 中文编码的特殊性

中文字符的编码采用UTF-8编码 + 百分号编码双重处理:

  1. UTF-8编码:将中文字符转换为多字节的UTF-8序列

  2. 百分号编码:对每个字节进行百分号编码

例子:

  • 字符:"网"

  • UTF-8编码:E7 BD 91(十六进制)

  • URL编码:%E7%BD%91

3、URL解码过程

URL解码是编码的逆过程,主要步骤包括:

  1. 识别编码序列 :查找URL中的%XX格式序列

  2. 十六进制转换 :将XX转换为十进制值

  3. 字符还原:根据编码字符集(通常为UTF-8)还原原始字符

例子:

  • 编码字符串:%E6%B5%8B%E8%AF%95

  • 解码过程:

    • %E6 → 230(十进制) → UTF-8字节1

    • %B5 → 181(十进制) → UTF-8字节2

    • %8B → 139(十进制) → UTF-8字节3

    • ...

  • 解码结果:"测试"

4、编码/解码工具使用

推荐使用专业工具进行URL编解码操作:

在线工具示例:站长工具(UrlEncode编码/UrlDecode解码 - 站长工具

操作步骤:

  1. 选择模式:点击"URL编码/解码"

  2. 输入内容:在输入框中输入待处理的字符串

  3. 执行操作:点击相应按钮获取结果

  4. 查看结果:在输出区域查看编解码结果

实际操作演示:

输入:C++编程教程

我们点击UrlEncode编码就可以编码了,如下:

编码结果:C%2B%2B%E7%BC%96%E7%A8%8B%E6%95%99%E7%A8%8B

解码结果:C++编程教程

我们点击UrlDecode解码就可以成功解码了,如下:

服务器获取URL后,必须对编码参数进行解码才能正确接收传递的数据。解码过程实质上是编码的逆向操作。

5、实际应用场景

1. 表单提交

当HTML表单以GET方式提交时,表单数据会自动进行URL编码,这里我使用这个编码/解码工具来演示:

  • 原始数据:name=张三&age=20

  • 编码结果:name%3D%E5%BC%A0%E4%B8%89%26age%3D20

2. API调用

RESTful API中,URL参数经常需要编码:

查询用户:/api/users?name=John%20Doe&department=R&D

其中空格编码为%20&编码为%26

3. 文件路径处理

包含特殊字符的文件名在URL中需要编码:

  • 原始路径:/files/report-2024/01/20.pdf

  • 编码路径:%2Ffiles%2Freport-2024%2F01%2F20.pdf

6、注意事项与最佳实践(了解即可)

1. 编码级别选择

  • encodeURI():对整个URL编码,保留协议、域名等部分

  • encodeURIComponent():对URL组件严格编码,适用于参数值

2. 字符集一致性

  • 确保编码和解码使用相同的字符集(推荐UTF-8)

3. 双重编码问题

避免对已编码的字符串再次编码:

  • 错误:C++ → C%2B%2B → C%252B%252B

  • 正确:C++ → C%2B%2B

4. 空格处理

  • URL编码中,空格通常编码为%20

  • 在查询字符串中,空格有时也被编码为+

7、安全性考虑

  1. SQL注入防护:URL解码应在验证后进行

  2. 路径遍历攻击 :注意../的编码

  3. XSS防护:对用户输入的URL进行适当过滤

8、动态交互式网站中的URL特殊字符编码与解码机制

1. 动态交互式网站与URL的重要性

  • 在当今的互联网世界中,动态交互式网站占据了主导地位。这类网站能够根据用户的输入和操作实时生成和更新页面内容,为用户提供丰富多样的体验,如在线购物网站、社交媒体平台、在线办公系统等。

  • 而URL(Uniform Resource Locator,统一资源定位符)在动态交互式网站中起着至关重要的作用,它是用来定位和访问网站上特定资源的地址。

  • 每一个页面、每一个操作都可能对应着一个独特的URL,通过URL,浏览器能够准确地向服务器发送请求,获取相应的数据并展示给用户。

2. URL中的特殊字符及其问题

  • 在URL的构成中,有一些字符具有特殊的用途,它们被用于界定URL的不同部分或者执行特定的功能。

  • 例如,/ 用于分隔路径中的不同层级,? 用于分隔基本URL和查询参数,& 用于分隔多个查询参数,= 用于分隔参数名和参数值等。

  • 然而,当我们在URL中需要传递一些包含这些特殊字符的实际数据时,问题就出现了。

  • 比如,我们想要在查询参数中传递一个字符串 user/name=test,如果直接将其放在URL中,浏览器在解析URL时,遇到 / 会误认为这是路径分隔符,从而导致URL解析失败,无法正确识别我们想要传递的参数信息。

  • 类似地,其他特殊字符如 :#% 等如果不进行适当处理,也会引发URL解析错误,使得服务器无法准确理解客户端的请求意图。

3. 客户端的URL编码(URL Encode)

  • 为了解决上述问题,客户端(一般是浏览器)在发送请求时,会自动对URL中的特殊字符进行编码处理。这个过程被称为URL编码,也称为百分号编码(Percent - Encoding)。

  • URL编码的规则是将需要编码的字符转换为特定的格式:% 后跟两位十六进制数,这两位十六进制数代表该字符在ASCII码表中的值。例如,空格字符在ASCII码中的值为32,转换为十六进制是20,所以空格在URL编码中表示为 %20/ 字符的ASCII码值为47,十六进制为2F,编码后就是 %2F

  • 以一个实际的例子来说,假设我们要在查询参数中传递一个包含空格和斜杠的字符串 user name/test,浏览器会将其编码为 user%20name%2Ftest。这样,在URL中这些特殊字符就不会干扰URL的正常解析,能够安全地传输到服务器端。

4. 服务器端的URL解码(URL Decode)

  • 当服务器接收到客户端发送过来的经过编码的URL后,需要进行相反的操作,即URL解码,以还原出原始的参数信息。

  • 服务器会识别URL中的 % 后跟两位十六进制数的格式,并将其转换回对应的ASCII字符。

  • 例如,服务器看到 %20 会将其还原为空格,看到 %2F 会还原为 /

  • 通过这样的解码过程,服务器能够正确解析出客户端传递的参数,进而根据这些参数执行相应的业务逻辑,生成合适的响应内容返回给客户端。

5. 编码与解码的意义和作用

  • 这种URL编码和解码的机制对于动态交互式网站的正常运行至关重要。

  • 它确保了在URL中能够安全、准确地传输各种类型的数据,包括包含特殊字符的字符串。

  • 无论是用户输入的搜索关键词、表单数据,还是其他自定义的参数信息,都能够通过这种编码方式在客户端和服务器之间正确传递。

  • 同时,这种机制也增强了网站的安全性和稳定性。避免了因特殊字符导致的URL解析错误,防止了潜在的恶意攻击,如通过构造特殊字符来破坏URL结构,进而实施SQL注入、跨站脚本攻击等安全威胁。

  • 此外,它还使得不同系统和平台之间的数据交互更加兼容和顺畅,因为URL编码是一种通用的标准,各种浏览器和服务器都遵循这一规则进行编码和解码操作。

总之,在动态交互式网站中,客户端的URL编码和服务器端的URL解码是一个不可或缺的环节,它们保障了网站能够高效、安全、稳定地运行,为用户提供良好的使用体验。

9、总结

URL编码是Web开发中的基础但关键的技术,它:

  • 消除歧义:确保URL中的特殊字符被正确解析

  • 支持多语言:通过UTF-8编码支持全球字符集

  • 保障数据完整性:准确传输包含保留字符的数据

  • 标准化:遵循国际标准,保证跨平台兼容性

理解URL编码机制对于Web开发者、安全工程师和网络管理员都至关重要,是构建健壮、安全Web应用的基础技能之一。

相关推荐
Macbethad44 分钟前
高性能 CANopen 主站程序技术方案 (基于 WPF)
网络协议·wpf·信息与通信
别动哪条鱼3 小时前
AAC ADTS 帧结构信息
网络·数据结构·ffmpeg·音视频·aac
星融元asterfusion8 小时前
uCentral Controller:数据中心网络的智能化控制核心
网络·开源软件·ucentral
青青草原技术员灰太狼9 小时前
Nginx的https搭建
linux·服务器·网络
xu_yule9 小时前
网络和Linux网络-4(应用层)序列化和反序列化(网络计算器)
linux·网络
柳鲲鹏10 小时前
寻北仪的种类及其原理
网络
寂寞旅行10 小时前
解决摄像头/麦克风 在HTTP环境下的调用问题
网络·网络协议·http
爱学习的程序媛10 小时前
《图解HTTP》核心知识点梳理
网络·网络协议·http·https
oioihoii10 小时前
C++网络编程:从Socket混乱到优雅Reactor的蜕变之路
开发语言·网络·c++