目录

计算机原理深入解析-HTTP-中的-URL-格式结构和-URL-encode-转义与-URL-decode-逆转义原理

【计算机原理】深入解析 HTTP 中的 URL 格式、结构和 URL encode 转义与 URL decode 逆转义原理

https://i-blog.csdnimg.cn/direct/a9d3553301c848ff9cad6aa4116248ea.gif#pic_center

https://i-blog.csdnimg.cn/direct/3f0db243807441ebb7b0070656e2c195.png#pic_center

https://i-blog.csdnimg.cn/direct/cd5abfb0ba1c49128b69f4ebb5922bac.gif#pic_center


网络原理— HTTP 请求(Request)


认识URL


1. URL 基本格式


平时我们俗称的 “网址” 其实就是说的 URL (Uniform Resource Locator 统一资源定位符 );

互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置,以及浏览器应该怎么处理它;

URL的详细规则由因特网标准 RFC1738 进行了约定.( )

https://i-blog.csdnimg.cn/direct/49724fd589c649318a7ed94b25936b34.png

一个具体的URL:

可以看到,在这个URL中有些信息被省略了;


https:

https://i-blog.csdnimg.cn/direct/ffb0688c17484d0cbaba87e4dde804a7.png

  • 协议方案名;
  • 常见的有http和https,也有其他的类型;(例如访问mysql时用的jdbc:mysql)

user:pass:

https://i-blog.csdnimg.cn/direct/4780e4c45a7b4428aa365c175ffb14ca.png

  • 登陆信息;
  • 现在的网站进行身份认证,一般不再通过URL进行了,一般都会省略

v.bitedu.vip:

https://i-blog.csdnimg.cn/direct/f3ec2dd75c4943bea045b3aa9279d1af.png

  • 服务器地址(IP地址),用于定位一个主机;
  • 此处是一个"域名",域名会通过 DNS 系统 解析成一个具体的IP地址;
  • (通过 ping 命令可以看到,v.bitedu.vip 的真实IP地址为 118.24.113.28 )

端口号:

https://i-blog.csdnimg.cn/direct/1935af283aa2401081d019cb24495e87.png

  • 每个应用程序在使用网络时,都会关联一个空闲的端口号;
  • 通过 IP 定位一台主机,通过端口号区分主机上使用网络的多个应用程序;
  • 当端口号省略的时候,浏览器会根据 协议类型 自动决定使用哪个端口;
  • 例如 http 协议默认使用 80端口 ,https协议默认使用 443端口

回忆五元组:源端口,源 ip,目的端口,目的 ip,协议类型;

http 协议默认使用 80端口 ,https协议默认使用 443端口 ,站在客户端的角度,两种协议访问的端口是 远端服务器的端口(目的端口) ,不是浏览器自身的 客户端端口 (源端口);


/personInf/student:

https://i-blog.csdnimg.cn/direct/ca79cb2e905a4242a9c187f1841e0fa8.png

  • 带层次结构的 文件路径 ,每一层都是一个目录;

userId=10000&classId=100:

https://i-blog.csdnimg.cn/direct/3122aa56c22d4202a7a79db9fc05f577.png

  • 查询字符串 (query string) ,本质是一个 键值对 结构;
  • 键值对之间使用 & 分隔;
  • 键和值之间使用 = 分隔.

片段标识:

https://i-blog.csdnimg.cn/direct/cb76f578cbeb4de89ee4cb1eef92eb46.png

  • 片段标识主要用于 页面内跳转 .

例如Vue官方文档:

  • 通过不同的片段标识跳转到文档的不同章节

2. 使用 ping 命令查看域名对应的IP地址


  1. 在开始菜单中输入 cmd ,打开命令提示符
  2. cmd 中输入 ping v.bitedu.vip ,即可看到 域名解析 的结果.

https://i-blog.csdnimg.cn/direct/85d6703a22394371b22ad20ba8f8b32e.png

PS:

有的电脑上 ping 命令会报错 ping 不是内部或外部命令,也不是可运行的程序或批处理文件

这种情况是因为有的 Windows10 默认没有启用 ping 命令;

百度搜索 windows10 启用 ping 即可;


3. query string


  • query string中的内容是 键值对结构
  • 其中的 key 和 value 的 取值个数 ,完全都是程序猿自己约定的;
  • 我们可以通过这样的方式来自定制传输我们需要的信息给服务器.

4. URL中的可省略部分


协议名:

  • 可以省略,省略后默认为http://

ip地址/域名:

  • HTML 中可以省略(比如 img , link , script , a 标签的 src 或者 href 属性);
  • 省略后,表示 服务器的 ip/域名 与当前 HTML所属的 ip/域名 一致

端口号:

  • 可以省略,省略后如果是 http 协议,端口号自动设为 80 ;
  • 如果是 https 协议,端口号自动设为 443 .

带层次的文件路径:

  • 可以省略,省略后相当于 /
  • 有些服务器会在发现 /路径 的时候自动访问 /index.html

查询字符串:

  • 可以省略

片段标识:

  • 可以省略

5. 关于URL encode


/ ? : # & = …等这样的字符,已经被 URL 当做特殊意义理解了;因此这些字符不能随意出现;


某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义;
  • 一个 中文字符 等非英文系的文字,由 UTF-8 或者 GBK 这样的编码方式构成,虽然在URL中没有特殊含义,但是仍然需要进行 转义
  • 否则 浏览器 可能把 UTF-8/GBK 编码中的 某个字节 ,当做 URL中的特殊符号
  • 只不过很多浏览器为了用户看起来方便,显示 URL 某个参数的时候, 显示的是转义之前的字符 ;
  • 实际上,我们可以 通过抓包查看真实的数据 ,已经是转义之后的数据;

我们在搜索框中输入中文,可以看见 URL 的其中一个 query string 键值对 中,对 属性 的赋值还是中文;

https://i-blog.csdnimg.cn/direct/642034264d5f430888b92bef73a9620e.png


我们使用 fiddler 来对刚刚的访问操作进行抓包:

https://i-blog.csdnimg.cn/direct/f27d0794d7674a1d852613a9f3c26b1c.png


在记事本中打开 HTTP请求 的详细信息,我们发现属性赋值的真实数据是”你好“转义后的结果:

https://i-blog.csdnimg.cn/direct/bad9047c5d4f4f45b14506e834ccb82a.png


转义这样的操作非常重要,如果没有进行转义,就可能会使浏览器或者服务器无法正确解析,请求就会失败。


转义的规则如下:
  • 将需要转码的字符转为 16进制 ,然后 从右到左
  • 取4位(不足4位直接处理),每2位做一位,前面加上%,编码成 %XY 格式;

例如:

https://i-blog.csdnimg.cn/direct/34b21d5effb640e88eb9b4336f948273.png

"+" 被转义成了 "%2B"

urldecode 就是 urlencode 的 逆过程


如果要使用逆过程 urldecode ,可以把 utf-8 中的 % 去掉,然后使用 urldecode ,就可以拿到转义前的数据;


https://i-blog.csdnimg.cn/direct/a9d3553301c848ff9cad6aa4116248ea.gif#pic_center

https://i-blog.csdnimg.cn/direct/cd5abfb0ba1c49128b69f4ebb5922bac.gif#pic_center