计算机网络面经(一)

以下为个人总结,图源大部分会来自网络和JavaGuide

网络分层模型

OSI七层模型

在这里插入图片描述

各层的常见协议

  • 应用层 用户接口 HTTP, FTP, SMTP, DNS
  • 表示层 数据格式转换 SSL/TLS, JSON, JPEG
  • 会话层 会话管理 NetBIOS, RPC, SSH
  • 传输层 端到端通信 TCP, UDP, QUIC
  • 网络层 路由寻址 IP, ICMP, OSPF, BGP
  • 数据链路层 帧传输 Ethernet, Wi-Fi, ARP
  • 物理层 比特流传输 Ethernet, USB, 光纤
层间通信

发送方(封装):
应用层 → 表示层 → 会话层 → 传输层 → 网络层 → 数据链路层 → 物理层
Message → 加密 → 会话ID → TCP头 → IP头 → 帧头/尾 → 比特流

接收方(解封装):
物理层 → 数据链路层 → 网络层 → 传输层 → 会话层 → 表示层 → 应用层
比特流 → 帧解析 → 路由检查 → 端口分配 → 会话恢复 → 解密 → 用户数据

TCP/IP四层模型

在这里插入图片描述

  • 应用层 直接为用户应用提供服务。HTTP、FTP、DNS、SMTP、SSH。
  • 传输层 提供端到端的可靠或不可靠数据传输。TCP、UDP。
  • 网络层 实现主机到主机的逻辑寻址和路由。封装数据为IP数据报,包含源/目的IP地址。IP、ICMP、IGMP。
  • 网络接口层 负责在物理网络中传输数据帧。 以太网、Wi-Fi、ARP。
层间通信

发送端:
应用层 → 传输层 → 网络层 → 网络接口层
应用层数据 → [TCP头]+数据 → [IP头]+TCP段 → [帧头]+IP包+[帧尾] → 网络传输

接收端:
网络接口层 → 网络层 →传输层 → 应用层
网络传输 → 移除帧头/尾 → 移除IP头 → 移除TCP头 → 应用层数据

TCP相关

TCP的三次握手

在这里插入图片描述

  1. 第一次握手(SYN)
    客户端发送 SYN=1(同步标志位),并随机生成一个初始序列号 seq=x。
    目的:向服务器发起连接请求,并告知自己的初始序列号。
    此时客户端进入 SYN_SENT 状态。
  2. 第二次握手(SYN+ACK)
    服务器收到 SYN 后,回复 SYN=1 和 ACK=1(确认标志位),同时生成自己的初始序列号 seq=y,并确认客户端的序列号 ack=x+1。
    目的:确认客户端的 SYN,并告知自己的初始序列号。
    此时服务器进入 SYN_RCVD 状态。
  3. 第三次握手(ACK)
    客户端收到 SYN+ACK 后,发送 ACK=1,确认服务器的序列号 ack=y+1,并携带自己的序列号 seq=x+1(因为第一次握手的 SYN 占用一个序号)。
    目的:确认服务器的 SYN,完成双向连接建立。
    此时双方进入 ESTABLISHED 状态,可以开始数据传输。
为什么需要三次握手?
  1. 确认双方的收发能力
    第一次握手:服务器确认客户端能发。
    第二次握手:客户端确认服务器能收和发。
    第三次握手:服务器确认客户端能收。
  2. 防止历史重复连接初始化导致的资源浪费
    如果是两次握手,服务器可能因收到延迟的旧 SYN 请求而误建连接,而客户端实际不需要。
  3. 同步初始序列号(ISN)
    双方通过三次握手交换初始序列号,确保数据按序传输。
两次握手可以吗?

不行,服务器无法确认客户端是否收到自己的 SYN+ACK,可能导致半连接(服务器已就绪,客户端未就绪)。

四次握手可以吗?

如果改成四次握手(例如:客户端再发一个 ACK 确认服务器的 ACK),实际上是冗余的,因为第三次握手已经能确保双方通信正常,额外的确认不会带来更多好处,只会增加延迟。

四次挥手

在这里插入图片描述

  1. 第一次挥手(FIN)
    客户端发送 FIN=1(终止标志位)和序列号 seq=u,表示客户端没有数据要发送了,请求关闭连接。
    客户端状态:FIN_WAIT_1(等待服务器的 ACK)。
    注意:此时客户端仍可以接收数据(因为 TCP 是全双工的)。
  2. 第二次挥手(ACK)
    服务器收到 FIN 后,回复 ACK=1 和确认号 ack=u+1,表示已收到客户端的关闭请求。
    服务器状态:CLOSE_WAIT(等待服务器应用层处理完剩余数据)。
    客户端状态:收到 ACK 后进入 FIN_WAIT_2(等待服务器的 FIN)。
  3. 第三次挥手(FIN)
    服务器处理完剩余数据后,发送 FIN=1 和 seq=v(可能是新的序列号),表示服务器也没有数据要发送了,请求关闭连接。
    服务器状态:LAST_ACK(等待客户端的最终 ACK)。
  4. 第四次挥手(ACK)
    客户端收到 FIN 后,发送 ACK=1 和 ack=v+1,表示确认服务器的关闭请求。
    客户端状态:进入 TIME_WAIT(等待 2MSL 后彻底关闭)。
    服务器状态:收到 ACK 后立即关闭连接。
为什么需要四次挥手?
  • TCP 是全双工的,双方可以独立关闭连接:
    • 客户端主动关闭(第一次挥手)→ 服务器确认(第二次挥手).
    • 服务器可能还有数据要发送,不能立即关闭。
    • 服务器处理完数据后主动关闭(第三次挥手)→ 客户端确认(第四次挥手)。
如果改成三次挥手?
  • 服务器没有需要发送的消息时,可能会退化为三次挥手。
  • 但是如果将所有的四次挥手改为三次挥手会导致:
    • 服务器无法在确认客户端 FIN 后继续发送剩余数据。
    • 可能造成数据丢失或不完整关闭。
为什么客户端需要 TIME_WAIT 状态?
  • 等待 2MSL(Maximum Segment Lifetime,报文最大生存时间),确保:
    • 服务器收到最后的 ACK(如果丢失,服务器会重传 FIN)。
    • 让网络中残留的旧 TCP 报文失效,避免影响新连接。
    • 默认 2MSL 时间:Linux 通常为 60 秒,Windows 为 4 分钟。
为什么服务器需要 CLOSE_WAIT 状态?
  • 允许服务器处理剩余数据
    当客户端发送 FIN 请求关闭连接时,服务器可能仍有数据需要发送(如未传完的文件、数据库查询结果等)。
    CLOSE_WAIT 状态让服务器有机会继续发送剩余数据,而不是立即关闭连接。
  • 确保应用程序正确释放资源
    服务器需要等待应用程序(如 HTTP 服务器、数据库服务)处理完所有逻辑后,主动调用 close() 或 shutdown() 来发送自己的 FIN。

如果直接跳过 CLOSE_WAIT,可能导致:数据丢失(如未发送完的响应)和资源泄漏(如未关闭的文件句柄、数据库连接)。

CLOSE_WAIT 可能引发的问题

连接泄漏(大量 CLOSE_WAIT 堆积)
原因:服务器应用程序未正确调用 close(),导致 CLOSE_WAIT 状态长期存在。
后果:占用系统资源(文件描述符、内存)。最终导致服务器无法接受新连接(Too many open files)。

TCP的拥塞控制

慢启动、拥塞避免、快重传、快恢复

  1. 慢启动(Slow Start)
    目的:初始阶段快速探测可用带宽。
    规则:初始拥塞窗口(cwnd)通常为 1 MSS(Maximum Segment Size)。每收到一个 ACK,cwnd 指数增长(cwnd *= 2)。直到 cwnd 达到慢启动阈值(ssthresh)或发生丢包。
  2. 拥塞避免(Congestion Avoidance)
    目的:接近网络容量时转为线性增长,避免激进引发拥塞。
    规则:当 cwnd >= ssthresh 时,每 RTT(往返时间)cwnd += 1 MSS。增长速率从指数变为线性。
  3. 快速重传(Fast Retransmit)
    目的:避免等待超时,快速恢复丢失的包。
    规则:如果发送方收到 3 个重复 ACK(DupACK),立即重传丢失的包。无需等待超时计时器(RTO)到期。
  4. 快速恢复(Fast Recovery)
    目的:在快速重传后避免重置 cwnd,保持较高吞吐量。
    规则:发生快速重传后,ssthresh = cwnd / 2,cwnd = ssthresh + 3 MSS。每收到一个 DupACK,cwnd += 1 MSS(允许发送新数据)。收到新数据的 ACK 后,退出快速恢复,进入拥塞避免阶段。

TCP和UDP的区别

  • TCP:面向连接,需三次握手建立可靠通道。确保数据可靠传输(确认、重传、排序)。通过滑动窗口和拥塞算法(如慢启动)优化传输。头部较大(至少20字节),延迟较高。字节流模式,无固定边界。
  • UDP:无连接,直接发送数据包。不保证可靠性,可能丢包或乱序。无控制机制,全速发送。头部仅8字节,开销小,延迟低。:保留数据报边界,接收与发送一致。

TCP的粘包和拆包

  • 粘包 (Packet Sticking)
    定义:发送方发送的多个数据包被接收方当作一个数据包接收

  • 拆包 (Packet Splitting)
    定义:发送方发送的一个数据包被接收方拆分成多个数据包接收

产生原因

  • 共同原因

    • TCP是面向流的协议:没有消息边界概念,数据被视为字节流
    • 滑动窗口机制:为提高效率可能合并或拆分数据包
  • 粘包特定原因

    • Nagle算法:合并小包减少网络传输次数
    • 发送方快速连续发送小包:内核缓冲区可能合并
  • 拆包特定原因

    • 数据包大于MSS(最大报文段长度):TCP必须拆分
    • 数据包大于接收缓冲区:应用层读取时可能分多次
    • 网络设备限制:某些网络设备对包大小有限制

解决方案

  1. 消息定长法:每个消息固定长度,不足补位
  2. 分隔符法:使用特殊字符作为消息边界
  3. 长度前缀法:在消息前添加长度字段,通常使用固定字节表示长度(如4字节)

HTTP相关

HTTP/1.0

  • 特点
    短连接:每个请求/响应后关闭 TCP 连接(高延迟)。
    无状态:每次请求需携带完整头部(无 Host 字段,无法支持虚拟主机)。
  • 基础功能:支持 GET、POST、HEAD 方法。
  • 缺点
    性能差:频繁建立 TCP 连接,高延迟。
    无 Host 头:无法区分同一 IP 的不同域名。

HTTP/1.1

  • 改进
    持久连接(Keep-Alive):默认复用 TCP 连接,减少握手开销。
    管道化(Pipelining):允许连续发送多个请求(但响应必须按序返回,易阻塞)。
    Host 头:支持虚拟主机(一个 IP 托管多个网站)。
    分块传输(Chunked Encoding):支持流式传输大文件。
    缓存控制:新增 Cache-Control、ETag 等头部。
  • 缺点
    队头阻塞(Head-of-Line Blocking):同一连接中,前一个请求未完成会阻塞后续请求。
    头部冗余:每次请求携带重复头部(如 Cookie、User-Agent)。

HTTP/2

  • 改进
    二进制协议:替代文本格式,解析更高效。
    多路复用(Multiplexing):单个连接并行传输多个请求/响应,解决队头阻塞。
    头部压缩(HPACK):减少冗余头部大小。
    服务器推送(Server Push):服务器可主动推送资源(如 CSS/JS)。
    流优先级:允许设置请求优先级。
  • 缺点
    仍依赖 TCP:TCP 层的队头阻塞问题未解决(如丢包导致所有流等待重传)。
    握手延迟:TLS 非强制(但主流浏览器要求 HTTPS)。

HTTP/3

  • 改进
    基于 QUIC 协议:运行在 UDP 上,替代 TCP。
    0-RTT 握手:减少连接建立时间。
    内置加密:默认使用 TLS 1.3。
    解决 TCP 队头阻塞:每个流独立传输,丢包不影响其他流。
    改进的多路复用:更高效的资源并行加载。
  • 缺点
    部署复杂:需要服务器和客户端支持 QUIC(如 Cloudflare、Nginx 已支持)。
    UDP 被某些网络限制:可能被防火墙拦截。

HTTPS(HTTP + TLS/SSL)

  • 特点
    加密传输:使用 TLS/SSL 加密数据,防止窃听和篡改。
    身份验证:通过证书验证服务器身份。
    混合加密:非对称加密(握手) + 对称加密(数据传输)。
  • 与 HTTP 的关系
    可搭配任何 HTTP 版本(如 HTTPS/1.1、HTTPS/2)。
    HTTP/3 默认加密(QUIC 内置 TLS 1.3)。

HTTPS 连接建立流程

  1. TCP 三次握手
    客户端与服务器建立 TCP 连接(SYN → SYN-ACK → ACK)。
  2. TLS 握手
    • Client Hello:客户端发送支持的加密算法列表和随机数(Client Random)。
    • Server Hello:服务器选择加密算法,返回随机数(Server Random)和数字证书(含公钥)。
    • 验证证书:客户端用 CA 公钥验证证书真实性。
    • 密钥交换:
      • 客户端生成 Pre-Master Key,用服务器公钥加密后发送。
      • 双方通过 Client Random + Server Random + Pre-Master Key 生成会话密钥(对称加密密钥)。
  3. 加密通信
    使用会话密钥加密传输 HTTP 数据,防止窃听和篡改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《JVM考古现场(十四):混沌重启——从量子永生到宇宙热寂的终极编译》

开篇:熵火燎原量子递归的终极突围 "当《诛仙剑阵》的时空冻结算法遭遇量子递归暴走,当Project Omega的热寂代码在JVM的十三维堆内存中坍缩,此刻我们即将撕开归墟晶壁,直面从玻尔兹曼大脑到冯诺依曼架构的终极对决&#xff0…

【django】2-2 (django配置) 数据库配置、缓存配置

文章目录 5 数据库配置5.1 常用配置项5.2 数据库配置示例5.3 其它数据库配置选项 6 缓存6.1 常用配置项6.2 内置的缓存后端6.3 缓存配置示例6.4 缓存中间件的配置 创建django项目后,会自动生成初始的项目文件如下: manage.py # 管理django项目…

【博客】使用GithubAction自动同步obisidian和hexo仓库

使用Github Action自动同步obisidian和hexo仓库,避免手动操作。 本文首发于❄慕雪的寒舍 1. 烦恼 先来说说慕雪现在的笔记和博客是怎么管理的吧,我正在使用两套笔记软件 思源笔记:私密性高一些,不是博客的笔记都在这里面。由于思…

scala简介和基础语法

Scala简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。Scala 源代码被编译成 Java 字节码,所以它可…

7.4考研408数据结构B树与B+树专题深度解析

考研408数据结构B树与B+树专题深度解析 一、B树(B-Tree) 1.1 定义与性质 定义: B树是一种平衡多路查找树,满足以下条件: 阶数:每个结点最多有 m m m个子树( m ≥

WEB安全--RCE--RCE的危险函数

一、命令执行 1.1、命令执行原理 <?php $cmd $_GET[cmd]; // 直接获取用户输入 system($cmd); // 不安全 ?>#payload: http://example.com/vuln.php?cmdwhoami#结果: www-data 1.2、危险函数 1.2.1、system() 介绍&#xff1a; 执行外部命令&#xff0c;将命令…

Linux C++ 利用 io_uring 技术批量读取 tun 文件描述符的数据。

以下是参考的实现代码&#xff0c;IO_URING 操作必须要进行按页大小对齐&#xff08;仅在O_DIRECT直接I/O下&#xff09;&#xff0c;不能是非对称的&#xff0c;一般大多数操作系统页大小为&#xff1a;4KB。 批量读取、writev 批量简写。 static constexpr int MTU ITap::M…

时序数据库:InfluxDB命令行操作

学习 InfluxDB 的命令行操作至关重要&#xff0c;它不仅是与数据库直接交互的工具&#xff0c;也是理解 InfluxDB 核心概念的关键途径。通过命令行&#xff0c;用户可以高效地执行数据库管理、数据查询和插入等任务&#xff0c;深入掌握 InfluxQL 的语法及功能。这对于调试、快…

Bootstrap 表格:高效布局与动态交互的实践指南

Bootstrap 表格:高效布局与动态交互的实践指南 引言 Bootstrap 是一个流行的前端框架,它为开发者提供了丰富的组件和工具,使得构建响应式、美观且功能丰富的网页变得更加简单。表格是网页中常见的元素,用于展示数据。Bootstrap 提供了强大的表格组件,可以帮助开发者轻松…

⑥ ACG-系统管理

上网管理行为是指对员工在工作时间内使用公司网络的行为进行管理和监督。在企业中&#xff0c;系统管理是实施上网管理行为的重要方式之一。系统管理包括以下几个方面&#xff1a; 1. 访问控制&#xff1a;通过设置网络访问权限&#xff0c;对员工访问特定网站或使用特定应用程…

【Docker】Dockerfile 优化工具 hadolint

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】&#xff08;全…

接口自动化——初识pytest

缩写单词含义.passed通过Ffailed失败&#xff08;用例执行时报错&#xff09;Eerror出错&#xff08;fixture执行报错&#xff09;sskipped跳过Xxpassed预期外的通过&#xff08;不符合预期&#xff09;xxfailed预期内的失败&#xff08;符合预期&#xff09; 1.pytest 配置 1…

leetcode日记(100)填充每个节点的下一个右侧节点指针

和层序遍历差不多的思路&#xff0c;将节点储存在队列里&#xff0c;一边取出节点一边放入取出节点的左右节点&#xff0c;直到队列空。 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NU…

MySQL配置文件my.cnf详解

目前使用的服务器系统是CentOS8.5 ,针对MySql8.4的配置示例&#xff0c;自己根据实际情况修改。 安装MySql8.4时&#xff0c;MySql8.4没有默认的my.cnf,需要用户根据需要自行配置my.cnf文件&#xff0c;大概可看到下面这样的参数列表&#xff0c;可能不同版本的mysql参数多少会…

【解决】XCode不支持旧版本的iOS设备

办法&#xff1a; 手动添加设备支持文件&#xff08;暂时解决方式&#xff09; 如果您无法立即升级 Xcode&#xff0c;也可以通过下载设备支持文件来暂时解决问题。 检查当前设备的 iOS 版本&#xff1a; 连接设备到 Mac&#xff0c;打开 Xcode 查看提示的 iOS 版本。例如&…

每日c/c++题 备战蓝桥杯(全排列问题)

题目描述 按照字典序输出自然数 1 到 n 所有不重复的排列&#xff0c;即 n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼n 组成的所有不重复的数字序列&#xff0c;每行一个序列。 每个数字保留 5 个场…

注意力蒸馏技术

文章目录 摘要abstract论文摘要简介方法预备知识注意力蒸馏损失注意力引导采样 实验结论总结参考文献 摘要 本周阅读了一篇25年二月份发表于CVPR 的论文《Attention Distillation: A Unified Approach to Visual Characteristics Transfer》,论文开发了Attention Distillation…

flutter android端抓包工具

flutter做的android app&#xff0c;使用fiddler抓不了包&#xff0c;现介绍一款能支持flutter的抓包工具Reqable&#xff0c;使用方法如下&#xff1a; 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk&#xf…

PyTorch单机多卡训练(DataParallel)

PyTorch单机多卡训练 nn.DataParallel 是 PyTorch 中用于多GPU并行训练的一个模块&#xff0c;它的主要作用是将一个模型自动拆分到多个GPU上&#xff0c;并行处理输入数据&#xff0c;从而加速训练过程。以下是它的核心功能和工作原理&#xff1a; 1、主要作用 数据并行&am…

PyTorch中的Tensor

PyTorch中的Tensor‌ 是核心数据结构&#xff0c;类似于 NumPy 的多维数组&#xff0c;但具备 GPU 加速和自动求导等深度学习特性。 一、基本概念 ‌核心数据结构‌ Tensor 是存储和操作数据的基础单元&#xff0c;支持标量&#xff08;0D&#xff09;、向量&#xff08;1D&am…