计算机网络 TCP篇常见面试题总结

article/2025/7/28 16:54:12

目录

TCP 的三次握手与四次挥手详解

1. 三次握手(Three-Way Handshake)

2. 四次挥手(Four-Way Handshake)

TCP 为什么可靠?

1. 序列号与确认应答(ACK)

2. 超时重传(Retransmission)

3. 滑动窗口(Sliding Window)

4. 拥塞控制(Congestion Control)

5. 校验和(Checksum)

6. 面向连接

总结对比

TCP滑动窗口

三次握手期间的窗口协商

数据传输阶段的窗口动态调整

关键细节补充 

1. 窗口大小与拥塞控制的关系

2. 糊涂窗口综合征(SWS)

3. 窗口探测(Window Probe)

TCP和UDP有什么区别

核心设计目标

协议格式对比

TCP报文结构

UDP报文结构

典型应用场景

可靠性机制对比

总结选择策略

TCP的粘包和拆包

基本概念

成因分析

如何解决粘包和拆包


TCP 的三次握手与四次挥手详解

1. 三次握手(Three-Way Handshake)

TCP 建立连接时通过三次握手同步初始序列号(ISN)并协商窗口大小,确保双方具备发送和接收能力。流程如下:

  • 客户端 → 服务器(SYN 包)

    • 客户端发送 SYN 包,携带初始序列号(ISN<sub>c</sub>)和窗口大小,请求建立连接。
    • 标志位:SYN=1ACK=0
  • 服务器 → 客户端(SYN+ACK 包)

    • 服务器收到 SYN 后,分配资源并发送 SYN+ACK 包:
      • 确认号(ACK)= ISN<sub>c</sub>+1(表示已收到客户端 SYN)。
      • 自身初始序列号(ISN<sub>s</sub>)和窗口大小。
    • 标志位:SYN=1ACK=1
  • 客户端 → 服务器(ACK 包)

    • 客户端收到 SYN+ACK 后,发送 ACK 包:
      • 确认号(ACK)= ISN<sub>s</sub>+1(表示已收到服务器 SYN)。
    • 此时双方进入ESTABLISHED状态,开始传输数据。

关键作用

  • 防止过时的连接请求(如网络延迟导致的重复 SYN)干扰新连接。
  • 同步双方初始序列号,为可靠传输奠定基础。
2. 四次挥手(Four-Way Handshake)

TCP 关闭连接时通过四次挥手确保数据完全传输完毕。流程如下:

  • 主动关闭方 → 被动关闭方(FIN 包)

    • 主动方(如客户端)发送 FIN 包,表示 “我已无数据要发送”,但仍可接收数据。
    • 标志位:FIN=1ACK=1
  • 被动关闭方 → 主动关闭方(ACK 包)

    • 被动方(如服务器)确认 FIN,发送 ACK 包:
      • 确认号(ACK)= 收到的 FIN 序列号 + 1。
    • 此时主动方进入FIN_WAIT_2状态,被动方进入CLOSE_WAIT状态。
  • 被动关闭方 → 主动关闭方(FIN 包)

    • 被动方数据发送完毕后,发送 FIN 包,表示 “我也无数据要发送”。
    • 标志位:FIN=1ACK=1
  • 主动关闭方 → 被动关闭方(ACK 包)

    • 主动方确认 FIN,发送 ACK 包:
      • 确认号(ACK)= 收到的 FIN 序列号 + 1。
    • 主动方进入TIME_WAIT状态(持续 2MSL,防止 ACK 丢失导致被动方重发 FIN),最终双方关闭连接(确保至少留有一次ACK丢失的容错)。

关键作用

  • 确保双方数据均已完全发送和接收。
  • 优雅释放网络资源,避免端口占用。

TCP 为什么可靠?

TCP 通过以下机制实现可靠传输:

1. 序列号与确认应答(ACK)
  • 序列号(Sequence Number)
    每个 TCP 段携带数据的首字节序列号,接收方通过序列号按序重组数据。
  • 确认应答(ACK)
    接收方返回的 ACK 号表示 “期望接收的下一个字节序列号”,确保数据不丢失。
    例如:若发送方发送序列号 100-200 的数据包,接收方返回 ACK=201,表示已收到 100-200 并期待 201。
2. 超时重传(Retransmission)
  • 发送方为每个数据包设置定时器,若超时未收到 ACK,则重发该数据包。
  • 快速重传:若接收方连续收到 3 个相同 ACK(如 ACK=201),表明中间段(如 201-300)丢失,发送方立即重传,无需等待超时。
3. 滑动窗口(Sliding Window)
  • 动态调整发送窗口和接收窗口大小,实现流量控制:
    • 发送窗口 = min (接收方通告窗口,拥塞窗口)。
    • 接收方通过 ACK 中的窗口字段告知发送方自身缓冲区剩余空间,防止过载。
4. 拥塞控制(Congestion Control)
  • 防止网络过载,通过调整拥塞窗口(cwnd)实现:
    • 慢启动:初始 cwnd=1MSS,每收到一个 ACK 则 cwnd+1,指数增长至阈值(ssthresh)。
    • 拥塞避免:超过阈值后,每轮 RTT 仅 cwnd+1,线性增长。
    • 拥塞发生时:将 ssthresh 降至当前 cwnd 的一半,cwnd 重置为 1MSS,重新进入慢启动。
5. 校验和(Checksum)
  • 每个 TCP 段包含校验和字段,接收方通过校验和验证数据完整性,若错误则丢弃并等待重传。
6. 面向连接
  • 通过三次握手建立连接,四次挥手关闭连接,确保双方状态同步,避免数据丢失。
总结对比
特性三次握手四次挥手TCP 可靠性机制
目的建立连接,同步 ISN 和窗口大小关闭连接,确保数据完全传输保证数据准确、有序、无丢失
核心动作SYN → SYN+ACK → ACKFIN → ACK → FIN → ACK序列号、ACK、重传、窗口、校验和
状态转换CLOSED → SYN_SENT → ESTABLISHEDESTABLISHED → FIN_WAIT_1 → ... → CLOSED持续维护发送 / 接收状态
可靠性保障防止过时连接干扰确保资源优雅释放端到端的数据传输质量保证

TCP滑动窗口

TCP 滑动窗口的初始值是在三次握手过程中协商确定的,之后在数据传输阶段会根据网络状况和接收方缓冲区状态动态调整。具体机制如下: 

三次握手期间的窗口协商

初始窗口大小的交换

  • 客户端 → 服务器(SYN 包)
    客户端在 SYN 包中通过Window Size字段(16 位)告知服务器自己初始接收窗口的大小(单位:字节)。例如,若客户端发送Window = 65535,表示客户端初始能接收 65535 字节的数据。
  • 服务器 → 客户端(SYN+ACK 包)
    服务器在响应的 SYN+ACK 包中,同样通过Window Size字段告知客户端自己的初始接收窗口大小。
  • 窗口扩大因子(Window Scaling)
    若双方支持Window Scaling选项(通过 TCP 选项协商),实际窗口大小 = 窗口字段值 × 2^ 缩放因子(例如,缩放因子为 2,则窗口大小 = 65535×4=262140 字节)。

数据传输阶段的窗口动态调整

窗口滑动机制

  • 发送方窗口
    发送方维护两个指针:SND.UNA(已发送但未确认的最早字节)和SND.NXT(下一个要发送的字节),窗口大小 = 接收方通告的窗口值(通过 ACK 包携带)。
  • 接收方窗口
    接收方通过 ACK 包中的Window字段告知发送方自己当前的可用缓冲区大小。例如:
    • 若接收方处理数据缓慢,缓冲区接近满,则发送Window = 0,触发发送方的窗口探测机制
    • 若接收方处理完一批数据,缓冲区空闲,则增大窗口值(如Window = 131072)。

 

关键细节补充 
1. 窗口大小与拥塞控制的关系
  • 实际发送窗口 = min (接收方通告窗口,拥塞窗口)
    接收方窗口由接收方缓冲区决定,拥塞窗口由发送方根据网络拥塞情况动态调整(如慢启动、拥塞避免算法)。
2. 糊涂窗口综合征(SWS)
  • 接收方优化
    若接收方缓冲区仅释放少量空间(如 512 字节),可能暂不发送窗口更新,而是等待缓冲区释放更多空间(如≥MSS)后再通知发送方。
  • 发送方优化
    若发送方有少量数据(如 100 字节)要发送,可能等待积累到 MSS(如 1460 字节)后再发送,避免产生小数据包。
3. 窗口探测(Window Probe)
  • 当接收方窗口为 0 时,发送方会定期发送窗口探测包(仅含 1 字节数据),迫使接收方返回最新窗口大小,防止连接饿死。

TCP和UDP有什么区别

核心设计目标
TCPUDP
面向连接:通过三次握手建立连接,四次挥手关闭连接,确保通信双方状态同步。无连接:无需建立连接,直接发送数据,资源开销小。
可靠传输:确保数据准确、有序到达,通过序列号、ACK、重传等机制实现。不可靠传输:不保证数据到达顺序或完整性,可能丢包、乱序。
流量控制:通过滑动窗口动态调整发送速率,避免接收方过载。无流量控制:发送方按固定速率发送,接收方可能因来不及处理而丢包。
拥塞控制:根据网络拥塞状态调整发送窗口,避免网络崩溃。无拥塞控制:可能导致网络拥塞(如 UDP 洪水攻击)。
协议格式对比
字段TCP 头部(20 字节基础)UDP 头部(8 字节)
源端口16 位16 位
目的端口16 位16 位
序列号32 位(用于有序重组数据)
确认号32 位(用于 ACK 应答)
窗口大小16 位(用于流量控制)
校验和16 位(强制)16 位(可选,IPv4 中可忽略)
标志位SYN、ACK、FIN、RST、PSH、URG 等
TCP报文结构

UDP报文结构

指标TCPUDP
传输效率低(头部开销大,需维护连接状态)高(头部仅 8 字节,无连接开销)
实时性低(重传、排序等引入延迟)高(无重传,延迟小)
吞吐量稳定(拥塞控制避免网络崩溃)不稳定(可能因网络拥塞丢包)
资源占用高(需维护连接状态表)低(无连接状态)
典型应用场景
场景TCP 适用UDP 适用
Web 浏览(HTTP)✅ 需可靠传输,避免页面错乱❌ 不可靠传输可能导致页面缺失
文件传输(FTP)✅ 确保文件完整无误❌ 丢包会导致文件损坏
电子邮件(SMTP)✅ 邮件内容必须完整送达❌ 不可靠传输会导致邮件丢失
实时音视频❌ 重传会加剧延迟,影响体验✅ 容忍少量丢包,优先保证实时性
DNS 查询❌ 单次查询延迟高(需握手)✅ 快速响应,少量丢包可重试
游戏联机❌ 角色位置同步需低延迟✅ 允许少量预测误差,优先流畅性
可靠性机制对比
机制TCPUDP
连接管理三次握手建立连接,四次挥手关闭无连接过程
序列号与 ACK强制使用,确保数据有序性
超时重传支持(快速重传 + 超时重传)无(需应用层自行实现)
滑动窗口支持流量控制和拥塞控制
错误校验强制校验和,保证数据完整性可选校验和(IPv4 中常忽略)
总结选择策略
  • 选 TCP:当可靠性比性能更重要时(如文件传输、网页浏览)。
  • 选 UDP:当实时性比可靠性更重要时(如视频会议、游戏),或应用层自行实现可靠性机制(如 QUIC 协议)。

TCP的粘包和拆包

基本概念

TCP 是面向字节流的协议,其传输的数据无边界。发送方连续发送的多个数据包(如多次send()),在接收方可能呈现为:

  • 粘包:多个数据包被 “粘” 在一起,接收方一次读取到多个完整或不完整的包。
  • 拆包:一个数据包被 “拆分” 成多次接收,接收方需多次读取才能获取完整包。

示例场景
发送方依次发送两个数据包:[数据包1] 和 [数据包2],接收方可能收到:

  • 粘包[数据包1+数据包2](一次读取两个包)。
  • 拆包[数据包1的前半部分] 和 [数据包1的后半部分+数据包2](两次读取才完整)。
成因分析

TCP 粘包 / 拆包由以下因素共同导致:

  • TCP 的 Nagle 算法

    • 为减少网络中小数据包的数量,Nagle 算法会将短时间内的小数据包合并发送。
    • 例如:发送方先后调用send("HELLO")send("WORLD"),可能被合并为"HELLOWORLD"发送。
  • TCP 滑动窗口与拥塞控制

    • 发送窗口大小动态调整,若窗口较小,一个完整包可能被拆分为多次发送。
    • 例如:窗口大小为 1000 字节,而数据包大小为 1500 字节,则会被拆分为两个片段。
  • 接收缓冲区管理

    • 接收方缓冲区已满时,未完全接收的包会暂存,导致后续数据包与残留数据 “粘” 在一起。
  • 网络延迟与 MTU 限制

    • 网络层最大传输单元(MTU,通常为 1500 字节)会限制 TCP 数据包的大小,超过 MTU 的包会被 IP 层分片。
如何解决粘包和拆包
  • 粘包:这个思路其实很清晰,就是把它拆开呗,具体就是看怎么拆了,比如我们可以固定长度,我们规定每个包都是10个字节,那么就10个字节切一刀,这样拆开解析就ok了。
  • 半包:半包其实就是信息还不完整,我们需要等接收到全部的信息之后再作处理,当我们识别这是一个不完整的包时候,我们先hold住,不作处理,等待

数据完整再处理。这里关键点在于,我们如何才能知道此时完整了?上面说的固定长度其实也是一点,当然还有更多更好的解决方案,我们接着往下看。
实际常见解决粘包与半包问题有三个方案:

  • 固定长度:
  1. 每个数据包的总长度固定,不足部分填充特定字符(如\0)。
  2. 接收方按固定长度读取数据,确保每次读取对应一个完整包。
优点缺点
实现简单浪费带宽(需填充)
无需维护缓冲区不适合变长数据
解析速度快需预估最大长度
  • 分隔符
  1. 使用特殊字符(如\r\n\0)标记数据包的结束。
  2. 接收方需维护缓冲区,累积数据直到找到分隔符。
优点缺点
灵活支持变长数据需维护缓冲区
适合文本协议(如 HTTP)分隔符可能出现在数据中
实现较简单性能略低于固定长度
  • 固定长度字段+内容
  1. 在数据包头部添加固定长度的字段(如 4 字节整数),指示包的总长度。
  2. 接收方先读取长度字段,再按长度读取完整数据。
优点缺点
高效处理任意长度数据实现复杂度较高
无需填充,节省带宽需处理多字节序问题
解析逻辑清晰需确保长度字段完整接收

选择建议

  • 若数据长度固定 → 优先用固定长度协议
  • 若为文本协议且分隔符不会出现在数据中 → 用分隔符协议
  • 若需高效处理任意长度数据 → 用长度前缀协议(现代协议主流方案)

http://www.hkcw.cn/article/DHAnbnxKGl.shtml

相关文章

系统架构设计师(一):计算机系统基础知识

系统架构设计师&#xff08;一&#xff09;&#xff1a;计算机系统基础知识 引言计算机系统概述计算机硬件处理器处理器指令集常见处理器 存储器总线总线性能指标总线分类按照总线在计算机中所处的位置划分按照连接方式分类按照功能分类 接口接口分类 计算机软件文件系统文件类…

软件无线电关键技术之正交调制技术

与传统调制方式相比&#xff0c;IQ 调制不直接对相位或频率调制&#xff0c;而是简单的对载波及其正交量进行线性调制&#xff0c;进而达到相位或频率调制的效果。IQ 调制具有较高的数据传输速率&#xff0c;高频带利用率&#xff0c;可有效抑制镜频边带以及易于实现等优势&…

comfyui利用 SkyReels-V2直接生成长视频本地部署问题总结 1

在通过桌面版comfyUI 安装ComfyUI-WanVideoWrapper 进行SkyReels-V2 生成长视频的过程中&#xff0c;出现了&#xff0c;很多错误。 总结一下&#xff0c;让大家少走点弯路 下面是基于搜索结果的 ComfyUI 本地部署 SkyReels-V2 实现长视频生成的完整指南&#xff0c;涵盖环境配…

性能优化 - 案例篇:缓存

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…

高速串行通信解惑说明

什么是逗号检测&#xff1f; 逗号检测&#xff0c;就是gt在发送数据的时候&#xff0c;一直在发送。这个时候使用一个标识符将数据隔开&#xff0c;用来对齐数据。&#xff08;类似人说明的停顿或者写文章中的标点符号&#xff09;逗号的两个作用&#xff0c;一个是将数据包隔…

724.寻找数组的中心下标前缀和

题目链接&#xff1a; https://leetcode.cn/problems/find-pivot-index/ 这道题目我们可以使用暴力解法&#xff0c;就一个下标前数组之和&#xff0c;再求一个下标后数组之和&#xff0c;时间复杂度达到n方&#xff0c;我们来写一下&#xff1a; int pivotIndex(vector<in…

Python----目标检测(《SSD: Single Shot MultiBox Detector》论文和SSD的原理与网络结构)

一、SSD&#xff1a;单次多框检测器 1.1、基本信息 标题&#xff1a;SSD: Single Shot MultiBox Detector 作者&#xff1a;Wei Liu (UNC Chapel Hill), Dragomir Anguelov (Zoox Inc.), Dumitru Erhan, Christian Szegedy (Google Inc.), Scott Reed (University of Michiga…

[Windows]在Win上安装bash和zsh - 一个脚本搞定

目录 前言安装步骤配置要求下载安装脚本启动程序 前言 Windows是一个很流行的系统, 但是在Windows上安装bash和zsh一直是一个让人头疼的问题. 本蛙特意打包了一个程序, 用于一站式解决这一类的问题. 安装步骤 配置要求 系统: Windows软件: Powershell 5.1或以上 下载安装…

从0开始学习R语言--Day13--混合效应与生存分析

混合效应模型&#xff08;Mixed Effects Model&#xff09; 对于数据来说&#xff0c;我们通常把所有样本共有的影响因素&#xff08;性别&#xff0c;实验处理&#xff0c;实验方法&#xff09;&#xff0c;这种可以推广到总体的叫做固有效应&#xff0c;而仅适用于特定分组的…

【前端】javascript和Vue面试八股

面试暂时没有遇到过考这么深的&#xff0c;一般还是问一些生命周期和性能相关。 Q&#xff1a;什么情况下“ a 1 && a 2 && a 3 ”同时成立 A&#xff1a;对象的valueOf与toString方法&#xff1a;当一个对象与一个原始值&#xff08;如数字&#xff09;进…

某航后缀混淆逆向与顶像风控分析

文章目录 1. 写在前面2. 接口分析3. 加密分析4. 风控分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

【PostgreSQL 05】PostgreSQL扩展开发实战:从自定义函数到插件开发的完整指南

PostgreSQL扩展开发实战&#xff1a;从自定义函数到插件开发的完整指南 关键词&#xff1a; PostgreSQL扩展开发、自定义函数、插件开发、C语言扩展、SQL函数、存储过程、数据库扩展、PostgreSQL插件、PGXS、CREATE EXTENSION 摘要&#xff1a; 想让PostgreSQL拥有独特的超能力…

家政维修平台实战11搭建服务规格

目前首页的功能我们已经搭建好了&#xff0c;当用户点击某个服务内容的时候要跳转到详情页&#xff0c;详情页需要展示服务的各类信息&#xff0c;难点是在规格切换的时候价格也要跟上有变化。 在数据源设计部分我们还没有考虑规格的问题&#xff0c;本篇我们介绍一下服务规格…

【创新实训个人博客】实现了新的前端界面

我们的项目还需要ppt展示和文案展示 实现了新的html页面 对接口进行测试示例 启动app.py和aippt部分 使用postman发送请求测试大模型api 后端命令行返回

使用lighttpd和开发板进行交互

文章目录 &#x1f9e0; 一、Lighttpd 与开发板的交互原理1. 什么是 Lighttpd&#xff1f;2. 与开发板交互的方式&#xff1f; &#x1f9fe; 二、lighttpd.conf 配置文件讲解⚠️ 注意事项&#xff1a; &#x1f4c1; 三、目录结构说明&#x1f4a1; 四、使用 C 编写 CGI 脚本…

【无标题】安富莱V5程序移植到原子探索者F4控制板带TFT LCD显示屏

安富莱V5控制板用的控制器是STM32F407IGT&#xff0c; 原子探索者用的控制器是STM32F407ZGT6. 手里有原子探索者主控板2.8寸TFT LCD屏&#xff0c;需要把安富莱程序用于原子探索者硬件来运行和显示&#xff0c;经过一番折腾&#xff0c;成功运行。 省了安富莱的硬件&#xff0c…

【从0带做】基于Springboot3+Vue3的反炸宣传网站

大家好&#xff0c;我是武哥&#xff0c;最近给大家手撸了一个基于SpringBoot3Vue3的反炸宣传网站&#xff0c;可用于毕业设计、课程设计、练手学习&#xff0c;系统全部原创&#xff0c;如有遇到网上抄袭站长的&#xff0c;欢迎联系博主~ 资料获取方式 https://www.javaxm.c…

git 如何解决分支合并冲突(VS code可视化解决+gitLab网页解决)

1、定义&#xff1a;两个分支修改了同一文件的同一行代码&#xff0c;无法自动决定如何合并代码&#xff0c;需要人工干预的情况。&#xff08;假设A提交了文件a,此时B在未拉取代码的情况下&#xff0c;直接提交是会报错的&#xff0c;此时需要拉取之后再提交才会成功&#xff…

大规模、高规格、全品类,2025郑州台球展览会,8月启幕

-同聚中原共赢未来&#xff0c;42000㎡的大型台球盛会&#xff0c;将在8月15-17日&#xff0c;在郑州中原国际会展中心启幕&#xff0c;期待台球企业、品牌和买家客户届时参与。全称&#xff1a;壹肆柒2025中国&#xff08;郑州&#xff09;国际台球产业博览会&#xff0c;同期…

学习STC51单片机23(芯片为STC89C52RCRC)

每日一言 成功的路上从不拥挤&#xff0c;因为坚持的人不多&#xff0c;你要做那个例外。 通过单片机发指令给ESP8266进行通信 通信原理(也是接线原理) 代码如下 代码解释一下&#xff0c;因为我们的指令是字符数组&#xff08;c语言没有字符串的概念&#xff09;&#xff0c;…