目录
[一、HTTP 协议概述](#一、HTTP 协议概述)
[二、URL 结构解析](#二、URL 结构解析)
[1. 域名 vs IP 地址](#1. 域名 vs IP 地址)
[2. 一句话概括DNS(域名系统)](#2. 一句话概括DNS(域名系统))
[3. 一个生动的比喻:找房子](#3. 一个生动的比喻:找房子)
[4. DNS 查询的简要过程](#4. DNS 查询的简要过程)
[5. 总结 DNS 的核心作用](#5. 总结 DNS 的核心作用)
[1、资源以什么形式存在?------ 一个文件!](#1、资源以什么形式存在?—— 一个文件!)
[四、协议固定端口号 与 全球知名DNS域名服务器](#四、协议固定端口号 与 全球知名DNS域名服务器)
[五、DNS 与 域名服务器](#五、DNS 与 域名服务器)
[1、DNS vs 域名服务器](#1、DNS vs 域名服务器)
[1. DNS(域名系统)](#1. DNS(域名系统))
[2. 域名服务器](#2. 域名服务器)
六、URL编码(urlencode)与解码(urldecode)
[1. 编码规则详解](#1. 编码规则详解)
[2. 编码示例](#2. 编码示例)
[3. 中文编码的特殊性](#3. 中文编码的特殊性)
[在线工具示例:站长工具(UrlEncode编码/UrlDecode解码 - 站长工具)](#在线工具示例:站长工具(UrlEncode编码/UrlDecode解码 - 站长工具))
[1. 表单提交](#1. 表单提交)
[2. API调用](#2. API调用)
[3. 文件路径处理](#3. 文件路径处理)
[1. 编码级别选择](#1. 编码级别选择)
[2. 字符集一致性](#2. 字符集一致性)
[3. 双重编码问题](#3. 双重编码问题)
[4. 空格处理](#4. 空格处理)
[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. 编码与解码的意义和作用)
一、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.com比14.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 的查询过程通常如下(这是一个简化的流程):
-
浏览器缓存:你的浏览器会首先检查自己的"小本本"(缓存),看最近是否访问过这个网站,如果有记录,直接使用。
-
操作系统缓存:如果浏览器没有记录,它会去问电脑的操作系统(如 Windows、macOS)的"小本本"。
-
路由器缓存:如果电脑上也没记录,请求会发送到你家的路由器,路由器也会有自己的缓存。
-
ISP 的 DNS 服务器:如果前面都找不到,你的请求就会被发送到你的网络服务提供商(如中国电信、中国移动)的 DNS 服务器。这是查询的主力军。
-
递归查询与根域名服务器:
-
ISP 的 DNS 服务器会从一个"全球地址总目录"------根域名服务器开始问路。根服务器不直接给出答案,但它会告诉你".com"区域的负责人在哪里。
-
然后,ISP 的服务器再去问 .com 顶级域名服务器 。这个服务器也不会直接给出答案,但它会告诉你"google.com"这个域的负责人在哪里。
-
最后,ISP 的服务器去问 google.com 的权威域名服务器 。这个服务器才是最终掌管 google.com 所有信息的"管家",它会给出
www.google.com对应的正确 IP 地址。
-
-
返回结果:ISP 的 DNS 服务器拿到 IP 地址后,会把它返回给你的电脑,并且自己也会缓存一份,方便下次快速查询。
-
网站访问:你的电脑拿到 IP 地址后,浏览器就可以向这个地址发起连接,最终打开你想要访问的网站。
这个过程非常快,通常只在毫秒之间完成。
5. 总结 DNS 的核心作用
-
翻译官:将人类可读的域名翻译成机器可读的 IP 地址。
-
分布式数据库:它是一个全球性的、层次化的分布式系统,没有单点故障,非常稳定。
-
简化互联网使用:让我们无需记忆复杂的数字串,极大地便利了上网体验。
所以,简单来说,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、技术要点总结
-
HTTP 本质:无状态的请求-响应协议,构建于可靠的 TCP 传输层之上
-
URL 设计哲学:通过统一格式定位任意网络资源,支持扩展和灵活使用
-
安全性演进:从 HTTP 到 HTTPS 的转变反映了对数据传输安全性的重视
-
用户体验:域名系统、默认端口等设计降低了用户使用门槛
-
扩展性:查询字符串、片段标识符等机制支持复杂的 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.8和8.8.4.4)以及Cloudflare DNS(IPv4地址为1.1.1.1和1.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、常见混淆的原因
为什么人们会混用?
-
日常用语简化:"DNS 挂了" 实际是 "DNS 服务器挂了"
-
配置界面:网络设置中 "DNS 地址" 实际是 "DNS 服务器地址"
-
服务商宣传:"使用 Google DNS" 实际是 "使用 Google 的 DNS 服务器"
正确说法:
-
❌ "DNS 是域名服务器"
-
✅ "DNS 是一个系统,包含域名服务器"
-
✅ "8.8.8.8 是一个 DNS 服务器"
-
✅ "我在配置 DNS 服务器地址"
5、你的项目中如何应用
当你的服务器运行在 113.45.79.2:
访问过程:
-
用户输入
http://113.45.79.2:8080后,不需要 DNS 解析(直接使用 IP) -
用户输入
http://your-domain.com:8080bash浏览器 → DNS系统 → 域名服务器 → 返回 113.45.79.2 → 你的服务器
如果你要绑定域名:
-
在域名注册商处设置 DNS 记录:
bashyour-domain.com A 记录 → 113.45.79.2 -
用户的 DNS 查询会经过多个域名服务器
-
最终找到你的服务器 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格式。转义规则如下:
-
字符识别:判断字符是否需要编码
-
字符转换:获取字符的编码值(ASCII 或 Unicode)
-
将需要转码的字符转换为16进制
-
从右到左取4位(不足4位直接处理)
-
每2位作为一组,前面加上%符号(格式组装 :添加
%前缀,确保为两位十六进制数**)** -
编码成%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编码 + 百分号编码双重处理:
-
UTF-8编码:将中文字符转换为多字节的UTF-8序列
-
百分号编码:对每个字节进行百分号编码
例子:
-
字符:"网"
-
UTF-8编码:E7 BD 91(十六进制)
-
URL编码:%E7%BD%91
3、URL解码过程
URL解码是编码的逆过程,主要步骤包括:
-
识别编码序列 :查找URL中的
%XX格式序列 -
十六进制转换 :将
XX转换为十进制值 -
字符还原:根据编码字符集(通常为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解码 - 站长工具)

操作步骤:
-
选择模式:点击"URL编码/解码"
-
输入内容:在输入框中输入待处理的字符串
-
执行操作:点击相应按钮获取结果
-
查看结果:在输出区域查看编解码结果
实际操作演示:
输入: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、安全性考虑
-
SQL注入防护:URL解码应在验证后进行
-
路径遍历攻击 :注意
..和/的编码 -
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应用的基础技能之一。