常见的网络访问标志 - URL
在计算机中,我们常常都会使用浏览器访问互联网上的资源,浏览器运行我们提供待检索信息,然后浏览器会将检索结果返回到前端页面中,当我们打开某条结果后,就会发现浏览器进入到了另一个页面,在打开新页面的同时,新页面的上方会有一串英文字符https://xxx
。
什么是URL
新页面伴随的神秘英文字符串https://xxx
就是URL Uniform Resource Locator
。
通过URL可以访问指定的网络资源,而URL可以看作是URI Uniform Resource Identifier
的子集,URI为资源提供的唯一的标识符,与URL的区别在于,URL即提供资源的访问方法,又提供资源的标识符,而URI只提供资源的标识符。
只提供资源的标识符的URI,有这样的一种场景,就是为书籍提供唯一的标识名称,这种方式也被称作是URN Uniform Resource Name
。
URL的构成 - 网络协议
在URL标准中,顶在://
前的字符串就是当前使用的协议名称。
URL可用的网络协议由互联网数字分配机构IANA Internet Assigned Numbers Authority
维护,IANA常见支持的协议有https://
、ftp://
等等。
除了IANA支持的协议外,浏览器一般还会支持一些第三方的协议。
网络协议的主要作用就是定义对象间使用网络进行交流时的语言规则。
1
| device A | <
-
scheme
-
> | device B |
URL通过scheme://
指定的网络协议,与提供资源的服务端进行流程的沟通。
网络协议一般会要求客户端按照将数据按照指定格式填充后再提交给服务端,报文的封装可能是客户端自身完成的,也可能是客户端使用第三方插件完成的,
除了用于数据传输的协议,一些强大的客户端(比如浏览器)还支持一些伪协议,这种伪协议大致可以分成两类。
一是类似于javascript:
的伪协议(javascript:
支持HTML元素执行JavaScript代码),其作用是借助伪协议在网页中获取代码执行或控制权限。
二是类似与view-source:
的伪协议(view-source:
强制网页显示源代码),其作用是强制网页安装伪协议要求的格式显示网页内容。
伪协议在URL中,一般会放在正常协议的前面。
URL的构成 - 域名与端口
IP地址
因特网协议IP Internet Protocol
为每个连接到网络的设备分配了一个数字地址,这个数字地址也被称作是IP地址,IP地址是设备的唯一编号,IP地址保证了设备可以在网络上被准确的识别出来。
IP地址可以分成IPv4和IPv6两种,它们的作用都是一样的,区别在于IPv4可以容纳的地址空间远远小于IPv6,随着越来越多的设备接入网络,IPv4开始面临空间容量带来的问题,因此IPv6横空出世,提供更加广阔的地址空间给接入网络的设备。
互联网的资源都位于终端上,想要访问网络上资源就要找到对应的设备,因此IP地址是极其重要的,借助它才可以找到设备。
IP命令输出信息解析
Linux系统当中,可以使用ip
命令或ifconfig
命令快速查看IP地址信息,值得注意的是,ifconfig
命令在某些较新的发行版中已经被弃用了。
通过ip
命令的address
选项可以列出所有的网络信息,网络信息的数量由当前系统上可用的网络接口(有线网络接口、无线网卡等等)数量决定。
wlP2p33s0
中的wl
是WLAN Wireless Local Area Network
的缩写,代表着无线局域网,enP4p65s0
和enP3p49s0
中的en
代表以太网ethernet
,lo
代表着本地网络,它是loopback
的缩写,wl
、en
、lo
是三种最为常见的网络接口。
lo
是一种虚拟接口,任何送到该地址的数据都会由设备自身接收。
在当前系统中有两个有线网口以及一个无线网卡,是可以跟ip address
的结果呼应上的。
<BROADCAST,MULTICAST,UP,LOWER_UP>
是网络设备的状态标识,BROADCAST
代表设备支持广播,MULTICAST
代表设备支持多播,UP
代表网络接口已启用,LOWER_UP
代表接口已经连接到网络,除此之外,还有一个常见的NO-CARRIER
,它代表接口没有连接到网络。
MTU Maximum Transmission Unit
记录了接口可以传输数据包的最大大小是多少字节,数据包的排队规则由QDisc Queueing Discipline
标明,state
记录当前网口的状态,传输队列的长度由QLen
标明。
link/ether
记录了的物理地址MAC,brd
记录了广播地址,inet
和inet6
分别对应IPv4协议和IPv6协议。
1
2
3
4
5
6
7
8
ip address
1
: lo
2
: enP4p65s0
3
: enP3p49s0
4.
wlP2p33s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
1500
qdisc noqueue state UP group default qlen
1000
link
/
ether
30
:
05
:
05
:
94
:b0:
5b
brd ff:ff:ff:ff:ff:ff
inet
192.168
.
1.33
/
24
brd
192.168
.
1.255
inet6
2409
:
8a3c
:a24:a5b0:
1be3
:
352c
:
6a5f
:b19d
/
64
接口en
和wl
后面的字符串代表接口在PCI中的索引编号,以wlP2p33s0
为例,P2
代表接口设备在2号PCI上,p33
中的33换成16进制就是0x21,代表33号总线,最后的s0
指的是接口设置在PCI的0号插槽上。
1
2
3
4
lspci
/
lspci
-
vvv
0002
:
21
:
00.0
Network controller: Intel Corporation Wi
-
Fi
6E
(
802.11ax
) AX210
/
AX1675
*
2x2
[Typhoon Peak] (rev
1a
)
0003
:
31
:
00.0
Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125
2.5GbE
Controller (rev
05
)
0004
:
41
:
00.0
Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125
2.5GbE
Controller (rev
05
)
内网IP与公网IP
ip address
获得的IP一般都是局域网IP(也被称作是内网IP),与内网IP对应的是公网IP,公网IP指的是网络服务提供商(比如联通或移动)ISP Internet Service Provider
向因特网信息中心INIC Internet Network Information Cetner
申请到公网IP,会将此公网IP分发给设备。
公网IP最大的好处就是允许互联网中其余的设备访问,内网IP就没有这个好处了,内网IP只能被位于同一局域网内的设备访问。
当内网IP需要访问互联网时,会出现无法访问的情况,内网IP无法跨越“结界”工作,这个“结界”就是局域网,局域网环境由路由器提供,ISP会将公网IP分配给路由器,为了让内网IP可以访问互联网,路由器会将内网IP转换成公网IP,进而让局域网中的设备达到访问互联网的目的,因为路由器的公网IP只有一个,所以局域网中的所有设备使用的都是一个公网IP。
1
2
3
4
router <
-
ISP <
-
public network ip address <
-
INIC
router
-
> intranet ip address
-
> devices
devices: want to access public network!
devices
-
> intranet ip
-
> router
-
> public network ip
如果当前设备使用的是内网IP,想要知道对应的公网IP,可以借助一些IP查询网站的帮助,比如cip.cc
或ipinfo.io
等等,通过curl xxx
可以直接获得结果。
ip
命令除了查看网络信息外,还可以修改各种信息,包括但不限于IP地址、子网掩码、广播地址、MAC地址等等。修改MAC地址的功能值得特别关注下,因为MAC地址的唯一性,使得它变成了识别追踪计算机的一个有利特征,通过伪造MAC地址,可以让这种特征不知明显。
1
ip link
set
$device addesss $new_mac_address
域名
IP地址最常见的组合方式就是0 - 255
的10进制数字和点号.
,比如127.0.0.1
,但是数字和.
的组合难免有些难以分辨,为了提高计算机在众多网络设备中的辨识度,计算机允许为IP地址配一个名字,比如855K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0
,它也被称作是域名。
域名到IP地址的映射建立的工作由DNS Domain Name System
负责完成。
域名解析的常见方法
Linux中可以通过resolvectl
、nslookup
、dig
、ping
等命令获取域名的IP地址。
Linux处理DNS解析流程概览
如果通过strace工具追踪nslookup
运行过程中产生的系统调用,会发现nslookup
程序会打开一个名为/etc/resolv.conf
的文件,文件内容中有个很重要的成员nameserver
,它指示DNS的查询服务器是什么。
/etc/resolv.conf
通常都是一个软链接,指向systemd-resolved
服务创建的文件。
systemd-resolved
是Linux上的系统服务,用于给本地端提供域名解析服务,借助命令resolvectl
可以查看systemd-resolved
当前的状态。
1
2
3
4
5
6
7
cat
/
etc
/
resolv.conf
nameserver
127.0
.
0.53
options edns0 trust
-
ad
search .
ls
-
lh
/
etc
/
resolv.conf
/
etc
/
resolv.conf
-
>
/
run
/
systemd
/
resolve
/
stub
-
resolv.conf
systemd-resolved
除了创建stub-resolv.conf
,还创建了resolv.conf
文件,它们的主要区别就在nameserver
上。文件stub-resolv.conf
指向127.0.0.53
,而文件resolv.conf
则指向192.168.1.1
以及fe80::1%4
。
1
2
3
4
cat
/
run
/
systemd
/
resolve
/
resolv.conf
nameserver
192.168
.
1.1
nameserver fe80::
1
%
4
search .
127.0.0.53
对应本地DNS服务器systemd-resolve
。
1
2
sudo ss
-
tlp
LISTEN
0
4096
127.0
.
0.53
%
lo:domain
0.0
.
0.0
:
*
users:((
"systemd-resolve"
,pid
=
12003
,fd
=
15
))
至于192.168.1.1
以及fe80::1%4
则是路由器的保留IP,它们是网关,网关负责局域网与互联网建立链接。
1
2
3
4
ip
-
6
route show
fe80::
/
64
dev wlP2p33s0
ip
-
4
route show
192.168
.
1.0
/
24
dev wlP2p33s0
stub-resolv.conf
和resolv.conf
的区别在于,一个利用systemd-resolve
对DNS进行解析,另一个则利用路由器网关解析DNS。
Linux本地解析DNS的方案
如果通过strace追踪ping
命令,会发现/etc/nsswitch.conf
和/etc/hosts
文件被打开了,nsswitch
的全称是name service switch configuration
,该文件的作用是指示服务搜索信息时的优先级,对于DNS解析来讲,/etc/hosts
的优先级是排在最前面的。
1
2
3
4
cat
/
etc
/
nsswitch.conf
......
hosts: files mymachines dns myhostname
......
/etc/hosts
文件是Linux提供的本地DNS配置文件,在文件中添加ip domain_name
,可以让域名匹配指定的IP地址,更新完/etc/hosts
文件后,可能需要更新下DNS缓存,通过命令resolvectl flush-caches
可以完成缓存的更新,show-cache
选项可以查看缓存。
假如通过ping
命令看一下hahahaha_kukukuku.com
的IP地址,会发现这个域名实际上是不存在的,但修改/etc/hosts
文件并刷新缓存后,就可以ping
通这个奇怪域名了。
1
2
3
4
5
6
7
8
9
设置前:
ping
-
c
1
hahahaha_kukukuku.com
ping: hahahaha_kukukuku.com: Name
or
service
not
known
修改
/
etc
/
hosts:
+
39.156
.
66.14
hahahaha_kukukuku.com
刷新缓存后:
ping
-
c
1
hahahaha_kukukuku.com
PING hahahaha_kukukuku.com (
39.156
.
66.14
)
56
(
84
) bytes of data.
64
bytes
from
hahahaha_kukukuku.com (
39.156
.
66.14
): icmp_seq
=
1
ttl
=
53
time
=
21.2
ms
端口
IP地址对应的计算机可以看作是一个大型商城,商城中有许多的店铺,用户想要买某样东西,就要前往对应的店铺,对于IP地址来讲,它的店铺也被称作是端口。
在计算机中,协议可能会固定占用某个端口,比如https
默认占用端口443,SSH服务默认占用的端口是22。
在Linux当中可以通过命令lsof -i:[port]
查看使用端口的程序以及IP地址是什么。
URL的构成 - 文件路径
URL支持使用UNIX目录xxx/xxx/xxx
的格式访问资源内的子级资源。
比如B站,它是一个知名视频网站,主要功能就给已注册的用户提供观看视频和上传视频的途径,通过URLc36K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6M7r3q4U0k6g2)9J5k6h3u0A6L8r3W2T1K9h3I4A6i4K6u0W2j5$3!0E0
可以访问B站的主页,在主页URL后加上用户ID就可以访问用户主页,在主页URL后加上video
关键字以及视频ID就可以观看视频。
1
2
3
4
5
6
主页的URL:
https:
/
/
space.bilibili.com
UP主的URL:
https:
/
/
space.bilibili.com
/
525929512
视频的URL:
https:
/
/
19fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0A6L8r3W2T1K9h3I4A6i4K6u0W2j5$3!0E0
/
video
/
BV1x54y1z7kb
上面提过URL的子级资源访问与UNIX目录规则类似,显著的特征就是既支持全路径又支持相对路径../
,不过相对URL如何解析成绝对URL是个不太容易处理的事情,最好是要求写成绝对URL避免一些不必要的麻烦。
URL的构成 - 查询字符串
URL中是运行包含参数的,参数的起始标志是问号?
,后面传递的参数以name=value
的形式出现,多个参数之间通过&
连接。
1
?name_1
=
value_1&name_2
=
value_2&...
在下面的示例链接中,URL传递了spm_id_from
和vd_source
两个参数,=
后面是数值。
1
https:
/
/
9feK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0A6L8r3W2T1K9h3I4A6i4K6u0W2j5$3!0E0
/
video
/
BV1EBraYaErK
/
?spm_id_from
=
333.1387
.homepage.video_card.click&vd_source
=
5dda6fee8ab94b9754b6c7b40233960f
URL的构成 - 片段ID
片段ID是一个很少见的元素,服务端可以使用它接收参数,但一般都是客户端在使用它,客户端一般都是用片段ID保存一些临时数据。
最常见的场景就是网页内的定位标志,比如在下面的URL中#
后接了一串字符,这串字符解析成中文就是总结
,通过下面的URL进入网页后,会直接进入网页中的总结
部分,而不是从头开始浏览网页。
1
https:
/
/
blog.xlab.qianxin.com
/
li
-
yong
-
ssh
/
在URL中存在一些保留字符,保留字符拥有着特殊的含义,如果想要直接使用保留字符,那么需要借助%ASCII
,%
是转义开始的标志,%
后面是保留字符对应的ASCII码。
URL的构成 - 身份认证
有些服务端需要验证客户端的身份后,才允许客户端访问资源,携带客户端身份信息的方式有很多种,URL就是其中一种。
在URL中允许放置账户名和账户密码作为身份信息。
1
scheme:
/
/
count:password@domain:port
/
xxx