常见的网络访问标志 – 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中,一般会放在正常协议的前面。
|
1
|
fake_scheme:shceme://xxx |
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 address1: lo2: enP4p65s03: enP3p49s04. 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 -vvv0002: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 <- INICrouter -> 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地址配一个名字,比如http://www.baidu.com,它也被称作是域名。
域名到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.confnameserver 127.0.0.53options edns0 trust-adsearch .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.confnameserver 192.168.1.1nameserver fe80::1%4search . |
127.0.0.53对应本地DNS服务器systemd-resolve。
|
1
2
|
sudo ss -tlpLISTEN 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 showfe80::/64 dev wlP2p33s0ip -4 route show192.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.comping: hahahaha_kukukuku.com: Name or service not known修改/etc/hosts:+ 39.156.66.14 hahahaha_kukukuku.com刷新缓存后:ping -c 1 hahahaha_kukukuku.comPING 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站,它是一个知名视频网站,主要功能就给已注册的用户提供观看视频和上传视频的途径,通过URLhttps://space.bilibili.com可以访问B站的主页,在主页URL后加上用户ID就可以访问用户主页,在主页URL后加上video关键字以及视频ID就可以观看视频。
|
1
2
3
4
5
6
|
主页的URL:https://space.bilibili.comUP主的URL:https://space.bilibili.com/525929512视频的URL:https://http://www.bilibili.com/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://http://www.bilibili.com/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/#%E6%80%BB%E7%BB%93 |
在URL中存在一些保留字符,保留字符拥有着特殊的含义,如果想要直接使用保留字符,那么需要借助%ASCII,%是转义开始的标志,%后面是保留字符对应的ASCII码。
URL的构成 – 身份认证
有些服务端需要验证客户端的身份后,才允许客户端访问资源,携带客户端身份信息的方式有很多种,URL就是其中一种。
在URL中允许放置账户名和账户密码作为身份信息。
|
1
|
scheme://count:password@domain:port/xxx |