导图社区 计算机网络
计算机网络大厂面试题,适合有一定基础的人阅读,适合求职者按照大纲进行模拟面试,内容全面,深度广度均合适
编辑于2022-04-01 11:49:24计算机网络
应用层
HTTP 协议
超文本传输协议
常见状态码
2xx:成功
「200 OK」:成功
「204 No Content」:成功,但没有 body 信息
3xx:重定向
「301 Moved Permanently」:永久重定向
「302 Moved Permanently」:临时重定向
「304 Not Modified」:缓存未过期
Location 字段指示要跳转的 URL
4xx:请求报文错误
「400 Bad Request」:表示客户端请求错误
「403 Forbidden」:表示访问资源被禁止
「404 Not Found」
5xx:服务器出错
「500 Internal Server Error」:服务器错误
「502 Bad Gateway」:网关错误
「503 Service Unavailable」:服务器繁忙
Connection: Keep-Alive
表示开启 TCP 长连接
HTTP/1.0 默认是关闭的,一个请求一次连接,而 1.1 是 打开的,除非显示指定 Connection: close
一次请求结束标志
静态数据
Content-Length 字段
动态数据
Transfer-Encoding:chunk模式
服务器将数据分块发送
当读取的块大小为 0 时表示终止
何时关闭通常是由服务器决定的
Session & Cookie
Session 存放于服务器中,保存客户状态
Cookie 存放在游览器缓存中,Cookie 中保存了 SessionId 和其他信息,可以通过此 ID 获取对应 Session
CSRF 跨域攻击,Cookie 的漏洞
浏览器发起请求时,将自动携带目标站点的 cookie
Referer 字段
使用 Token,将 Token 放在消息体内或对 Token 用 MAC 加密
DNS 协议
端口号:80
通过域名搜索 IP 地址
从根域名服务器开始
递归法
迭代法
本地域名服务器缓存
host 文件
下层协议
在主备时区域传送中使用 UDP
其他时候使用 TCP
DHCP 协议
动态分配 IP,每个 IP 都有租聘期限
DHCP 服务器端口 67,客户端口 68,使用 UDP 传输
DHCP 服务器通常被放置在路由器中
客户端广播 DHCP 报文,DHCP 服务器接收报文,并分配 IP 地址给指定 MAC 的客户端
客户端发送 ACK 确认,通常只确认第一个收到的 "offer"
传输层
TCP 协议
在不可靠的互联网络上提供可靠的端到端字节流传输
TPC 报文格式
源端口 16bit,目的端口 16bit
序号 32bit
确认号 32bit
数据偏移 4bit
等价于 TCP 的首部长度
保留位 3bit
标志位 9bit
其中 6bit 较为常用
URG 表示紧急指针有效
ACK 表示确认序号有效
PSH 表示接收方应尽快交付不必等待缓冲区满
RST 表示出现差错,需要重新创建 TCP 连接
SYN 表示连接请求
FIN 表示断开请求
窗口大小 16bit
指示接收方缓存窗口大小,发送方发送字节不得大于此窗口
校验和 16bit
反码加算法
紧急指针 16bit
指向紧急数据的最后一个字节
流量控制:滑动窗口
维护发送方发送速率和接收方处理速率的一致性
发送方发送窗口不得大于接收方缓存窗口
发送方前沿指针不建议收缩
1 字节报文探测
接收方窗口大小为 0,启动计时器,到期后发送探测报文
一定次数后将断开连接
可靠性保证:超时重传
超时时间计算
依赖历史平均 RTT
依赖样本 RTT 之间的偏差值(网络波动)
回退 N 步(GBN)
抛弃已发送的数据,从超时的字节流重新发送
简单但效率差
选择重传(SR)
双方协商好要重传的字节流
通过 TCP 紧急数据完成
RFC 并没有一个标准的协议
性能提高不大,而且麻烦
糊涂窗口综合症
数据部分大小非常小,但数量多,首部长度反而大 于数据长度,网路利用率差,网络上存在大量数据包而过载
发送端
发送方产生数据过慢引起
Nagle 算法
数据长度达到 MSS(最大报文长度)则允许发送
如果没有未确认的数据(非 MSS 长度),则允许发送
触发超时机制,立即发送对于数据包
使用 TCP_NODELAY 禁用 Nagle
游戏卡顿下降
服务段
接收方处理数据过慢,导致窗口过小
延迟确认
收到后并不立即确认,而是等窗口大小足够大时一并确认
Clark 算法
当窗口过小时,对发送方通报窗口大小为 0
选择重传(SACK)
允许接收方主动选择确认最后一个失序的报文
接收方可以跳过那些已经按序达到的字节
立即重传
收到 3 次冗余 ACK 时
有理由相信已经丢失,不必等待超时计时器
不一定要为每个报文维护一个定时器
成本过高
可以共有一个定时器
拥塞控制
维护一个拥塞窗口 cwnd,表示这是上一次发送 拥塞时的窗口大小,通常以 MSS 作为单位,同 时维护一个阈值 ssthresh 表示上一次拥塞时窗 口大小的一半
当超时发生时,则认为发生拥塞
慢启动
乘法增大,每收到一个 ACK 则将拥塞窗口增加一个 MSS
当超时发生时,记录阈值,重新进入慢启动试探阈值
当达到阈值时转向拥塞避免,因为下一次乘法增大很可能就会拥塞
拥塞避免
加法增大
当超时发生时,记录阈值,重新进入慢启动试探阈值
快速重传
当收到 3 次冗余 ACK 时触发
虽然超时了,但网络肯定没有那么差
乘法减半
当冗余 ACK 数据重传完成时,进入拥塞避免
连接管理
三次握手
半连接队列
服务器收到客户端第一次握手连接时,会将 TCP 连接加入半连接队列
半连接队列保存 TCP 连接,用以验证第三次握手是否合法
如果半连接队列已满,服务器会拒绝连接
SYN 泛洪攻击
恶意发起大量 TCP 连接但不确认,使半连接队列占满
SYN Cookie
不使用队列保存 TCP 信息
使用一种哈希算法将 TCP 信息映射为某个哈希值
将此哈希值作为 TCP 起始序号,服务器不需要保存 此序号,通过下一次客户端的 ACK 即可获取此序号
全连接队列
三次握手完成时 TCP 连接会被放入全连接队列
当全连接已满时可能会发送 RST 回复表示重新建立连接
为什么不能两次握手
迷失在网络中的 SYN 包可能在此到达
四次挥手
Time-Wait
客户端发送第四次 ACK 后需要等待 2MS
可靠的终止连接,防止 ACK 包丢失
服务器也应该要有保活机制
保证让迟来的TCP报文有足够的时间被识别并丢弃
如果没有此机制,客户端可能会在同 IP、端口下重新建立 TCP 连接,上一次迷失的 TCP 报文就可能会干扰本次通信
Time-Wait 占用过多端口
端口重用
允许重用端口开启新的 TCP 连接
快速回收
减少 Time-Wait 等待时间
Linux /etc/sysctl.conf 下进行配置
可配置 SYN Cookie、重用、 修改 Time-Wait 时间等
粘包拆包
粘包
TCP 是无消息边界限定的,两条消息可能会合并成一个数据报发送
例如 Nagle 算法
发送方因消息过短而等待更多消息合并发送
接收方因处理消息过慢而导致后一条消息粘在前一条消息上
拆包
一条消息因为过长而导致拆包多次发送
统一解决办法
应用层通信协议中定义消息体长度
或者固定每个消息的长度
以特殊字符作为开始或结尾
UDP 协议
不可靠的,没有重传机制
无连接的,不需要握手挥手,节省时间
无状态的,不需要维护任何关于连接的信息,如缓存、拥塞控制参数等,成本低
UDP 数据报将会立即发送(无缓存)
首部开销小,仅需 8 字节
UDP 消息长度在首部被标识,UDP 消息体长度是受限的
长数据不能采用 UDP
计算机网络安全
报文机密性
对称加密
块密码
维护一组块映射表,将明文分块,对每个块进行加密解密
使用小型函数和置乱函数模拟输入输出表,每个函数都需要一个块和 k 位密匙入参
可以重复使用函数和置乱函数进行多轮计算,每一轮函数可有切割的子密匙生成
双方必须持有一个加密密匙和一个解密密匙
DES、AES 的做法
DES 的密匙为 56 位,很容易被破解,已经淘汰
非对称加密
通信实体各有一个私匙和一个公匙
发送时用对方的公匙加密
接收时用自己的私匙解密
RSA 算法
(m^e % n)^d % n = (m^d % n)^e % n
e、d 可作为私匙和公匙
选定 P、Q 两个大素数,n = P × Q,Z = (P - 1) × (Q - 1)
令 e < n 且 e 与 n 互质
(e × d) % Z = 1
安全性依赖于目前没有一个已知的算法可以快速对一个大数进行因数分解
不可信的公匙
中间人攻击
CA 数字证书
CA 为每个注册的实体颁发证书,证书上有实体的具体信息
CA 用自己的私匙对证书进行加密,防止证书伪造
CA 必须是可信赖的
报文完整性
报文鉴别码(摘要) MAC
对报文进行散列,生成一段长度固定的摘要
摘要附加在报文后被加密
攻击者可以替换报文并同时替换摘要,然后用自己的公匙加密
需要一个 MAC 密匙,将密匙附加在报文后进行摘要计算
MD5 算法
MD5码以512位分组来处理输入的信息,且每一分组又被划分为4个128位子分组,分别与 4 个 32 位幻数进行运算,输出 4 个 32 位数,继续进行下一轮运算,算法的输出最终由4个32位分组组成,将这四个32位分组级联后将生成一个128位散列值
MD5 已经不安全了,取而代之的是 SHA-1、SHA-2 函数,算法思想其实是类似的
端点鉴别
数字签名
非对称加密的产物
使用自己的私匙进行加密,只有自己的公匙可以解密
常见的网络攻击
SYN 泛洪攻击
重排序攻击
劫持 TCP 报文,打乱 TCP 首部的序号
解决方案
在数据中继续定义序号
ARP 地址欺骗
冒充网关
向局域网内广播 ARP 请求,主机收到后会更新自己的 MAC 地址表,将黑客作为自己的网关
冒充主机
攻击者可以劫持 ARP 请求并假装自己作为主机发送 ARP 回复
双向欺骗
攻击者可以既冒充网关又冒充中间人,这样攻击者将劫持局域网内所有的流量
解决方案
嗅探ARP 包,网关嗅探是否有突然冒出的 ARP 请求
在 DHCP 注册 IP 时,记录对应的 MAC 地址
配置静态路由
DNS 欺骗
劫持 DNS 请求,返回一个错误的域名顶替掉原先的网站
例如银行网站被替换,替换的网站和正规网站"一模一样"
风险极高
劫持 DNS 请求
黑掉域名服务器,名正言顺“上位”
难度很大,可以不考虑
冲当中间人,劫持请求
ARP 欺骗
最常见的入侵方式
解决方案
防范 ARP 欺骗
定期检查 HOST 文件
使用 IP 而非域名
使用 HTTPS,检查域名服务器证书及其数字签名
重放攻击
将消息劫持,一段时间后原封不动的发送
这很危险,例如银行对此扣钱
解决方案
加随机数
加时间戳
加版本号(序号)
一次性口令
口令会过期,消息只在口令有效期内有用
中间人攻击
劫持客户端与服务器的 TCP 数据报,并将服务器的公匙替换成自己的公匙
CA 证书很重要
HTTPS 协议
在 HTTP 的基础上使用 TLS 或 SSL 对通信进行加密
握手阶段
1、客户端明文发送它支持的加密算法,和一个客户端的不重数
防止重放攻击
不必担心报文被修改
MAC 报文摘要
2、服务器选择一个非对称加密算法、对称加密算法和一个 MAC 算法,将这些算法连通服务器的不重数作为整体,对其签名,发送给客户端
3、服务器发送由 CA 颁发的证书给客户端
4、服务器生成一个 ECDH 密匙,利用该密匙生成一个服务器 PMS 前主密匙,然后明文发送给客户端
5、客户端利生成一个 ECDH 密匙,利用该密匙生成一个客户端 PMS 前主密匙,然后用从 CA 中提取的服务器的公匙进行加密,发送给服务器
6、客户端利用自己的 ECDH 密匙,对服务器发送的前主密匙进行解密,将解密后的结果进行切分,得到四个密匙:客户端和服务器的对称加密密匙和 MAC 密匙
7、服务器利用自己的 ECDH 密匙,对客户端发送的前主密匙进行解密,将解密后的结果进行切分,得到四个密匙:客户端和服务器的对称加密密匙和 MAC 密匙
8、客户端用服务器的 MAC 密匙对整个握手阶段进行加密,发送给服务器
9、服务器用客户端的 MAC 密匙对整个握手阶段进行加密,发送给客户端
ECDH 算法
还是利用了数论的结论
(m^e % n)^d % n = (m^d % n)^e % n
在 ECDH 中,m、n 是已知的,e、d 分别是客户端和服务器生成的 ECDH 密匙
客户端和服务器经过相同运算和会得到一致的结果
仅仅知道一个密匙是没有用的,必须知道两个 ECDH 密匙才能破解
SSL 首部
SSL 首部仅包含三个字段:协议版本、类型、数据长度
SSL 序号
序号用以防止重排序攻击
SSL 的序号被包含在 MAC 中,这样更安全
数据链路层
核心理念
封装成帧
制定帧边界
透明传输
转义字符法
0 比特填充
差错检验
CRC 冗余循环校验
ARP 协议
地址转换协议、IP 地址到 MAC 地址的转换(也可以划分至网络层)
发送是广播的,而回复是点对点的
报文格式
硬件类型、协议类型、MAC地址长度、IP地址长度、操作类型、源MAC&IP、目的MAC&IP
以太网技术
局域网的协议,网络为一个单位所有,地理范围和站点数目有限
信道划分协议
随机接入信道
CSMA/CD 协议
争用期一般是 512bit 发送时间
少于 64字节的帧无效
载波监听
发送前必须监听信道是否繁忙
发送后也必须等待至少一个争用期
碰撞检测
二进制指数退避
随机化思想
受控接入信道
令牌环局域网
节点分布在哈希环上
令牌在环上传递
多点线路轮询
缺点
主节点故障
节点 "不听话"
MAC 帧格式
前同步码、目的地址、源地址、上层协议类型、数据、CRC
通过 8 字节的前同步码表示一个帧的开始(检测下个帧开始相当于检测本次帧的结束)
以太网交换机
多接口的网桥,MAC 地址到接口的转发
维护 ARP 转发表、自学习的
虚拟局域网 VLAN
即使多个主机被不同交换机管辖,也可以虚拟在同一个局域网内
这些交换机维护自己管辖的主机处于哪个局域网内,并由一个总的交换机管理
MAC 帧格式扩展一个 4 字节的 VLAN 标记,标识消息处于哪个局域网,由 总交换机广播给所有子交换机,子交换机根据映射表发送给对于局域网内的主机
网络层
网络层向上提供简单灵活的、无连接的、尽最大努力交付的不可靠的服务
IP 协议
IP 报文格式
版本 4bit
首部长度 4bit,单位为字节
区分服务 8bit
总长度 16bit,单位为字节
首部 + 数据部分的总长度
IP 数据报最大长度为 65535 字节
传输 65535字节是不太可能的,因为超过 MTU 就会被分片
标识 16bit
一个数据可能会被分片成多个 IP 数据报
标识相等的数据报将会按照片偏移重组
标志 3bit
表示是否是最后一个分片(后面还有没有分片)
片偏移 13bit
指示分片 IP 数据报的数据部分在原先数据部分的偏移,用于重组分片
生存时间 8bit
TTL,指示数据报在网络中的最大跳数,防止在网络中成环无限传播
上层协议类型 8bit
首部校验和 16bit
只对首部进行校验
采用反码加法校验算法
源 IP 地址 32bit
目的 IP 地址 32bit
IP 编址
分类的 IP 地址
IP 地址记为 <网络号> + <主机号>,被分为 A ~ E 五类地址
A 类地址网络号 8 位,以 0 开头;B 类地址网络号 16 位,以 10 开头; C 类地址网络号 24 位,以 110 开头;D 类地址以 1110 开头,作为多 播地址;E 类地址以 1110 开头,保留使用
地址空间利用率低,浪费太大,而且不够灵活
划分子网
分类 IP 地址太不灵活了,机构想新开一个局域网必须重新申请一个
IP 地址记为 <网络号> + <子网号> + <主机号>
增加了一定的灵活性,但仍然是分类的 IP 地址,没有解决地址空间利用率低的缺点
无分类的 IP 地址 (CIDR)
彻底抛弃分类的思想,有效增加地址空间利用率,目前广泛使用
IP 地址记为 <网络前缀> + <主机号>,也可以记为 a.b.c.d/x
转发时直接匹配网络前缀转发而不必匹配整个 IP 地址,提高性能
在此基础上,同样可以划分子网
NAT 技术
即使 IP 地址的利用率达到 100%,32 位地址也是不够用的
10.0.0.0—10.255.255.255、172.16.0.0—172.31.255.255、192.168.0.0—192.168.255.255 三类地址被记为 NAT 内部地址,公网路由器不转发这三类地址
内部地址必须通过 NAT 路由器转换成外部地址与外界通信,反之亦然
一对一映射
维护一个转换表,一个外部地址对应一个内部地址,没有增加地址空间
静态映射
对于某些固定地址的服务是必要的
动态映射(地址池)
一对多映射
维护一个转换表,一个外部地址可对应多个内部地址,有效的增加了地址空间
网络地址端口转换技术(NAPT)
通过 <外部 IP 地址 : 端口号> 映射到 <内部 IP 地址>,端口号最多有 65535 个,因此一个外部地址可以映射 6万多个内部地址,大大增加 IPv4 地址空间,甚至 NAT 可以是嵌套的,两级 NAT 可以映射 2^32 次方个内部地址!
静态映射
对于某些固定地址的服务是必要的
每个服务都必须占用一个端口,如果有多个服务想监听在同一个周知端口上,NAT 无能为力
动态映射
NAT 使得 IPv4 得以苟延残喘,但也是有不足之处的
端口应该用以进程寻址, 而非用于主机寻址
网络层不应该关注于端口
数据平面:路由匹配转发
路由表的内容至少包含:目的网络地址,目的网络掩码,下一跳地址 (CIDR)
先与自身掩码 AND,判断是否属于同一局域网内
是则获取 MAC 地址,在局域网内转发
与路由表中掩码 ADN,如果与目的地址相等则转发
最长前缀原则
控制平面:确定下一跳地址
网络内有多个自治系统,相当于多个独立王国
中国移动 ISP 就是一个自治系统 AS
AS 内也可以继续抽象出多个 AS
内部网关协议 RIP 距离向量路由选择
维护自己到网关内每一个目的网络的距离
每隔一段时间向邻居发送路由表,并进行更新(SPFA 算法)
距离大于等于 16 时被认为不可达,RIP 只适用于小型网络
内部网关协议 OSPF 开放最短路径优先
链路状态发生变化时,路由器泛洪广播这条信息,链路状态编号越大表示越新
链路状态是一个代价,不一定是距离,还可以是时延、费用等, 可由管理员制定,非常灵活
一段时间后,路由将持有一张全局拓扑图,通过迪杰斯特拉算法计算最短路径
边界网关协议 BGP
通告 BGP 路由信息
AS 发言人周期性与其他 AS 发言人交换路由信息
AS 发言人收到信息后维护达到其他 AS 的路径树
确定最好的路由
一个 AS 可有多个发言人,每个发言人维护的路径树是不同的
可利用内部协议选择代价最低的发言人,但 通过该发言人达到其他 AS 的代价可能不是最低的
BGP 算法
规则1:每个 BGP 发言人由管理员指派一 个权重,优先选择权重最高的 BGP 发言人
规则2:如果权重相同,则选择 AS 间 跳数最短的
规则3:如果 AS 间跳数相同,则通过 AS 内内部网关协议选择代价最低的
ICMP 协议
典型的应用目的是差错报告
报文格式由 类型 + 编码 + IP 数据报的首部组成,ICPM 作为 IP 的有效载荷发送
类型 + 编码 可以唯一确定一个错误描述,IP 数据报首部用于定位差错数据报
常见错误包括:网络、主机、协议、端口不可达;目的网络未知;TTL 过期等
Web 请求页面的全过程
1、创建一个 DHCP 请求报文,源端口 67,目的端口 68,通过 UDP 协议传输,该 UDP 报文被封装在目的地址全 1 的广播地址 IP 数据报中,此 IP 数据报被封装在目的地址全 1 的广播帧中。
2、帧在局域网内传播,以太网交换机检查到目的帧为广播地址,于是忠实的转发帧到所有的端口
3、帧达到路由器,路由器查看 IP 地址,发现是一个广播地址,这应当由路由器处理;于是路由器提取 UDP 数据报交由上层协议处理
4、上层协议交由对应端口 68 处理,这是个 DHCP 处理程序;DHCP 分配一个地址给客户端,DHCP 将这个 IP 地址、网络掩码和 DNS 地址等信息封装至 DHCP 响应报文中,由 UDP 传输,链路层的目的 MAC 地址被填写为客户端的 MAC
5、该响应帧到达客户端,客户端传输层将该数据交由 67 端口处理,即 DHCP 请求程序,客户机成功得到 IP 地址和本地 DNS IP 地址,它将回送一个 DHCP ACK 确认
6、当用户键入 URL 时,操作系统生成一个 DNS 查询报文,将此 URL 封装至查询报文的问题中,查询报文交由 UDP 协议,目的端口为 53,然后交由 IP 层,目的 IP 为 DNS 服务器 IP
7、但是操作系统查找路由表时找不到 DNS IP 的下一跳地址,于是将转发给默认网关,但是操作系统没有网关的地址;于是操作系统生成一个 ARP 请求报文,源 IP 填自己的 IP,目的 IP 和 目的 MAC 均为广播协议
8、ARP 请求报文在局域网内广播,被网关捕获,网关发送 ARP 应答告知客户端自己的 IP 地址,目的 IP 和 目的 MAC 都填写为客户端的地址
9、客户端收到 ARP 应答报文后,提取 ARP 的源 IP 作为网关的 IP,源 MAC 地址作为网关的 MAC 地址;接下来将网关 MAC 地址作为目的 MAC 地址,在链路上传播 DNS 查询 IP 数据报
10、网关路由器捕获到此 IP 数据报,检查目的地址,将目的地址与路由表上的网络掩码进行与运算,这个操作遵循最长前缀匹配原则,如果运算后的结果与路由表中的目的网络地址符合,那么直接按照路由表上的吓一跳地址进行转发
11、路由表中的信息是根据内部网关协议 OSPF 更新的;如果检测到此 IP 是跨 AS 的,在 AS 表中进行同样前缀匹配查看 IP 地址属于哪个 AS,然后根据边界网关协议 BGP 进行寻址
12、如果任何时候路由表中没有目的地址,或者 IP 首部中 TTL 小于 0,路由器会丢弃此数据报,并回报一个 ICMP 报文
13、现在,报文终于到达了本地 DNS 服务器,DNS 服务器检查本地缓存中是否存在对应记录,若有则直接返回;如果没有,那么通过递归或迭代的方式依次从根 DNS 服务器开始查询,查询结果和上面类型,最终将查询结果写入缓存,然后汇报给客户端
14、DNS 应答按照相似的方法穿越网络,最终到达了客户端,客户端终于知道目标 IP了;客户端生成一个 TCP SYN 数据报,端口填写 80,交由 IP 层,IP 层将目的地址设置为刚刚获得的 IP,然后查表,将 IP 数据报放置通往默认网关的链路中,在链路层,目的 MAC 被设置成网关的 MAC
15、接下来就是在路由器内转发,这一步和 DNS 查询类似,现在 TCP SYN 数据终于达到了目的服务器;服务器用同样的方法回送 TCP SYN ACK
16、来自服务器的应答被客户端的以太网卡捕获,客户端成功生成了一个 TCP 套接字,这个 TCP 套接字被操作系统抽象为一个文件,用户可随时读写文件;现在用户向此套接字写入 HTTP GET 请求,这些数据会和第三次握手的 ACK 一同发给服务器
17、服务器收到第三次握手报文,操作系统提取应用层数据 HTTP GET 请求拷贝给对应端口的应用程序,然后到 Controller 层进行处理,返回对应的 HTML 文件,被封装至 HTTP 响应的消息体中,接着,服务器以同样的方式向套接字写入消息
18、客户端终于收到了 HTML 文件,然后游览器将渲染并显示它们!