经典面试题-计算机网络
计算机网络
介绍一下经典网络分层
网络分层的话分成两种,一种是TCP/IP五层协议,一种是OSI七层协议
五层协议自底向上分为物理层, 链路层, 网络层, 传输层, 应用层
而七层协议在五层协议的基础上,将应用层细分为了会话层,表示层和应用层
哪些层有哪些协议
传输层中有TCP协议和UDP协议
应用层中HTTP协议, FTP协议, SMTP协议, GRPC
介绍TCP和UDP
TCP和UDP是两种常见的传输层协议,其中,
TCP是面向连接的, 可靠的, 面向字节流的, 由于他可以保证可靠的数据传输, 所以他可以用于文件的上传和下载, 发送HTTP请求等
UDP是无连接的, 不可靠的, 面向报文的, 由于他传输速度快且不保证可靠性, 所以可以用于视频音频通话, 实时游戏等
TCP怎么做连接管理
通过三次握手建立连接, 1. 同步请求 (SYN), 2. 同步确认 (SYN-ACK), 3. 确认 (ACK)
通过四次挥手断开连接, 1. 终止请求 (FIN), 2. 确认终止 (ACK), 3. 反向终止请求 (FIN), 4. 反向终止确认 (ACK)
介绍一下三次握手机制
第一步: 客户端发送SYN包给服务器, 这个包包含了客户端的初始序列号以及请求建立连接的标志位
第二步: 服务器接收到SYN包后, 会发送一个SYN-ACK包给客户端, 这个包包含了服务器的初始序列号以及对客户端的请求建立连接的确认
第三步: 客户端接收到SYN-ACK包之后, 会发送一个ACK确认包给服务器, 确认服务器的请求建立连接
为什么偏偏要三次(反证法)
因为两次的话,无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号
而四次的话又太多余, 第三次握手之后客户端和服务器已经确认了彼此的连接, 无需再重复确认
三次握手中双方的状态
第三次可以带数据吗
理论上来说完全可以, 但是TCP协议上明文规定了第三次握手不携带任何数据, 携带数据算是一种优化
介绍一下四次挥手机制
第一步: 客户端想要关闭连接时, 会发送一个FIN包给服务器
第二步: 服务器接收到FIN包后, 发送一个ACK包给客户端, 确认收到了客户端的关闭请求
第三步: 服务器发送一个FIN包给客户端, 表示服务也准备关闭连接
第四步: 客户端收到FIN包之后,发送一个ACK包给服务器, 确认收到了服务器的关闭请求, 连接关闭
四次挥手中双方的状态
为什么要有一个close_wait状态:
防止历史连接中的数据,被后面相同四元组的连接错误的接收;
保证「被动关闭连接」的一方,能被正确的关闭
TCP怎么保证可靠的
通过使用确认和重传机制保证数据完整且有序的送到目的地
TCP的流量控制机制
TCP(Transmission Control Protocol)的流量控制机制主要是通过滑动窗口(Sliding Window)来实现的,目的是确保发送方的数据发送速率不超过接收方的处理能力,从而避免数据拥塞和丢失,保证数据传输的高效性和可靠性。以下是流量控制机制的具体工作原理:
- 滑动窗口概念:
- 发送方和接收方各自维护一个窗口,发送方的窗口限定它可以连续发送的数据量,而这个窗口的大小是根据接收方的接收能力和当前网络状况动态调整的。
- 接收方会通过TCP报文段中的窗口大小字段(Window Size)告诉发送方其接收缓冲区当前还能接收多少数据,这个值就是接收窗口的大小。
- 过程描述:
- 初始时,接收方发送一个SYN报文给发送方,其中包含接收窗口的初始大小。
- 发送方在接收到接收方的窗口大小后,开始按照这个窗口大小发送数据。
- 随着数据的传输,接收方在缓冲区接收到数据后,会向上游发送确认(ACK)报文,这个ACK报文中会包含最新的窗口大小信息。如果接收方处理数据的速度赶不上接收速度,它会减小窗口大小;反之,则可能增大窗口大小。
- 发送方根据接收到的ACK报文中的窗口大小调整自己的发送速率,确保不会溢出接收方的缓冲区。
- 发送方有一个单独的变量记录下一个待发送数据的序列号,这个序列号与接收方的窗口前沿相对应,形成了一个可变动的、允许发送的数据范围,即发送窗口。
- 流量控制与拥塞控制的区分:
- 虽然流量控制和拥塞控制都是为了提高网络传输效率和可靠性,但它们关注的层面不同。流量控制关注点在于端到端的通信,确保数据发送不超过接收方的处理能力;而拥塞控制则关注整个网络,避免过多的数据注入网络导致网络拥塞。
TCP的拥塞控制机制
TCP是通过一个窗口,四个阶段来实现拥塞控制的
一个窗口:
TCP拥塞窗口(Congestion Window, cwnd),它代表发送方在没有得到接收方确认之前可以发送的数据量上限,可以根据当前的网络状况动态调整窗口大小
四个阶段:
慢启动(Slow Start):
连接初始化时,拥塞窗口通常被设定为一个很小的值(通常是1个报文段)。此后,每收到一个确认(ACK),拥塞窗口大小按指数方式增长,即每轮次翻倍,直到达到慢启动阈值(slow-start threshold,ssthresh)或者检测到丢包为止。
拥塞避免(Congestion Avoidance):
当拥塞窗口大小达到慢启动阈值后,TCP进入拥塞避免阶段。此时,拥塞窗口的增长速度减缓,不再是每收到一个ACK就翻倍,而是线性增长,例如每次ACK只增加1个MSS
快重传与快恢复(Fast Retransmit & Fast Recovery ):
如果发送方收到连续的重复ACK,这通常指示某个报文段在网络中丢失。这时TCP会执行“快重传”,即立刻重传丢失的报文段,而无需等待重传计时器到期。随后,TCP进入“快恢复”阶段,拥塞窗口通常会减半并设置一个新的慢启动阈值,之后以拥塞避免的方式继续增长窗口大小。
拥塞反应(Congestion response):
当检测到网络严重拥塞(如超时未收到ACK),TCP会将拥塞窗口减小到1,然后重新开始慢启动过程。
TCP有什么重传机制
- 超时重传: 当发送端发送数据后, 会启动一个计时, 如果在计时器到期之前没有收到对应的确认应答, TCP认为数据包可能丢失, 就会重传该数据包
- 快速重传: 如果接收端收到乱序的数据包,它会发送重复的ACK,这些ACK都指向同一个未收到的数据包的序列号。当发送端接收到对于同一个数据包的三个或更多的重复ACK时,无需等待超时,TCP将立即重传那个疑似丢失的数据包
- SACK: SACK允许接收端告诉发送端哪些数据包已经收到,哪些数据包丢失。
- DSACK: DSACK让接收端能够通知发送端它接收到的重复数据段,帮助发送端更好地理解网络状况和优化重传策略。
TCP咋实现快速重传
接收端在没有收到期望的数据段时,会针对同一个未收到的数据段连续发送多个ACK。当发送端接收到三个重复ACK,它就意识到有数据包可能丢失,并在定时器过期之前立即执行快速重传
优点: 解决了超时重传的等待问题
缺点: 不能确定重传多少
(所以,快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传一个,还是重传所有的问题。)
UDP实现可靠的办法
- QUIC(Quick UDP Internet Connection)是Google开发的一种传输协议,旨在结合TCP的可靠性和UDP的低延迟特性。为了让UDP变得更加可靠,QUIC采用了一系列机制,包括但不限于:
- 连接管理:QUIC通过建立基于UDP的伪连接来模拟TCP的连接状态,包括握手、连接标识符、多路复用和连接关闭等过程,以此来确保数据传输的有序性和连接状态的一致性。
- 流控与拥塞控制:QUIC实现了自己的流控制和拥塞控制算法,类似于TCP,可以有效管理数据传输速率,避免网络拥塞,同时支持每个数据流独立控制,减少TCP中常见的队头阻塞问题。
- 数据包序号与重传机制:每个QUIC数据包都有唯一的序号,接收方可以根据序号检测丢包并请求重传,发送方维护未确认的数据包记录,超时或收到重传请求时重新发送,从而确保数据包的可靠传递。
- 加密:QUIC从一开始就对所有数据进行加密,包括头部,这不仅提升了安全性,也允许头部信息更加灵活,不受中间网络设备的解读和干扰,有利于实现协议的优化。
- 多路复用:单个QUIC连接上可以同时处理多个并发的双向数据流,每个数据流都是独立的,可以单独进行错误恢复和流控制,这进一步增强了传输的可靠性和效率。
- 连接迁移:QUIC能够检测并适应客户端的网络变化(例如,从Wi-Fi切换到移动数据),保持已建立的连接状态,这对于移动设备来说是一个显著的可靠性提升。
SYN超时和洪泛攻击是什么?怎么解决
SYN超时: 在三次握手中, 当服务器接收到客户端发送的SYN包后, 会发送SYN-ACK包作为响应, 但是客户端在一定时间内未收到服务器响 应时,就会认为建立连接失败,这个时间就叫SYN超时
解决策略: 增加SYN超时时间 优化网络连接 提高服务器性能
洪泛攻击: 攻击者发送大量的伪造IP地址的SYN请求包给目标服务器, 目的是耗尽服务器的资源. 而服务器接收到这些请求后要为每一个请 求分配资源并等待确认,使得服务器资源被大量占用,无法正常服务其他正常请求
解决策略: 使用防火墙 使用SYN Cookies IP过滤和限制 使用负载均衡 提高服务器性能
浏览器输入URL之后,网络世界发生了什么变化
首先浏览器解析URL,用DNS服务确定Web服务器和文件名
接着根据上面的信息生成HTTP请求消息
在发送消息之前,先使用DNS服务器查询服务器域名对应的IP地址(若浏览器缓存有域名的缓存,则不用去问DNS)
经过应用层和传输层(在头部添加TCP/UDP首部)
经过网络层,添加了报文头(包含原地址IP和目的地址IP)
数据链路层添加MAC头部,它包含了接收方和发送方的MAC地址等信息,用于两点之间的传输(使用ARP协议,在以太网以广播的形式找出接收方MAC地址)
网卡:将二进制数字转换成电信号,在网线上传输(开头加报文和起始帧分界符,在末尾加上用于检测错误的帧校验序列)
交换机:交换机里的模块将电信号转换成数字信号,然后通过包末尾的FCS校验错误,如果没问题则放到缓冲区,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了,交换机根据MAC地址表查询MAC地址,然后将信号发送到相应的端口(若找不到则将包发送到其他除了源端口的所有端口)
路由器:当转发包时,首先路由器会接收到发送给自己的以太网包,然后查路由表找转发目标,再由相应的端口作为发送方将以太网包发送出去,首先电信号到达网线接口部分,路由器中的模块会将电信号转化为数字信号,然后通过包末尾的FCS进行错误校验. 没问题则查看MAC头部中的接收方MAC地址, 看看是不是发给自己的包,如果是就放到接收缓冲区中,否则丢弃包.完成包接收操作之后,路由器就会去掉包开头的MAC头部,路由器会根据MAC头部后方的IP头部中的内容进行转发操作
数据抵达服务器,倒着再来一遍
介绍一下DNS服务
当用户在浏览器中输入一个域名并请求访问时,首先会查询本地计算机的DNS缓存,看是否有该域名的IP地址记录。
如果本地缓存没有记录或者记录已过期,则请求会被发送至本地DNS服务器(通常是ISP提供的或网络管理员配置的)。
本地DNS服务器若未缓存相关记录,则会向根域名服务器发起递归查询请求。
根域名服务器会指引本地DNS服务器去询问相应的顶级域服务器(如.com服务器)。
顶级域服务器会指向正确的权威域名服务器,即存储该域名实际IP地址记录的服务器。
权威域名服务器返回域名对应的IP地址给本地DNS服务器。
本地DNS服务器将获取到的IP地址返回给用户的计算机。
用户的计算机最终利用得到的IP地址建立与目标服务器的连接,从而加载网页或其他在线资源
DNS劫持
DNS劫持(DNS Hijacking 或 Domain Name System Hijacking)是一种网络安全攻击,指的是攻击者未经授权非法更改DNS名称服务器上的域名记录,将原本合法的域名解析指向了错误的IP地址。当用户的计算机试图访问被劫持域名下的网站时,实际上会被重定向到攻击者所控制的服务器上。DNS劫持常用于钓鱼诈骗、广告插入、数据窃取等恶意目的,影响用户隐私和网络安全,也会导致用户无法正常访问原网站。