计算机网络常用知识总结!(二)https://developer.aliyun.com/article/1624410
网关
网关实质上是一个网络通向其他网络的IP地址。
比如有网络A和网络B,网络A的IP地址范围为192.168.1.1~192. 168.1.254
,子网掩码为255.255.255.0
;
网络B的IP地址范围为192.168.2.1~192.168.2.254
,子网掩码为255.255.255.0
。
在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0
)判定两个网络中的主机处在不同的网络里。
而要实现这两个网络之间的通信,则必须通过网关。
如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络B向网络A转发数据包的过程。
「所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。」
❝
那么这个IP地址是哪台机器的IP地址呢?
❞
网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。
Ping
Ping是我们测试网络连接的常用指令。
它利用ICMP报文检测网络连接。
「假设A ping B」
- ping通知系统建立一个固定格式的ICMP请求数据包。
- ICMP协议打包这个数据包和B的IP地址转交给IP协议层
- IP层协议将机器B的IP地址为目的地址,本机的IP地址为源地址,加上一些头部必要的控制信息,构建一个IP数据包
- 获取B的MAC地址,做这个操作首先机器A会判断B是否在同一网段内,若IP层协议通过B的IP地址和自己的子网掩码,发现它跟自己属于同一网络,就直接在本网络查找这台机器的MAC,否则则通过路由器进行类似查找。
❝
接下来是ARP协议根据IP地址查找MAC地址的过程:
❞
- 若两台机器之前有过通信,在机器A的ARP缓存表里应该存有B的IP与其MAC地址的映射关系。
- 若没有,则通过发送ARP请求广播,得到回应的B机器MAC地址,并交给数据链路层
- 数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址是本机的MAC地址,再附加一些必要的控制信息,依据以太网的介质访问规则将他们传送出去
- 机器B收到这个数据帧后,先检查目的地址,和本机MAC地址对比:
符合,接受,接收后检查该数据帧,将IP数据包从帧中提取出来,交给本机的的IP地址协议层协议,IP协议层检查之后,将有用的信息提取给ICMP协议,后者处理,马上构建一个ICMP应答包,发送给A,其过程和主机A发送ICMP请求包到B的过程类似,但不用ARP广播收取A的信息,因为请求包中已经有足够的信息用于B回应A。
若不符合,丢弃。
可以知道PING的过程即一段发送报文和接受确认报文的过程,在来回直接可以计算时延。
DNS
DNS通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
「通俗的讲」,我们更习惯于记住一个网站的名字,www.baidu.com,而不是记住它的ip地址,比如:167.23.10.2
「工作原理」
将主机域名转换为ip地址,属于应用层协议,使用UDP传输。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i7mTzCU4-1651310391027)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]
第一步,客户端向本地DNS服务器发送解析请求
第二步,本地DNS如有相应记录会直接返回结果给客户端,如没有就向DNS根服务器发送请求
第三步,DSN根服务器接收到请求,返回给本地服务器一个所查询域的主域名服务器的地址
第四步,本地dns服务器再向返回的主域名服务器地址发送查询请求
第五步,主域名服务器如有记录就返回结果,没有的话返回相关的下级域名服务器地址
第六步,本地DNS服务器继续向接收到的地址进行查询请求
第七步,下级域名服务器有相应记录,返回结果
第八步,本地dns服务器将收到的返回地址发给客户端,同时写入自己的缓存,以便下次查询
DNS域名查询实际上就是个不断递归查询的过程,直到查找到相应结果,需要注意的时,当找不到相应记录,会返回空结果,而不是超时信息
DNS记录
❝
A记录
❞
定义www.example.com的ip地址 www.example.com. IN A 139.18.28.5;
上面的就是一条 DNS 记录,纯文本即可。
www.example.com
是要解析的域名。
A 是记录的类型,A 记录代表着这是一条用于解析 IPv4 地址的记录。
从这条记录可知,www.example.com
的 IP 地址是 139.18.28.5。
❝
CNAME
❞
CNAME用于定义域名的别名,如下面这条 DNS 记录:
定义www.example.com的别名 a.example.com. IN CNAME b.example.com.
这条 DNS 记录定义了 a.example.com
是 b.example.com
的别名。
用户在浏览器中输入 a.example.com
时候,通过 DNS 查询会知道 a.example.com
是 b.example.com
的别名,因此需要实际 IP 的时候,会去拿 b.example.com
的 A 记录。
当你想把一个网站迁移到新域名,旧域名仍然保留的时候;还有当你想将自己的静态资源放到 CDN 上的时候,CNAME 就非常有用。
❝
AAAA 记录
❞
A 记录是域名和 IPv4 地址的映射关系。和 A 记录类似,AAAA 记录则是域名和 IPv6 地址的映射关系。
❝
MX记录
❞
MX 记录是邮件记录,用来描述邮件服务器的域名。
在工作中,我们经常会发邮件到某个同事的邮箱。
比如说,发送一封邮件到 xiaoming@xiaoflyfish.com
,那么如何知道哪个 IP 地址是邮件服务器呢?
这个时候就可以用到下面这条 MX 记录:
IN MX mail.xiaoflyfish.com
mail.xiaoflyfish.com
的 IP 地址可以通过查询 mail.xiaoflyfishcom
的 A 记录和 AAAA 记录获得。
❝
NS 记录
❞
NS记录是描述 DNS 服务器网址。从 DNS 的存储结构上说,Name Server 中含有权威 DNS 服务的目录。
也就是说,NS 记录指定哪台 Server 是回答 DNS 查询的权威域名服务器。
当一个 DNS 查询看到 NS 记录的时候,会再去 NS 记录配置的 DNS 服务器查询,得到最终的记录。如下面这个例子:
a.com. IN NS ns1.a.com. a.com. IN NS ns2.a.com.
当解析 a.com
地址时,我们看到 a.com
有两个 NS 记录,所以确定最终 a.com
的记录在 ns1.a.com
和 ns2.a.com
上。
从设计上看,ns1 和 ns2 是网站 a.com
提供的智能 DNS 服务器,可以提供负载均衡、分布式 Sharding 等服务。
比如当一个北京的用户想要访问 a.com
的时候,ns1 看到这是一个北京的 IP 就返回一个离北京最近的机房 IP。
上面代码中 a.com
配置了两个 NS 记录。
通常 NS 不会只有一个,这是为了保证高可用,一个挂了另一个还能继续服务。
通常数字小的 NS 记录优先级更高,也就是 ns1 会优先于 ns2 响应。
配置了上面的 NS 记录后,如果还配置了 a.com
的 A 记录,那么这个 A 记录会被 NS 记录覆盖。
ARP协议
ARP即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。
「ARP协议的工作过程」
首先,每个主机都会有自己的ARP缓存区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系
当源主机要发送数据时,首先检测ARP列表中是否对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包
当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果存在,则覆盖然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址
源主机收到ARP响应包后,将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据,如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
数字签名
网络传输过程中需要经过很多中间节点,虽然数据无法被解密,但可能被篡改
数字签名校验数据的完整性
「数字签名有两种功效」:
- 能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。
- 数字签名能确定消息的完整性,证明数据是否未被篡改过。
将一段文本先用Hash函数生成消息摘要,然后用发送者的私钥加密生成数字签名,与原文文一起传送给接收者
接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与上一步得到的摘要信息对比。
如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
SQL注入
SQL注入的原理是将SQL代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法。
「SQL注入攻击实例」
比如,在一个登录界面,要求输入用户名和密码,可以这样输入实现免帐号登录:
用户名: ‘or 1 = 1 -- 密 码:
用户一旦点击登录,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了。
下面我们分析一下:从理论上说,后台认证程序中会有如下的SQL语句:
String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”;
因此,当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username=’’or 1 = 1 –- and password=’’
分析上述SQL语句我们知道,username=‘ or 1=1
这个语句一定会成功;然后后面加两个 -
,这意味着注释,它将后面的语句注释,让他们不起作用,这样,上述语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
「应对方法」
❝
预编译
❞
使用预编译手段,绑定参数是最好的防SQL注入的方法。
目前许多的ORM框架及JDBC等都实现了SQL预编译和参数绑定功能,攻击者的恶意SQL会被当做SQL的参数而不是SQL命令被执行。
在mybatis的mapper文件中,对于传递的参数我们一般是使用 # 和$
来获取参数值。
当使用#时,变量是占位符,就是一般我们使用java的jdbc的PrepareStatement时的占位符,所有可以防止sql注入;
当使用$
时,变量就是直接追加在sql中,一般会有sql注入问题。
❝
使用正则表达式过滤传入的参数
❞
❝
过滤参数中含有的一些数据库关键词
❞
加密算法
加密算法分**「对称加密」** 和 「非对称加密」,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同,此外,还有一类不需要密钥的**「散列算法」**。
常见的 「对称加密」 算法主要有 DES
、3DES
、AES
等,常见的 「非对称算法」 主要有 RSA
、DSA
等,「散列算法」 主要有 SHA-1
、MD5
等。
对称加密
在 「对称加密算法」 中,使用的密钥只有一个,发送和接收双方都使用这个密钥对数据进行 「加密」 和 「解密」。
- 数据加密过程:在对称加密算法中,数据发送方 将 「明文」 (原始数据) 和 「加密密钥」 一起经过特殊 「加密处理」,生成复杂的 「加密密文」 进行发送。
- 数据解密过程:「数据接收方」 收到密文后,若想读取原数据,则需要使用 「加密使用的密钥」 及相同算法的 「逆算法」 对加密的密文进行解密,才能使其恢复成 「可读明文」。
非对称加密
「非对称加密算法」,它需要两个密钥,一个称为 「公开密钥」 (public key
),即 「公钥」,另一个称为 「私有密钥」 (private key
),即 「私钥」。
因为 「加密」 和 「解密」 使用的是两个不同的密钥,所以这种算法称为 「非对称加密算法」。
- 如果使用 「公钥」 对数据 「进行加密」,只有用对应的 「私钥」 才能 「进行解密」。
- 如果使用 「私钥」 对数据 「进行加密」,只有用对应的 「公钥」 才能 「进行解密」。
「例子」:甲方生成 「一对密钥」 并将其中的一把作为 「公钥」 向其它人公开,得到该公钥的 「乙方」 使用该密钥对机密信息 「进行加密」 后再发送给甲方,甲方再使用自己保存的另一把 「专用密钥」 (「私钥」),对 「加密」 后的信息 「进行解密」。
网络攻击
CSRF和XSS
「XSS:」
跨站脚本是一种网站应用程序的安全漏洞攻击,是代码注入的一种。
它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响,这类攻击通常包含了HTML以及用户端脚本语言。
比如通过客户端脚本语言(最常见如:JavaScript)
在一个论坛发帖中发布一段恶意的JavaScript代码就是脚本注入,如果这个代码内容有请求外部服务器,那么就叫做XSS
「XSS攻击分类」
❝
反射性XSS攻击 (非持久性XSS攻击)
❞
例如,正常发送消息:
http://www.test.com/message.php?send=Hello,World!
接收者将会接收信息并显示HelloWorld;但是,非正常发送消息:
http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>!
接收者接收消息显示的时候将会弹出警告窗口!
❝
持久性XSS攻击 (留言板场景)
❞
一般指XSS攻击代码存储在网站数据库,当一个页面被用户打开的时候执行。
也就是说,每当用户使用浏览器打开指定页面时,脚本便执行。
与非持久性XSS攻击相比,持久性XSS攻击危害性更大。
从名字就可以了解到,持久性XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。
例如,留言板表单中的表单域:
<input type="text" name="content" value="这里是用户填写的数据">
正常操作流程是:用户是提交相应留言信息 — 将数据存储到数据库 — 其他用户访问留言板,应用去数据并显示;
而非正常操作流程是攻击者在value填写:
<script>alert(‘foolish!’);</script> <!--或者html其他标签(破坏样式。。。)、一段攻击型代码-->
并将数据提交、存储到数据库中;当其他用户取出数据显示的时候,将会执行这些攻击性代码
「CSRF:」
跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
比如冒充用户发起请求(在用户不知情的情况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)。
DOS攻击
DOS:中文名称是拒绝服务,该攻击的效果是使得计算机或网络无法提供正常的服务
「DOS攻击的原理:」
首先攻击者向被攻击的服务器发送大量的虚假IP请求,被攻击者在收到请求后返回确认信息,等待攻击者进行确认,该过程需要TCP的三次握手,由于攻击者发送的请求信息是虚假的,所以服务器接收不到返回的确认信息,在一段时间内服务器会处与等待状态,而分配给这次请求的资源却被有被释放
当被攻击者等待一定的时间后,会因连接超时而断开,这时攻击者在次发送新的虚假信息请求,这样最终服务器资源被耗尽,直到瘫痪
「DDOS:中文名称是分布式拒绝服务攻击」
指的是攻击者控制多台主机同时向同一主机或网络发起DOS
攻击
DRDoS分布反射式拒绝服务攻击这是DDoS
攻击的变形
「DDOS究竟如何攻击」
目前最流行也是最好用的攻击方法就是使用SYN-Flood
进行攻击,SYN-Flood也就是SYN洪水攻击
SYN-Flood不会完成TCP三次握手的第三步,也就是不发送确认连接的信息给服务器,这样,服务器无法完成第三次握手,但服务器不会立即放弃,服务器会不停的重试并等待一定的时间后放弃这个未完成的连接,这段时间叫做SYN timeout
,这段时间大约30秒-2分钟左右。
若是一个用户在连接时出现问题导致服务器的一个线程等待1分钟并不是什么大不了的问题,但是若有人用特殊的软件大量模拟这种情况,那后果就可想而知了。一个服务器若是处理这些大量的半连接信息而消耗大量的系统资源和网络带宽,这样服务器就不会再有空余去处理普通用户的正常请求(因为客户的正常请求比率很小),这样这个服务器就无法工作了,这种攻击就叫做SYN-Flood
攻击
到目前为止,进行DDoS攻击的防御还是比较困难的
首先,这种攻击的特点是它利用了TCP/IP协议的漏洞,除非你不用TCP/IP,才有可能完全抵御住DDoS攻击
不过这不等于我们就没有办法阻挡DDoS攻击,我们可以尽力来减少DDoS的攻击
「下面就是一些防御方法:」
- 关闭不必要的服务
- 限制同时打开的SYN半连接数目
- 缩短SYN半连接的time out 时间
- 正确设置防火墙
- 禁止对主机的非开放服务的访问
- 限制特定IP地址的访问
- 启用防火墙的防DDoS的属性
Cookie和Session
Session 是**「基于Cookie 实现」**的另一种记录服务端和客户端会话状态的机制。
Session 是存储在服务端,而 SessionId 会被存储在客户端的 Cookie 中。
Session 的**「认证过程」**:
- 客户端第一次发送请求到服务端,服务端根据信息创建对应的 Session,并在响应头返回 SessionID
- 客户端接收到服务端返回的 SessionID 后,会将此信息存储在 Cookie 上,同时会记录这个 SessionID 属于哪个域名
- 当客户端再次访问服务端时,请求会自动判断该域名下是否存在 Cookie 信息,如果有则发送给服务端,服务端会从 Cookie 中拿到 SessionID,再根据 SessionID 找到对应的 Session,如果有对应的 Session 则通过,继续执行请求,否则就中断
「Cookie和Session的区别」
- 安全性,因为 Cookie 可以通过客户端修改,而 Session 只能在服务端设置,所以安全性比 Cookie 高,一般会用于验证用户登录状态
- 适用性,Cookie 只能存储字符串数据,而 Session 可以存储任意类型数据
- 有效期,Cookie 可以设置任意时间有效,而 Session 一般失效时间短
常见面试题
「在浏览器地址栏键入URL」
1.DNS解析:浏览器会依据URL逐层查询DNS服务器缓存,解析URL中的域名对应的IP地址,DNS缓存从近到远依次是浏览器缓存、系统缓存、路由器缓存、IPS服务器缓存、域名服务器缓存、顶级域名服务器缓存。
从哪个缓存找到对应的IP直接返回,不再查询后面的缓存。
2.TCP连接:结合三次握手
3.发送HTTP请求:浏览器发出读取文件的HTTP请求,该请求发送给服务器
4.服务器处理请求并返回HTTP报文:服务器对浏览器请求做出响应,把对应的带有HTML文本的HTTP响应报文发送给浏览器
5.浏览器解析渲染页面
6.连接结束:浏览器释放TCP连接,该步骤即四次挥手。
第5步和第6步可以认为是同时发生的,哪一步在前没有特别的要求