HTTPS原理
HTTPS(Hypertext Transfer Protocol Secure)是一种安全的通信协议,它基于HTTP协议,在数据传输过程中使用了加密技术来保护通信的安全性和完整性。HTTPS的工作原理主要包括以下几个步骤:
-
客户端发起HTTPS请求:客户端(如Web浏览器)向服务器发送一个HTTPS请求。
-
服务器获取证书:服务器收到请求后,会将自己的证书发送给客户端。证书中包含了服务器公钥、服务器的身份信息以及证书的签发机构等信息。
-
客户端验证证书:客户端在收到服务器的证书后,会对证书进行验证。验证过程包括检查证书的有效期、签名是否有效以及证书是否由可信任的证书颁发机构签发等。
-
客户端生成会话密钥:如果证书验证通过,客户端会生成一个随机的会话密钥,用于后续的数据加密和解密。
-
客户端使用服务器公钥加密会话密钥:客户端使用服务器的公钥对会话密钥进行加密,并将加密后的会话密钥发送给服务器。
-
服务器使用私钥解密会话密钥:服务器收到加密的会话密钥后,使用自己的私钥进行解密,得到原始的会话密钥。
-
数据传输:客户端和服务器使用会话密钥对数据进行加密和解密,保证数据在传输过程中的安全性。
通过以上步骤,HTTPS协议可以确保通信过程中的数据安全性和完整性。加密技术的使用可以防止数据被窃取或篡改,同时证书的验证可以确保服务器的身份可信。这使得HTTPS成为了保护用户隐私和防止网络攻击的重要协议。
DNS原理
DNS(Domain Name System)是互联网中用于将域名转换为 IP 地址的系统。它的工作原理可以简单地分为以下几个步骤:
-
用户发起域名解析请求:当用户在浏览器中输入一个域名时(如www.example.com),浏览器会向本地计算机的 DNS 客户端发送一个 DNS 查询请求。
-
本地 DNS 客户端查询本地缓存:本地 DNS 客户端首先会查询本地缓存,看是否已经存储了该域名的 IP 地址。如果有,就直接返回给用户。
-
本地 DNS 客户端查询根域名服务器:如果本地缓存中没有该域名的 IP 地址,本地 DNS 客户端会向根域名服务器发送查询请求。根域名服务器是全球 DNS 系统的顶级服务器,负责管理顶级域名(如.com、.org等)的 DNS 服务器地址。
-
根域名服务器返回顶级域名服务器地址:根域名服务器会将负责该顶级域名的顶级域名服务器的地址返回给本地 DNS 客户端。
-
本地 DNS 客户端查询顶级域名服务器:本地 DNS 客户端会向负责该顶级域名的顶级域名服务器发送查询请求。
-
顶级域名服务器返回权威域名服务器地址:顶级域名服务器会将负责该域名的权威域名服务器的地址返回给本地 DNS 客户端。
-
本地 DNS 客户端查询权威域名服务器:本地 DNS 客户端会向负责该域名的权威域名服务器发送查询请求。
-
权威域名服务器返回域名对应的 IP 地址:权威域名服务器会将该域名对应的 IP 地址返回给本地 DNS 客户端。
-
本地 DNS 客户端将 IP 地址返回给用户:本地 DNS 客户端收到 IP 地址后,将其返回给用户的浏览器。
-
用户的浏览器发起连接请求:用户的浏览器使用获取到的 IP 地址,向对应的服务器发起连接请求,建立与服务器的通信。
通过以上步骤,DNS 实现了将用户输入的域名转换为对应的 IP 地址,从而使得用户能够通过域名访问到对应的网站或服务。DNS 的分布式设计和缓存机制可以提高解析效率和网络性能。
正则表达式
正则表达式
是表达文本模式的方法。
-
.
:匹配任何单个字符。 -
?
:上一项是可选的,最多匹配一次。 -
*
:前一项将被匹配零次或多次。 -
+
:前一项将被匹配一次或多次。 -
{N}
:上一项完全匹配N次。 -
{N,}
:前一项匹配N次或多次。 -
{N,M}
:前一项至少匹配N次,但不超过M次。 -
--
:表示范围,如果它不是列表中的第一个或最后一个,也不是列表中某个范围的终点。 -
^
:匹配行首的空字符串;也代表不在列表范围内的字符。 -
$
:匹配行尾的空字符串。 -
\b
:匹配单词边缘的空字符串。 -
\B
:匹配空字符串,前提是它不在单词的边缘。 -
\<
:匹配单词开头的空字符串。 -
\>
:匹配单词末尾的空字符串。
\d | 匹配一个数字字符。等价于[0-9]。 |
---|---|
\D | 匹配一个非数字字符。 |
\f | 匹配一个换页符。 |
\n | 匹配一个换行符。 |
\r | 匹配一个回车符。 |
\s | 匹配任何不可见字符,包括空格、制表符、换页符等等。 |
\S | 匹配任何可见字符。 |
\t | 匹配一个制表符。 |
\v | 匹配一个垂直制表符。 |
\w | 匹配包括下划线的任何单词字符。类似但不等价于"[A-Za-z0-9_]", |
\W | 匹配任何非单词字符。 |
元字符
元字符
是表示特殊函数的字符,包括以下这些^ $ . [ ] { } - ? * + ( ) | \\
。除了元字符,其他字符在正则表达式中,都表示原来的含义。
-
.
匹配任意字符,但不含空字符 -
^
匹配文本行开头 -
$
匹配文本行结尾
$ grep -h '.zip' dirlist*.txt
上面命令在文件中查找包含正则表达式".zip"的文本行。注意,上面命令不会匹配zip
程序,因为zip
只有三个字符,而.zip
要求四个字符。
$ grep -h '^zip' dirlist*.txt
$ grep -h 'zip$' dirlist*.txt
上面命令分别在文件列表中搜索行首,行尾以及行首和行尾同时包含字符串"zip"(例如,zip 独占一行)的匹配行。 注意正则表达式'^$'(行首和行尾之间没有字符)会匹配空行。
方括号
方括号之中的字符,表示可以任意匹配其中的一个。
$ grep -h '[bg]zip' dirlist*.txt
上面命令匹配包含字符串"bzip"或者"gzip"的任意行。
注意,元字符放入方括号之中,会失去其特殊含义。但有两种情况除外,^
在方括号的开头,表示否定,否则只是一个普通字符,表示原义。
$ grep -h '[^bg]zip' dirlist*.txt
上面命令匹配不以b
或g
开头的zip
字符串。注意,上面命令不会匹配zip
,因为一个否定的字符集仍然要求存在一个字符。
-
在方括号之中表示一个字符区域。
$ grep -h '^[A-Z]' dirlist*.txt
上面命令匹配所有以大写字母开头的文本行。类似的,^[A-Za-z0-9]
表示以大写字母、小写字母、数字开头的文本行。
注意,连字号如果不构成一个字符区域,则表示其本来的含义。
$ grep -h '[-AZ]' dirlist*.txt
上面命令匹配包含一个连字符,或一个大写字母"A",或一个大写字母"Z"的文件名。
预定义字符类
由于locale
设置不同,Shell展开正则表达式[A-Z]
时,可能不是解释为所有大写字母,而是解释为包括所有字母的字典顺序。
$ ls /usr/sbin/[A-Z]*
上面命令在某些发行版里面,会返回所有大写字母或小写字母开头的文件。
为了避免这个问题,可以使用正则表达式的预定义字符类。
-
[:alnum:]
字母数字字符。在 ASCII 中,等价于:[A-Za-z0-9]
-
[:word:]
与[:alnum:]
相同, 但增加了下划线字符。 -
[:alpha:]
字母字符。在 ASCII 中,等价于[A-Za-z]
-
[:blank:]
包含空格和 tab 字符。 -
[:cntrl:]
ASCII 的控制码。包含了0到31,和127的 ASCII 字符。 -
[:digit:]
数字0到9 -
[:graph:]
可视字符。在 ASCII 中,它包含33到126的字符。 -
[:lower:]
小写字母。 -
[:punct:]
标点符号字符。 -
[:print:]
可打印的字符。等于[:graph:]
中的所有字符,再加上空格字符。 -
[:space:]
空白字符,包括空格,tab,回车,换行,vertical tab, 和 form feed.在 ASCII 中, 等价于[ \t\r\n\v\f]
-
[:upper:]
大写字母。 -
[:xdigit:]
用来表示十六进制数字的字符。在 ASCII 中,等价于[0-9A-Fa-f]
$ ls /usr/sbin/[[:upper:]]*
上面命令返回所有大写字母开头的文件名。
选择
|
表示匹配一系列字符串之中的一个。注意与方括号区分,方括号表示匹配一系列字符之中的一个。
$ echo "AAA" | grep -E 'AAA|BBB'
AAA
$ echo "BBB" | grep -E 'AAA|BBB'
BBB
$ echo "CCC" | grep -E 'AAA|BBB'
$
上面代码中,AAA|BBB
表示匹配字符串AAA
或者是字符串BBB
。grep
程序使用-E
参数,表示按照正则表达式规则匹配。并且,这个正则表达式放在单引号之中,为的是阻止Shell把|
解释为管道操作符。
|
可以多个连用,也可以与其他正则规则结合使用。
$ echo "AAA" | grep -E 'AAA|BBB|CCC'
$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
量词操作符
量词操作符表示一个元素被匹配的次数。
-
?
匹配前面的元素出现0次或1次 -
*
匹配前面的元素出现0次或多次 -
+
匹配前面的元素出现1次或多次 -
{n}
匹配前面的元素出现了n
次 -
{n,m}
匹配前面的元素它至少出现了n
次,但是不多于m
次 -
{n,}
匹配前面的元素至少出现了n
次 -
{,m}
匹配前面的元素,如果它出现的次数不多于 m 次。