07-计算机网络面试实战
计算机网络面试实战
为什么要学习网络相关知识?
对于好一些的公司,计算机基础的内容是肯定要面的,尤其是 30k 以内的工程师,因为目前处于的这个级别肯定是要去写项目的,还没上升到去设计架构的高度,因此不可避免地要和机器、网络、cpu、磁盘、内存打交道,就比如线上机器 cpu 负载 100% 了怎么办呢?内存使用率过高怎么办?
对于这些问题,必须依靠计算机基础才可以去解决,并且如果不了解这些,以后如果去带头做一个项目,在生产环境稍微碰到一些相关问题,根本也就不知道怎么去解决,所以对于计算机基础的内容一定要好好掌握!
计算级网络的模型
计算级网络的模型有 OSI 七层模型和 TCP/IP 四层模型,而 OSI 七层模型是先出现的理论模型,再进行实践,而 TCP/IP 是参考 OSI 七层模型,先有了协议和应用再提出了四层模型,目前 TCP/IP 四层模型被广泛使用就是因为 OSI 七层模型实践之前,TCP/IP 四层模型就已经广泛使用了,已经成为了流行的网络模型,当 OSI 七层模型的具体协议及应用出来的时候,市场已经被 TCP/IP 所霸占了
OSI 七层模型
:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP 四层模型
:应用层、传输层、网络层、链路层、物理层
我之前也写了一篇文章,详细写了每一层具体是做什么的,以及每一层的协议,TCP 和 UDP 等等:网络相关面试题
这里也简单写一下每一层到底是做什么的,了解一下有个大概的感觉即可:
-
物理层
:通过物理介质,光缆等介质传输电路信号
,二进制 0 和 1 在物理层被转换为电路信号进行传输 -
数据链路层
:通过物理层传输了电路信号,但是并不知道电路信号的含义,数据链路层将电路信号翻译为 0 和 1
,并且将电路信号分组,知道哪些 0 和哪些 1 是同一组的,网络交换机
工作在数据链路层,主要是用在局域网的通信
,在传输数据包时是通过 mac 地址进行接收的,如果一个电脑发个数据包出去,会广播给局域网内的所有机器设备的网卡,每台机器都从数据包中取出 mac 地址和自己的 mac 地址比较,如果一样,表示是给自己发送的数据包 -
网络层
:在数据链路层是通过广播给局域网的机器来发送数据包的
,那么如何区分局域网呢?就是通过网络层中 IP 协议的 IP 地址来区分的,也就是通过子网掩码来判断哪些 IP 属于同一个子网,路由器
工作在网络层,通过路由器就可以连入英特网
,也就是常说的“你的电脑可以上网了”,你如果要和另一个局域网上的电脑进行通信,那么就是通过路由器转发数据包的,先是通过交换机将数据转发送给路由器,路由器收到数据包之后,再次通过交换机将数据包发送给另一个局域网上的路由器,之后再转发给目标电脑 -
传输层
:在一台机器上是同时有多个进程使用一个网卡进行通信的,比如 QQ、微信,但是这些进程的端口号不同,网络层是基于 ip 协议进行主机间的寻址和通信的,那么传输从就是基于端口号
来进行两个主机的端口之间的连接和通信,其中 udp 和 tcp 就是传输层的协议 -
会话层
:会话层用于建立连接、管理连接、发送和接收数据,在客户端和服务器建立会话之前,服务端会对客户端进行身份验证并且授权 -
表示层
:表示层从应用层接收数据,这些数据以字符和数字的形式出现,表示层将这些字符和数据转成二进制
,在传输数据之前,表示层将原始数据进行压缩,可以加快传输,并且保证完整性数据传输前的数据加密,在发送端,数据在表示层会被加密,在接收端,数据在表示层会进行解密操作 -
应用层
:应用层是由网络应用程序使用的
,是离用户最近的一层,应用层通过各种协议,为网络应用提供服务,常见协议如下:-
FTP - 文件传输协议 -
HTTP/S - 超文本传输(安全)协议 -
SMTP - 邮件发送协议:用于与邮件服务器建立通信,并处理电子邮件的发送操作 -
POP3 - 邮件接收协议:用于与邮件服务器建立通信,并且从服务器中检索邮件 -
Telnet : 与虚拟段之间的通信协议
-
浏览器请求 www.baidu.com 的流程
首先,假设我们电脑配置如下:
-
ip 地址:192.168.30.30 -
子网掩码:255.255.255.0 -
网关地址:192.168.30.1 -
DNS 地址:8.8.8.8
当我们通过域名 www.baidu.com
进行访问时,首先会找到 DNS 服务器
解析域名得到对应的 ip 地址,这里假设为 172.194.17.109
之后判断本机 ip 与目的地址的 ip 是否处于同一子网,显然不在一个子网,一个 192 开头,另一个 172 开头(根据子网掩码判断),那么就将数据包发送给 网关
那么浏览器要访问一个网站,是基于应用层的 http 协议
的,并且要将浏览器发出的请求封装成应用层数据包,如下
那么这个数据包就会由应用层向下传输,到表示层、会话层、传输层,到达 传输层
之后,传输层的 TCP 协议需要去 设置数据包的端口号
,发送方的端口号随机算一个,接收方的端口号一般默认是 80
之后数据包由到了网络层,通过 IP 协议,将数据包进一步封装,添加上 IP 协议所需的本机 IP 地址和目的 IP 地址,之后判断如果两台机器不在同一个子网内的话,就将数据包先广播到网关中去,通过网关发送给目的地址
接下来到了数据链路层,将网络层的数据包进一步封装,并加上本机 mac 地址和网关的 mac 地址,这里封装好的就是 以太网数据包
,大小限制为 1500 字节,如果超过网络层传输下来的数据包超过 1500 个字节,需要切分为多个数据包传输
之后你发送的请求就可以发送到目标电脑了
Https 的工作原理
Http 的内容是明文传输的,铭文数据经过中间代理服务器、路由器、wifi 热点等多个物理节点,如果被劫持会导致传输内容完全暴露,因此需要对信息进行加密
Https 是一种通过计算机网络进行安全通信的传输协议,Https 经由 Http 进行通信,利用 SSL/TLS
来加密数据包,HTTPS 在内容传输的加密上使用的是 对称加密
,非对称加密
只作用在证书验证阶段
Https 的信任基于预先安装在操作系统中的证书颁发机构(CA)
那么通过 Https 进行通信的流程如下:
证书验证阶段
-
浏览器发起 Https 请求 -
服务端返回 Https 证书 -
客户端验证证书是否合法,如果不合法则提示告警
数据传输阶段
-
当证书验证合法后,在本地生成随机数 -
通过公钥加密随机数,并把加密后的随机数传输到服务端 -
服务端通过私钥对随机数进行解密 -
服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输
具体的一些细节可以了解一下,我也发现了一篇比较好的文章,可以看一下:彻底搞懂HTTPS的加密原理
为什么要网络分层?
网络分层可以简化复杂性,提高 模块化程度
和 可维护性
分层之后,各个层次负责特定的功能,每一层不需要关心上层或下层的具体细节,如果需要修改,直接对某个层进行修改即可,不会影响到其他层,这种模块化设计可以使网络系统扩展性更强
并且在网络出现问题时,由于分层的设计,可以根据每一层的职责更容易地定位到问题所在的层次,而不需要了解整个系统
网络模型中各层都有哪些协议?
物理层和数据链路层比较偏向于底层,就不说了
网络层主要的协议有:
-
IP 协议:互联网协议(IP)是网络层的核心协议,负责将数据包从源地址传输到目的地址 -
ICMP 协议:互联网控制消息协议(ICMP)用于在网络设备之间传递控制消息,如错误报告、网络不可达、重定向等。它帮助网络设备诊断和处理网络问题 -
IGMP 协议:互联网组管理协议(IGMP)用于在主机和相邻的路由器之间建立多播组成员关系。它允许主机加入或离开多播组,以便接收特定类型的数据包 -
OSPF 协议:开放最短路径优先(OSPF)是一种内部网关协议(IGP),用于在自治系统(AS)内部的路由器之间交换路由信息,以确定最短路径
传输层主要的协议有:
-
TCP 协议:传输控制协议(TCP)提供了一种可靠的、面向连接的服务。它确保数据按顺序到达目的地,并且没有丢失或损坏 -
UDP 协议:用户数据报协议(UDP)提供了一种无连接、不可靠的服务。它比TCP更快,但不保证数据的完整性和顺序
会话层主要的协议有:
-
RPC(Remote Procedure Call):远程过程调用(RPC)允许程序在一个网络上的客户端请求另一个网络上的服务器执行特定的任务或操作 -
NCP 协议:网络控制协议(NCP)是早期网络协议,用于在客户端和服务器之间建立会话。它在现代网络中已经很少使用
表示层主要的协议有:
-
ASCII:美国信息交换标准代码(ASCII)是一种字符编码标准,用于表示文本数据 -
JPEG:联合图像专家组(JPEG)是一种用于压缩图像的格式,它提供了良好的图像质量和相对较小的文件大小 -
GIF:图形交换格式(GIF)是另一种图像格式,支持动画和透明背景
应用层:
-
FTP:文件传输协议(FTP)用于在网络上传输文件 -
Http:超文本传输协议(HTTP)用于网页的传输,是互联网上最常用的协议之一 -
SMTP:简单邮件传输协议(SMTP)用于发送电子邮件 -
SSH:安全外壳协议(SSH)提供了一种加密的网络服务,用于安全地访问远程计算机 -
DNS:域名系统(DNS)用于将人类可读的域名转换为IP地址,使得用户可以通过网址而不是IP地址来访问网站
三次握手
TCP 三次握手和四次挥手也是网络中比较常问的问题,因为两台机器之间需要通信就需要去建立 TCP 连接,建立 TCP 连接就是通过 TCP 三次握手建立的,通过四次挥手关闭 TCP 连接
TCP 三次握手和四次挥手的细节这里就不说了,之前写过一篇文章,TCP 三次握手和四次挥手
那么面试官可能会问,问什么一定要三次握手呢?
首先,简单来理解的话,通过三次握手,客户端和服务器端都可以证明自己的 接收
和 发送
能力都是正常的,之后才可以正常通信
如果非要举出一个例子,在谢希仁版《计算机网络》中是这样说的,如果 client 发送的第一个 SYN 包并没有丢失,只是在网络中滞留,以致于延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文,但 server 收到此失效报文后,就误认为是 client 再次发出的一个新的连接,于是向 client 发出 SYN+ACK 包,如果不采用三次握手,只要 server 发出 SYN+ACK 包,就建立连接,会导致 client 没有发出建立连接的请求,因此不会理会 server 的 SYN+ACK 包,但是 server 却以为新的连接建立好了,并一直等待 client 发送数据,导致资源被浪费
那么为什么不四次握手呢?
因为三次握手后,建立正常通信就没有问题了,没有必要再继续握手,浪费网络资源
HTTP 是基于 TCP 还是 UDP 呢?
HTTP 协议在 HTTP/1.1 和 HTTP/2 版本都是 基于 TCP 协议
的,而 HTTP/3 是 基于 UDP 协议
传输的,可以根据浏览器查看 HTTP 协议到底是哪个版本的
F12 打开控制台,右键记得选择 Protocol,h2 则代表是 HTTP/2 版本的
HTTP/1 、HTTP/2 和 HTTP/3 的区别如下:
-
HTTP/1(1997 年推出) 有连接无法复用、队头阻塞、协议开销大和安全因素等多个缺陷 -
HTTP/2(2015 年推出) 通过多路复用、二进制流与 Header 压缩等技术,极大地提高了性能,但是还是存在一些问题 -
HTTP/3(2022 年发布标准) 抛弃 TCP 协议,以全新的视角重新设计 HTTP。其底层支撑是 QUIC 协议,该协议基于 UDP,有 UDP 特有的优势,同时它又取了 TCP 中的精华,实现了即快又可靠的协议
虽然 HTTP/3 版本出现了,但是我们通过浏览器发现,常用的版本还是 HTTP/1.1 和 HTTP/2,为什么呢?(历史原因,比较老的系统使用的还是 1.1 和 2 版本较多,不过目前版本 3 也在逐步推广)
获取更多干货内容,记得关注我哦。
本文由 mdnice 多平台发布