嵌入式开发工程师笔试面试指南-计算机网络
计算机网络基础
1 网络分层结构⭐⭐⭐⭐⭐
计算机网络体系大致分为三种,OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。
五层模型:应用层、传输层、网络层、数据链路层、物理层。
应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等。
传输层:负责向两台主机进程之间的通信提供数据传输服务。传输层的协议主要有传输控制协议TCP和用户数据协议UDP。
网络层:选择合适的路由和交换结点,确保数据及时传送。主要包括IP协议。
数据链路层:在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。
物理层:实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和物理设备的差异。
ISO七层模型是国际标准化组织(International Organization for Standardization)制定的一个用于计算机或通信系统间互联的标准体系。
应用层:网络服务与最终用户的一个接口,常见的协议有:HTTP FTP SMTP SNMP DNS.
表示层:数据的表示、安全、压缩。,确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。
会话层:建立、管理、终止会话,对应主机进程,指本地主机与远程主机正在进行的会话.
传输层:定义传输数据的协议端口号,以及流控和差错校验,协议有TCP UDP.
网络层:进行逻辑地址寻址,实现不同网络之间的路径选择,协议有ICMP IGMP IP等.
数据链路层:在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路。
物理层:建立、维护、断开物理连接。
层次名称 |
七层模型 |
五层模型 |
主要功能 |
数据单元 |
第 7 层 |
应用层 |
应用层 |
直接为用户提供服务(如 HTTP、FTP、SMTP)。 |
数据(Data) |
第 6 层 |
表示层 |
处理数据格式转换、加密与压缩(如 ASCII、SSL/TLS)。 |
数据(Data) |
|
第 5 层 |
会话层 |
管理通信会话的建立、维护与终止(如 NetBIOS、RPC)。 |
数据(Data) |
|
第 4 层 |
传输层 |
传输层 |
提供端到端的可靠(TCP)或不可靠(UDP)数据传输。 |
段(Segment)/ 数据报(Datagram) |
第 3 层 |
网络层 |
网络层 |
通过 IP 地址实现跨网络的数据包路由。 |
分组(Packet) |
第 2 层 |
数据链路层 |
数据链路层 |
负责相邻节点间的数据帧传输,处理错误检测与纠正(如 Ethernet、PPP)。 |
帧(Frame) |
第 1 层 |
物理层 |
物理层 |
处理比特流(bit)的传输,定义电气、机械特性(如光纤、双绞线)。 |
比特(Bit) |
TCP/IP 四层模型
应用层:对应于OSI参考模型的(应用层、表示层、会话层)。
传输层: 对应OSI的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。
网际层:对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。
网络接口层:与OSI参考模型的数据链路层、物理层对应。
层次名称 |
OSI 七层模型 |
TCP/IP 四层模型 |
主要功能 |
数据单元 |
典型协议 |
第 7 层 |
应用层 |
应用层 |
直接为用户提供服务(如 HTTP、FTP、SMTP)。 |
数据(Data) |
HTTP、DNS、SMTP、SSH |
第 6 层 |
表示层 |
处理数据格式转换、加密与压缩(如 ASCII、SSL/TLS)。 |
数据(Data) |
SSL/TLS、ASCII、JPEG |
|
第 5 层 |
会话层 |
管理通信会话的建立、维护与终止(如 NetBIOS、RPC)。 |
数据(Data) |
NetBIOS、RPC |
|
第 4 层 |
传输层 |
传输层 |
提供端到端的可靠(TCP)或不可靠(UDP)数据传输。 |
段(Segment)/ 数据报(Datagram) |
TCP、UDP |
第 3 层 |
网络层 |
网际层 |
通过 IP 地址实现跨网络的数据包路由。 |
分组(Packet) |
IP、ICMP、ARP |
第 2 层 |
数据链路层 |
网络接口层 |
负责相邻节点间的数据帧传输,处理错误检测与纠正(如 Ethernet、PPP)。 |
帧(Frame) |
Ethernet、Wi-Fi、PPP |
第 1 层 |
物理层 |
处理比特流(bit)的传输,定义电气、机械特性(如光纤、双绞线)。 |
比特(Bit) |
光纤、双绞线、IEEE 802.3 |
2 计算机网络有哪两种通信方式?⭐⭐⭐⭐⭐
计算机网络的两种主要通信方式是 面向连接通信 和 无连接通信,它们的核心区别在于是否需要建立端到端的连接以及数据传输的可靠性保障。以下是具体说明:
1. 面向连接通信(Connection-Oriented)
- 特点:需要预先建立连接(如 TCP 的 “三次握手”)。通信过程中维护连接状态,确保数据按顺序可靠传输。提供流量控制、错误检测与重传机制。
- 数据单元:段(Segment)。
- 典型协议:TCP(传输控制协议)。
- 应用场景:HTTP、FTP、电子邮件等对可靠性要求高的场景。
2. 无连接通信(Connectionless)
- 特点:无需建立连接,直接发送数据。不保证数据顺序或可靠性,传输速度快但可能丢失或乱序。无流量控制和重传机制。
- 数据单元:数据报(Datagram)。
- 典型协议:UDP(用户数据报协议)。
- 应用场景:视频流、在线游戏、DNS 查询等实时性要求高的场景。
关键区别
连接建立 |
需要(三次握手) |
不需要 |
可靠性 |
高(保证交付) |
低(可能丢失) |
传输效率 |
较低(额外开销) |
较高(无状态维护) |
典型协议 |
TCP |
UDP |
适用场景 |
文件传输、网页浏览 |
视频会议、实时通信 |
总结
两种通信方式各有优劣:
- 面向连接 适合对可靠性要求高的场景,但延迟较高。
- 无连接 适合实时性要求高的场景,但需上层协议自行处理丢失或乱序问题。实际应用中,开发者需根据需求选择协议(如 TCP 或 UDP)。
3 子网掩码的作用⭐⭐⭐⭐
子网掩码在计算机网络中起着关键作用,主要用于区分 IP 地址中的网络地址和主机地址,以下为你详细介绍:
划分网络和主机部分
子网掩码与 IP 地址进行逐位 “与” 运算,能明确 IP 地址里哪些位代表网络,哪些位代表主机。例如,常见的子网掩码 255.255.255.0 与 IP 地址 192.168.1.100 进行 “与” 运算,可得出网络地址为 192.168.1.0,剩余部分就是主机地址。
确定子网范围
借助子网掩码,可确定一个子网所包含的 IP 地址范围。不同的子网掩码能划分出大小不同的子网,这有利于网络的合理规划与管理。比如,通过改变子网掩码,可将一个大网络划分为多个小的子网,提高 IP 地址的使用效率。
判断两台设备是否在同一子网
当两台设备的 IP 地址与子网掩码 “与” 运算后得到相同的网络地址,就表明它们处于同一子网,此时可直接通信;若不同,则需通过路由器进行通信。
4 网关的作用?⭐⭐⭐⭐
网关(Gateway)是计算机网络中连接不同网络或协议的关键设备,其核心作用是实现跨网络通信和协议转换,具体功能如下:
1. 协议转换
- 当不同协议的网络(如 TCP/IP 与 ATM、Wi-Fi 与蓝牙)需要通信时,网关负责将数据从一种协议格式转换为另一种,确保异构网络间的互操作性。
2. 路由与转发
- 作为网络间的 “关口”,网关根据目标地址决定数据转发路径。例如,家庭网关将局域网内设备的数据转发到互联网。
3. 子网隔离与边界控制
- 通过子网掩码与 IP 地址配合,网关划分不同子网,限制广播域范围,减少网络拥堵。同时,它可作为子网的唯一出口,集中管理跨网访问。
4. 安全防护
- 部分网关集成防火墙、NAT(网络地址转换)功能,隐藏内部网络结构,过滤恶意流量,提升安全性。
5. 默认网关的核心作用
- 设备通过配置默认网关地址(如家庭路由器 IP),将非本网段的数据发送至网关,由其进一步路由到目标网络。
示例场景
- 家庭网络:路由器作为网关,连接家庭局域网与互联网,实现 IP 分配、NAT 和防火墙功能。
- 企业网络:专用网关服务器处理 VPN 接入、协议转换(如 HTTP 转 MQTT)及跨部门子网通信。
与路由器的区别
- 路由器:专注于 IP 层路由,连接相同协议的子网。
- 网关:可工作在更高层(如应用层),支持跨协议转换,功能更复杂。
网关是网络互联的核心枢纽,其设计直接影响网络的扩展性、安全性和跨域通信能力。
5 什么是分组交换?优缺点?⭐⭐⭐
分组交换(Packet Switching)是计算机网络中一种数据传输的方式,将数据划分为小的数据包(或称为分组),每个分组独立传输,并根据目标地址逐跳转发,最终到达目标节点。
分组交换的优点:
- 高效利用网络资源:由于数据被划分为分组进行传输,不需要占用完整的传输链路资源。多个分组可以同时在网络中传输,提高了网络的利用率。
- 灵活性和可靠性:分组交换可以根据网络状况和负载情况动态地选择传输路径,避免了传统电路交换中固定的连接路径。如果某个分组传输失败,可以重新发送该分组,提高了传输的可靠性。
- 支持不同类型的应用:分组交换可以适应不同类型的应用,支持多种数据类型的传输,如实时音视频、文件传输等。
分组交换的缺点:
- 延迟和抖动:由于分组交换需要将数据划分为分组,并且每个分组须独立传输和重新组装,导致传输延迟相对较高。此外,不同分组的传输路径可能不同,会引入抖动(延迟变化)。
- 需要额外的开销:每个分组都需要额外的头部信息,用于存储目标地址、校验和等信息,增加了传输的开销。
- 分组丢失和重排序:分组传输过程中,可能会出现分组丢失或者分组到达目标节点的顺序与发送顺序不一致的情况。
6 网络调试的工具 ⭐⭐⭐⭐
- Ping:用于测试网络的连通性和测量往返时间(RTT)。可以通过发送 ICMP 回显请求消息并等待目标主机的回复来检查主机之间的通信状态。
- Traceroute:用于跟踪数据包从源主机到目标主机经过的路径。它通过发送一系列的数据包,每个包在路由器上记录其经过的地址,以示路径和延迟。
- nslookup/dig:用于执行 DNS 查询,获取目标主机的 IP 地址或执行反向查询来获取主机名。
- Wireshark:是一个功能强大的网络协议分析工具,可以捕获、查看和分析网络中的数据包。它可以帮助排查网络故障、分析网络流量以及调试网络协议。
7 什么是IP地址?IP地址的分类和表示方式有哪些?⭐⭐⭐⭐⭐
IP地址(Internet Protocol Address)是用于在互联网中唯一标识设备(如计算机、服务器、路由器等)的一组数字标识。它是由32位(IPv4)或128位(IPv6)的二进制数字组成,以便于在网络中进行寻址和路由。
IP地址的分类:
- IPv4地址:IPv4采用32位地址格式,通常以四段十进制数表示(例如:192.168.0.1)。IPv4的地址空间有限且已经耗尽,但它仍然广泛应用于现有的网络中。
- IPv6地址:IPv6采用128位地址格式,通常以八组十六进制数表示,每组之间用冒号分隔(例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334)。IPv6地址空间巨大,为未来网络提供了更广阔的寻址空间。
IP地址的表示方式:
- 十进制表示法:每个IPv4地址的32位二进制数可以转换为4个十进制数字,每个数字的取值范围是0到255。例如,192.168.0.1是一个四段十进制表示的IPv4地址。
- 二进制表示法:将每个IPv4地址的32位二进制数表示出来,例如,11000000.10101000.00000000.00000001是一个四段二进制表示的IPv4地址。
TCP和UDP
1 什么是TCP/IP⭐⭐⭐⭐⭐
TCP/IP 的核心组成
- IP(网际协议)功能:负责网络层的寻址和路由,确保数据报(数据包)从源主机传输到目标主机。特点:无连接:不保证数据可靠传输。尽力而为:数据可能丢失、重复或乱序。使用 IP 地址(如 IPv4、IPv6)标识设备。
- TCP(传输控制协议)功能:运行在传输层,提供面向连接的、可靠的字节流服务。特点:可靠性:通过序列号、确认机制、超时重传等确保数据完整。流量控制:防止发送方淹没接收方。拥塞控制:动态调整传输速率以避免网络拥堵。应用场景:HTTP、HTTPS、FTP、SMTP 等需要可靠传输的场景。
- UDP(用户数据报协议)功能:传输层协议,提供无连接、不可靠但高效的数据传输。特点:轻量级:无需建立连接,延迟低。适用于实时性要求高的场景(如视频流、语音通话)。
TCP/IP 协议栈分层
TCP/IP 采用四层模型,每层负责不同功能:
- 应用层协议:HTTP、HTTPS、DNS、FTP、SMTP 等。作用:为用户提供直接服务(如网页浏览、文件传输)。
- 传输层协议:TCP、UDP。作用:端到端的数据传输,确保可靠性(TCP)或高效性(UDP)。
- 网络层协议:IP、ICMP(网络诊断)、ARP(地址解析)。作用:数据包的路由和寻址。
- 网络接口层协议:以太网、Wi-Fi、PPP 等。作用:物理设备之间的数据传输(硬件层面)。
TCP/IP 的工作流程
- 数据封装:应用层数据逐层添加头部(如 TCP 头、IP 头),形成数据包。
- 路由与传输:IP 根据目标地址选择路径,通过路由器转发数据包。
- 解封装与确认:目标主机逐层剥离头部,TCP 确保数据完整后交付给应用层。
TCP/IP 的重要性
- 跨平台兼容性:所有支持 TCP/IP 的设备均可互联。
- 灵活性:分层设计允许独立改进某一层(如 IPv6 替代 IPv4)。
- 互联网基础:支撑 Web、电子邮件、视频通话等核心服务。
总结
TCP/IP 是互联网的 “神经系统”,通过 IP 实现网络寻址,TCP 保证可靠传输,UDP 提供高效传输。其分层结构和标准化协议使全球设备能够互联互通。
2 TCP有哪些特点?⭐⭐⭐⭐⭐
- 建立连接:在进行数据传输之前,TCP 需要通过 “三次握手” 在客户端和服务器之间建立可靠的连接。具体来说,客户端向服务器发送 SYN 包,服务器收到后返回 SYN + ACK 包,客户端再发送 ACK 包确认,这样连接就建立起来了。
- 断开连接:数据传输结束后,需要通过 “四次挥手” 断开连接,确保双方都知道连接已经终止。客户端发送 FIN 包表示请求关闭连接,服务器收到后返回 ACK 确认,然后服务器也发送 FIN 包表示自己也准备关闭,客户端再返回 ACK 确认。
- 序列号和确认应答:TCP 为每个字节的数据都分配一个序列号,接收方收到数据后会返回确认应答(ACK),告知发送方数据已成功接收。发送方可以根据 ACK 来确认哪些数据已经被正确接收,哪些需要重传。
- 超时重传:如果发送方在一定时间内没有收到某个数据包的 ACK,就会认为该数据包丢失,然后重新发送该数据包。超时时间会根据网络状况动态调整。
- 校验和:TCP 会对每个数据包的数据部分进行校验和计算,并将校验和放在数据包的头部。接收方在收到数据包后会重新计算校验和,如果计算结果与头部的校验和不一致,就说明数据在传输过程中可能被损坏,接收方会要求发送方重传。
- 流量控制:TCP 使用滑动窗口机制进行流量控制。接收方会告知发送方自己的接收窗口大小,发送方只能发送接收窗口内大小的数据,避免接收方缓冲区溢出。随着数据的接收和处理,接收方可以动态调整窗口大小并通知发送方。
- 拥塞控制:TCP 有多种拥塞控制算法,如慢启动、拥塞避免、快速重传和快速恢复。当网络出现拥塞时,TCP 会降低发送速率,避免进一步加重网络拥塞;当网络状况好转时,会逐渐增加发送速率。
- 数据无边界:TCP 将应用层交付的数据看作是无结构的字节流进行传输,发送方将数据不断地写入 TCP 的发送缓冲区,接收方从 TCP 的接收缓冲区中读取数据。应用层不需要关心数据的具体边界,TCP 会负责将字节流正确地传递给对方。
- 顺序交付:TCP 保证数据按照发送的顺序交付给应用层。即使数据包在网络中可能会乱序到达,TCP 也会在接收端对数据包进行重新排序,确保数据的顺序性。
- 双向传输:在一个 TCP 连接中,双方可以同时进行数据的发送和接收。也就是说,客户端和服务器可以在同一时间既发送数据又接收数据,这大大提高了通信的效率。
- 网络感知:TCP 能够感知网络的拥塞情况,并根据拥塞程度动态调整发送速率。这有助于避免网络拥塞的进一步恶化,保证网络的稳定性和公平性。例如,当网络拥塞时,TCP 会降低发送窗口大小,减少发送的数据量;当网络状况改善时,会逐渐增加发送窗口大小,提高发送速率。
TCP(传输控制协议)具有以下特点:
面向连接
可靠传输
面向字节流
全双工通信
拥塞控制机制
3 TCP三次握手⭐⭐⭐⭐⭐
TCP 三次握手是建立可靠连接的核心机制,通过以下三个步骤完成客户端与服务器的通信初始化:
三次握手过程
- 第一次握手:客户端发送 SYN 请求动作:客户端向服务器发送一个带有 SYN(同步)标志的数据包,请求建立连接。内容:随机生成初始序列号(seq = x)。客户端告知服务器自己的接收窗口大小(window size)。服务器响应:服务器收到后进入 SYN_RCVD 状态。
- 第二次握手:服务器确认并同步动作:服务器返回 SYN + ACK 数据包,确认客户端的请求,并同步自身序列号。内容:确认号(ack = x + 1),表示已收到客户端的 SYN 请求。服务器生成自身的初始序列号(seq = y)。服务器也告知客户端自己的接收窗口大小。客户端响应:客户端收到后进入 ESTABLISHED 状态。
- 第三次握手:客户端最终确认动作:客户端发送 ACK 数据包,确认服务器的 SYN 请求。内容:确认号(ack = y + 1),表示已收到服务器的 SYN 响应。序列号(seq = x + 1),开始传输实际数据。服务器响应:服务器收到后进入 ESTABLISHED 状态,连接正式建立。
三次握手的关键作用
- 同步序列号双方通过随机生成的序列号(x 和 y),确保后续数据传输的顺序性和唯一性。
- 验证可达性三次握手确保客户端和服务器都能双向接收数据,避免 “单工” 连接。
- 资源分配服务器在第三次握手后才为连接分配缓冲区等资源,防止被恶意 SYN 请求耗尽资源(SYN 攻击)。
三次握手的示意图
客户端 服务器 │ │ ├─ SYN (seq=x)─────▶ 第一次握手 │ │ 进入 SYN_RCVD ├─ ◀── SYN+ACK───── 第二次握手 │ (ack=x+1, seq=y) │ │ │ 进入 ESTABLISHED ├─ ACK (ack=y+1)──▶ 第三次握手 │ │ 进入 ESTABLISHED │ 数据传输开始 │
4 TCP两次握手可以吗?⭐⭐⭐⭐
第三次握手主要为了防止已失效的连接请求报文段突然又传输到了服务端,导致产生问题。
- 比如客户端A发出连接请求,可能因为网络阻塞原因,A没有收到确认报文,于是A再重传一次连接请求。
- 连接成功,等待数据传输完毕后,就释放了连接。然后A发出的第一个连接请求等到连接释放以后的某个时间才到达服务端B,此时B误认为A又发出一次新的连接请求,于是就向A发出确认报文段。
- 如果不采用三次握手,只要B发出确认,就建立新的连接了,此时A不会响应B的确认且不发送数据,则B一直等待A发送数据,浪费资源。
5 TCP四次挥手⭐⭐⭐⭐
四次挥手的过程
四次挥手的过程如下:
- 客户端发起连接终止(FIN):
客户端(主动关闭方)向服务器发送一个 FIN(Finish)报文段,表示客户端的数据已经发送完毕,希望关闭连接。
客户端进入 FIN_WAIT_1 状态,等待服务器的确认。
- 服务器确认客户端的请求(ACK):
服务器收到客户端的 FIN 请求后,发送一个 ACK 报文段作为确认,确认号是客户端的 SEQ + 1。
服务器进入 CLOSE_WAIT 状态。
- 服务器发送连接终止(FIN):
服务器发送一个 FIN 报文段,表示服务器也已经没有数据要发送了,准备关闭连接。
服务器进入 LAST_ACK 状态,等待客户端的确认。
- 客户端确认服务器的请求(ACK):
客户端收到服务器的 FIN 报文后,发送一个 ACK 报文段作为确认,确认号是服务器的 SEQ + 1。
客户端进入 TIME_WAIT 状态,等待可能存在的延迟的 ACK 报文段。
客户端等待一段时间(通常是 2MSL,最大报文段生存时间)以确保服务器收到了确认,然后进入 CLOSED 状态,连接完全关闭。
四次挥手过程的状态变化:
客户端状态:
FIN_WAIT_1:等待服务器确认关闭连接。
FIN_WAIT_2:等待服务器发送关闭请求。
TIME_WAIT:等待可能延迟的包到达,确保服务器收到确认。
CLOSED:连接完全关闭。
服务器状态:
CLOSE_WAIT:等待应用层关闭连接。
LAST_ACK:等待客户端确认关闭连接。
CLOSED:连接完全关闭。
为什么是四次?
四次挥手的原因是,在 TCP 协议中,连接是全双工的,即每一方向的数据传输是独立的。因此,客户端和服务器需要分别确认各自的数据已经发送完毕,才能安全地关闭连接。
第一步:客户端希望关闭连接,发送 FIN,表示客户端没有数据要发送了。
第二步:服务器收到 FIN 后,发送 ACK,表示确认客户端没有数据要发送了,但服务器可能仍然有数据要发送。
第三步:服务器发送 FIN,表示服务器也没有数据要发送了,准备关闭连接。
第四步:客户端收到服务器的 FIN 后,发送 ACK,确认连接的关闭。
四次挥手与三次握手的区别:
三次握手用于连接的建立,确保双方都准备好开始通信。
四次挥手用于连接的关闭,确保双方都能安全地关闭连接,防止数据丢失。
示例:
客户端 → 服务器: FIN
服务器 → 客户端: ACK(确认收到 FIN)
服务器 → 客户端: FIN
客户端 → 服务器: ACK(确认收到服务器的 FIN)
在四次挥手完成后,TCP 连接会被完全关闭,双方的通信完全结束。
总结:
四次挥手是 TCP 连接断开的标准过程,通过这种方式,双方确保各自的所有数据都已经成功传输,并且在适当的时机安全地关闭连接。
6 TCP的粘包和拆包⭐⭐⭐
TCP是面向流,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
为什么会产生粘包和拆包呢?
- 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
- 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包;
- 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
- 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。即TCP报文长度-TCP头部长度>MSS。
解决方案:
- 发送端将每个数据包封装为固定长度
- 在数据尾部增加特殊字符进行分割
- 将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小。
7 说说TCP是如何确保可靠性的呢?⭐⭐⭐
- 序列号:每个字节数据都被标记唯一的序号,用于标识数据顺序。
- ACK 机制:接收方收到数据后,返回确认应答(ACK),告知发送方数据已成功接收。
- 示例:发送方发送序号 1-1000 的数据,接收方收到后返回 ACK=1001,表示期望接收下一个字节。
- 超时机制:发送方启动计时器,若超时未收到 ACK,则重传未确认的数据。
- 动态调整超时时间:根据网络状况动态计算往返时间(RTT),避免频繁重传或等待过久。
- 快速重传:若接收方连续收到多个重复的 ACK(如三次重复 ACK),发送方立即重传丢失的数据,无需等待超时。
- 滑动窗口(Sliding Window):接收方通过窗口大小告知发送方当前可接收的数据量,防止接收方缓冲区溢出。
- 窗口更新:接收方根据处理能力动态调整窗口大小,发送方根据窗口大小控制发送速率。
- 示例:接收方窗口为 1000 字节,发送方最多发送 1000 字节未确认数据,避免过载。
- 慢启动(Slow Start):初始阶段逐步增加发送窗口,探测网络容量。
- 拥塞避免(Congestion Avoidance):达到阈值后,窗口增长放缓,避免网络拥塞。
- 快速恢复(Fast Recovery):检测到丢包后,降低窗口并进入快速恢复阶段,减少性能损失。
- 校验和(Checksum):对数据段进行校验,确保传输过程中数据未被篡改或损坏。
- 丢弃损坏数据:接收方发现校验和错误时,直接丢弃该数据段并等待重传。
- 三次握手:建立连接时,双方确认通信能力和初始序列号。
- 四次挥手:关闭连接时,确保所有数据已传输完毕,避免数据丢失。
TCP(传输控制协议)通过以下核心机制确保数据传输的可靠性,以下是详细说明:
1. 序列号与确认应答(ACK)
2. 超时重传(Retransmission)
3. 流量控制(Flow Control)
4. 拥塞控制(Congestion Control)
5. 数据校验与校验和
6. 连接管理(三次握手与四次挥手)
总结对比(TCP vs UDP)
对比 |
TCP |
UDP |
可靠性 |
可靠(确保数据到达) |
不可靠(尽力而为) |
传输方式 |
面向连接 |
无连接 |
顺序保证 |
有序交付 |
可能乱序 |
流量控制 |
支持 |
不支持 |
拥塞控制 |
支持 |
不支持 |
应用场景 |
文件传输、网页浏览 |
视频流、实时通信 |
8 说下TCP的滑动窗口机制⭐⭐⭐
TCP 滑动窗口机制是实现流量控制和高效数据传输的核心技术,通过动态调整发送方的未确认数据量,平衡网络效率与接收方处理能力。以下是其核心内容:
一、滑动窗口的核心作用
- 流量控制接收方通过窗口大小告知发送方 “最多可以发送多少未确认的数据”,避免接收方缓冲区溢出。
- 提升吞吐量允许发送方连续发送多个数据包(无需等待每个 ACK),充分利用带宽。
二、窗口结构与关键参数
- 窗口左边界:已发送且已确认的数据末尾(
last_ack
)。 - 窗口右边界:左边界 + 窗口大小(
last_ack + window_size
),表示当前允许发送的最大数据位置。 - 窗口大小:由接收方在 ACK 中动态告知(如
window = 4096
字节)。
三、滑动窗口的工作流程
- 发送数据发送方在窗口范围内发送数据(如 seq=1~4096),并启动计时器。
- 接收确认接收方处理数据后,返回 ACK(如ack=2049),表示 seq=2048 及之前的数据已接收。
- 窗口滑动发送方收到 ACK 后,将窗口左边界移动到ack位置(2049),窗口右边界同步后移(2049+4096=6145),允许继续发送新数据(seq=2049~6145)。
四、动态调整窗口大小
- 接收方主动通知接收方根据当前缓冲区剩余空间,在 ACK 中更新窗口大小(如window=2048)。
- 发送方自适应发送方根据网络拥塞情况(如超时重传),可能主动缩小窗口(与拥塞控制结合)。
五、滑动窗口与拥塞控制的关系
- 流量控制:窗口大小由接收方能力决定(避免接收方过载)。
- 拥塞控制:窗口大小由网络拥塞程度决定(避免网络过载)。
- 实际窗口:最终窗口大小取两者最小值(
min(接收窗口, 拥塞窗口)
)。
六、示例说明
初始窗口:左边界=0,右边界=4096(允许发送seq=0~4095) 发送数据:seq=0~4095 → 等待ACK 接收方处理后返回 ACK=2048,窗口=2048 → 新窗口:左边界=2048,右边界=4096(允许发送seq=2048~4095) 发送方继续发送 seq=2048~4095 → 再次等待ACK 若接收方缓冲区已满,下次ACK中窗口可能变为0 → 发送方暂停发送,直到窗口更新。
9 什么是洪泛攻击?怎么避免?⭐⭐⭐⭐
什么是洪泛攻击?
洪泛攻击(Flood Attack)是一种网络攻击手段,攻击者通过向目标系统或网络发送大量无效或异常请求,消耗其资源(如带宽、内存、CPU 等),导致服务瘫痪或性能严重下降。常见类型包括:
类型 |
原理 |
典型场景 |
DDoS 洪泛 |
利用分布式节点发送海量请求(如 UDP、ICMP、SYN 等),耗尽目标带宽或连接数。 |
网站瘫痪、在线服务中断。 |
SYN 洪泛 |
伪造源 IP 发送大量 TCP SYN 请求,占用目标未完成的连接队列。 |
服务器无法处理正常用户请求。 |
ICMP 洪泛 |
发送大量 ICMP Echo 请求(如 Ping),占用网络带宽。 |
网络拥堵、设备过载。 |
应用层洪泛 |
针对特定应用(如 HTTP)发送高频请求,耗尽服务器资源。 |
数据库崩溃、API 响应延迟。 |
如何避免洪泛攻击?
一、技术防御措施
- 流量清洗与过滤使用专用设备(如 DDoS 防护设备、防火墙)实时检测并过滤异常流量。部署 CDN 或云防护服务(如 Cloudflare、阿里云盾),分散流量压力。
- 网络层防护SYN Cookies:服务器在收到 SYN 请求时,发送包含加密参数的 SYN - ACK,避免保存未完成连接。限制单 IP 请求速率:通过 iptables 或 Nginx 限制单位时间内单个 IP 的请求次数。黑洞路由:将恶意流量引流到黑洞地址,避免影响正常服务。
- 应用层优化使用 Web 应用防火墙(WAF)拦截恶意请求(如 SQL 注入、CC 攻击)。对关键 API 或接口实施认证和令牌机制,减少无授权访问。
- 协议加固禁用不必要的服务(如 Telnet、TFTP),减少攻击面。启用 TCP 连接超时机制,及时释放无效连接。
二、管理与策略
- 监控与响应部署实时监控系统(如 Prometheus、Zabbix),设置流量阈值报警。制定应急预案,明确攻击发生时的协作流程(如联系 ISP、切换备用节点)。
- 资源冗余采用弹性云服务器(如 AWS Auto Scaling),动态扩展资源应对突发流量。多链路接入(如 BGP 多线),分散网络压力。
- 安全配置更新系统和应用补丁,修复已知漏洞(如 CVE - 2023 - 25690 等)。限制 ICMP 请求频率,避免成为反射攻击的跳板。
三、典型工具示例
工具 |
功能 |
适应场景 |
Cloudflare |
提供 DDoS 防护、速率限制、WAF 等功能,支持全球节点加速。 |
中小型网站、SaaS 服务。 |
Nginx Plus |
集成负载均衡、请求限流、健康检查,适合高并发应用。 |
Web 服务器前端防护。 |
Suricata |
开源入侵检测系统,实时监控网络流量异常。 |
企业内部网络安全。 |
总结
洪泛攻击的核心是资源耗尽,防御需结合多层技术(如流量清洗、协议优化)和管理策略(如监控、冗余)。选择云服务或专业设备可快速提升防护能力,而关键业务的架构设计(如无状态服务、弹性扩展)则是长期保障。
10 详细讲一下拥塞控制?⭐⭐⭐⭐
慢开始
把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。
当 cwnd < ssthresh 时,使用慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。
拥塞避免
让拥塞窗口cwnd缓慢地增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长。
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。
快重传
有时个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。
快重传算法可以避免这个问题。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认,使发送方及早知道有报文段没有到达对方。
发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。
快恢复
当发送方连续收到三个重复确认,就会把慢开始门限ssthresh减半,接着把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。 采用这样的拥塞控制方法使得TCP的性能有明显的改进。
11 为什么服务端易受到SYN攻击?⭐⭐⭐⭐
SYN攻击(SYN flood)是一种常见的网络攻击方式,其利用TCP协议的三次握手过程中的漏洞,通过发送大量伪造的SYN请求包给服务端,耗尽服务端资源,使其无法响应正常的请求。
下面是一些可能导致服务端易受到SYN攻击的原因:
- 半开连接:在正常的TCP连接建立过程中,当服务端收到客户端的SYN包后,会分配一些资源来处理未完成连接的请求,这种连接称为半开连接。攻击者可以利用这一点,伪造大量的源IP地址,同时发送大量的SYN请求,使得服务端一直等待,无法释放资源,最终资源耗尽。
- 容易预测的序列号:在TCP三次握手过程中,客户端和服务端会交换初始序列号(ISN),用于后续的数据传输。如果服务端使用简单的算法或固定的初始序列号生成方式,攻击者可以很容易地猜测到服务端的序列号,从而伪造大量的连接请求。
- 资源限制:服务端可能存在连接数量、带宽、内存等资源限制。攻击者利用SYN攻击可以消耗这些资源,使服务端无法正常处理其他的合法请求。
为了应对SYN攻击,通常采取以下防御措施:
- SYN cookies:SYN cookies是一种机制,用于在三次握手过程中隐藏服务端的真实序列号,以抵御SYN攻击。它使用哈希函数生成一个虚假的序列号,在接收到SYN请求后,服务端可以验证请求的合法性并恢复真实的序列号。
12 为什么客户端在 TCP 四次挥手后还要等待2MSL?⭐⭐⭐⭐⭐
客户端在 TCP 四次挥手后等待 2MSL 的原因:
客户端在发送最后一个 ACK 后进入TIME_WAIT
状态并等待 2 倍 MSL(Maximum Segment Lifetime,报文最大生存时间),这一机制是为了确保连接安全关闭,避免潜在的数据混乱或资源泄漏。具体原因如下:
1. 确保最后一个 ACK 被服务器接收
- 问题:若客户端发送 ACK 后立即关闭,该 ACK 可能在网络中丢失。
- 后果:服务器未收到 ACK,会重新发送 FIN 请求,此时客户端已关闭,导致服务器陷入
LAST_ACK
状态,无法释放资源。 - 解决方案:等待 2MSL 时间,足够让服务器收到 ACK 或超时重传 FIN,避免资源浪费。
2. 清除网络中残留的旧报文段
- 问题:TCP 报文可能因网络延迟或路由异常在关闭后到达对方。
- 后果:若客户端直接关闭并重启相同端口,旧报文段可能被误认为是新连接的数据,导致数据混乱。
- 解决方案:2MSL 时间可确保所有旧报文段过期,避免干扰新连接。
3. 避免端口冲突
- 问题:客户端关闭连接后,若立即重用相同端口建立新连接,旧连接的残留数据可能被新连接接收。
- 解决方案:等待 2MSL 后,旧连接的所有数据已失效,新连接可安全建立。
13 为什么建立连接是三次握手,关闭连接确是四次挥手呢?⭐⭐⭐⭐⭐
TCP 建立连接使用三次握手,关闭连接使用四次挥手的原因:
这是由 TCP 协议的设计目标(可靠性与资源管理)和连接状态转换逻辑决定的。以下是具体原因:
1、三次握手的必要性
同步序列号
客户端和服务器需交换初始序列号(ISN),确保后续数据按顺序接收。三次握手允许双方确认彼此的 ISN。
双向确认能力
客户端发送SYN(请求建立连接),确认自己的发送能力。
服务器回复SYN+ACK,确认自己的接收能力和客户端的发送能力。
客户端发送ACK,确认服务器的发送能力。三次握手确保双方均具备收发能力。
2、四次挥手的必要性
双向关闭需求
TCP 是全双工通信,每个方向需独立关闭:
第一次挥手:客户端发送FIN,请求关闭发送方向。
第二次挥手:服务器回复ACK,确认接收FIN,但可能仍有数据待发送。
第三次挥手:服务器发送FIN,请求关闭接收方向。
第四次挥手:客户端回复ACK,确认接收FIN,完成双向关闭。
处理残留数据
服务器在收到FIN后,可能仍需发送未完成的数据(如文件传输的剩余部分)。因此,FIN和ACK需分开发送,避免阻塞数据传输。
避免资源浪费
若强制三次挥手关闭,服务器可能在未完成数据发送时被迫关闭,导致数据丢失。四次挥手确保双方无数据残留后再释放资源。
14 请说说TCP的ACK机制,有什么好处?⭐⭐⭐⭐⭐
TCP 的 ACK 机制是接收方对收到的数据进行确认的核心机制。当接收方接收到数据后,会向发送方返回 ACK(确认号),告知已成功接收的数据序号。发送方根据 ACK 判断数据是否需要重传,确保可靠传输。
主要好处:
- 可靠性:通过 ACK 确认,避免数据丢失。发送方超时未收到 ACK 则重传,确保数据最终到达。
- 流量控制:结合滑动窗口技术,ACK 携带窗口大小信息,动态调整发送速率,防止接收方过载。
- 拥塞控制:发送方根据 ACK 的返回时间和丢包情况,调整拥塞窗口,避免网络拥塞。
- 有序交付:ACK 按序号确认,确保数据按顺序接收,乱序时触发重传或排序机制。
15 UDP的头部格式是什么样的?⭐⭐⭐⭐⭐
UDP 头部格式
UDP(用户数据报协议)的头部结构简单,仅包含 4 个字段,总长度固定为 8 字节,具体如下:
1 源端口(2 字节)
标识发送方应用程序的端口号,可选填 0(无返回通信需求时)。
2 目标端口(2 字节)
标识接收方应用程序的端口号,如 DNS 默认使用 53 端口。
3 长度(2 字节)
表示 UDP 数据报总长度(头部 + 数据),最小值为 8 字节(仅头部),最大值 65535 字节。
4 校验和(2 字节)
可选字段,用于检测数据传输中的错误。计算范围包括伪首部(IP 地址等)、UDP 头部和数据部分。
特点
- 无连接:无需三次握手,直接发送数据。
- 不可靠:不保证交付、不重传丢失的数据。
- 低开销:头部简单,适合实时性要求高的场景(如视频流、DNS 查询)。
对比 TCP
与 TCP 的 20 字节可变头部相比,UDP 的简洁设计牺牲了可靠性,换取更低的延迟和带宽占用。
16 TCP和UDP的区别?⭐⭐⭐⭐⭐
- TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
- TCP提供可靠的服务;UDP不保证可靠交付。
- TCP面向字节流,把数据看成一连串无结构的字节流;UDP是面向报文的。
- TCP有拥塞控制;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。
- 每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的通信方式。
- TCP首部开销20字节;UDP的首部开销小,只有8个字节。
17 TCP 和 UDP 分别对应的常见应用层协议有哪些?⭐⭐⭐⭐
基于TCP的应用层协议有:HTTP、FTP、SMTP、TELNET、SSH
HTTP:HyperText Transfer Protocol(超文本传输协议),默认端口80
FTP: File Transfer Protocol (文件传输协议), 默认端口(20用于传输数据,21用于传输控制信息)
SMTP: Simple Mail Transfer Protocol (简单邮件传输协议) ,默认端口25
TELNET: Teletype over the Network (网络电传), 默认端口23
SSH:Secure Shell(安全外壳协议),默认端口 22
基于UDP的应用层协议:DNS、TFTP、SNMP
DNS : Domain Name Service (域名服务),默认端口 53
TFTP: Trivial File Transfer Protocol (简单文件传输协议),默认端口69
SNMP:Simple Network Management Protocol(简单网络管理协议),通过UDP端口161接收,只有Trap信息采用UDP端口162。
18 TCP、UDP的优缺点⭐⭐⭐⭐⭐
TCP 与 UDP 的优缺点对比
协议 |
优点 |
缺点 |
典型场景 |
TCP |
1. 可靠性高(ACK 确认、超时重传) 2. 有序交付(按序列号排序) 3. 流量控制与拥塞控制 4. 全双工通信 |
1. 开销大(头部 20 字节 + 三次握手 / 四次挥手 2. 延迟高(等待确认) 3. 资源消耗多 |
网页浏览、文件传输、邮件发 |
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
#承诺提供免费技术答疑# 本专栏主要是介绍嵌入式开发岗位相关知识和学习攻略。“C/C++软件开发岗位”也可以参考。 该专栏覆盖了嵌入式求职过程中99%常见面试题,详细讲解了嵌入式软件开发岗位、学习攻略、项目经验分享、面试心得,从技术面,HR面,主管面,谈薪一站式服务。订阅即赠送简历模板、内推机会,需要的同学点击我头像私信即可!