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

news2025/6/5 4:04:03

目录

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.coloradmin.cn/o/2396836.html

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

相关文章

树欲静而风不止,子欲养而亲不待

2025年6月2日&#xff0c;13~26℃&#xff0c;一般 待办&#xff1a; 物理2 、物理 学生重修 职称材料的最后检查 教学技能大赛PPT 遇见&#xff1a;使用通义创作了一副照片&#xff0c;很好看&#xff01;都有想用来创作自己的头像了&#xff01; 提示词如下&#xff1a; A b…

Kotlin中的::操作符详解

Kotlin提供了::操作符&#xff0c;用于创建对类或对象的成员(函数、属性)的引用。这种机制叫做成员引用(Member Reference)。这是Kotlin高阶函数和函数式编程的重要组成部分。 简化函数传递 在Java中&#xff0c;我们这样传方法&#xff1a; list.forEach(item -> System.…

深入详解编译与链接:翻译环境和运行环境,翻译环境:预编译+编译+汇编+链接,运行环境

目录 一、翻译环境和运行环境 二、翻译环境&#xff1a;预编译编译汇编链接 &#xff08;一&#xff09;预处理&#xff08;预编译&#xff09; &#xff08;二&#xff09;编译 1、词法分析 2、语法分析 3、语义分析 &#xff08;三&#xff09;汇编 &#xff08;四&…

定时任务:springboot集成xxl-job-core(二)

定时任务实现方式&#xff1a; 存在的问题&#xff1a; xxl-job的原理&#xff1a; 可以根据服务器的个数进行动态分片&#xff0c;每台服务器分到的处理数据是不一样的。 1. 多台机器动态注册 多台机器同时配置了调度器xxl-job-admin之后&#xff0c;执行器那里会有多个注…

DeviceNET转EtherCAT网关:医院药房自动化的智能升级神经中枢

在现代医院药房自动化系统中&#xff0c;高效、精准、可靠的设备通信是保障患者用药安全与效率的核心。当面临既有支持DeviceNET协议的传感器、执行器&#xff08;如药盒状态传感器、机械臂限位开关&#xff09;需接入先进EtherCAT高速实时网络时&#xff0c;JH-DVN-ECT疆鸿智能…

一:UML类图

一、类的设计 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 学习设计模式的第一步是看懂UML类图,类图能直观的表达类、对象之间的关系,这将有助于后续对代码的编写。 类图在软件设计及应用框架前期设计中是不可缺少的一部分,它的主要成分包括:类名、…

Java 中 MySQL 索引深度解析:面试核心知识点与实战

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Java 中 MySQL 索引深度解析&#xff1a;面试…

设计模式之结构型:装饰器模式

装饰器模式(Decorator Pattern) 定义 装饰器模式是一种​​结构型设计模式​​&#xff0c;允许​​动态地为对象添加新功能​​&#xff0c;而无需修改其原始类。它通过将对象包装在装饰器类中&#xff0c;以​​组合代替继承​​&#xff0c;实现功能的灵活扩展(如 Java I/O …

MySQL安装及启用详细教程(Windows版)

MySQL安装及启用详细教程&#xff08;Windows版&#xff09; &#x1f4cb; 概述 本文档将详细介绍MySQL数据库在Windows系统下的下载、安装、配置和启用过程。 &#x1f4e5; MySQL下载 官方下载地址 官方网站: https://dev.mysql.com/downloads/社区版本: https://dev.my…

【HarmonyOS Next之旅】DevEco Studio使用指南(二十九) -> 开发云数据库

目录 1 -> 开发流程 2 -> 创建对象类型 3 -> 添加数据条目 3.1 -> 手动创建数据条目文件 3.2 -> 自动生成数据条目文件 4 -> 部署云数据库 1 -> 开发流程 云数据库是一款端云协同的数据库产品&#xff0c;提供端云数据的协同管理、统一的数据模型和…

批量导出CAD属性块信息生成到excel——CAD C#二次开发(插件实现)

本插件可实现批量导出文件夹内大量dwg文件的指定块名的属性信息到excel&#xff0c;效果如下&#xff1a; 插件界面&#xff1a; dll插件如下&#xff1a; 使用方法&#xff1a; 1、获取此dll插件。 2、cad命令行输入netload &#xff0c;加载此dll&#xff08;要求AutoCAD&…

Goreplay最新版本的安装和简单使用

一&#xff1a;概述 Gor 是一个开源工具&#xff0c;用于捕获实时 HTTP 流量并将其重放到测试环境中&#xff0c;以便使用真实数据持续测试您的系统。它可用于提高对代码部署、配置更改和基础设施更改的信心。简单易用。 项目地址&#xff1a;buger/goreplay: GoReplay is an …

Android Studio 解决报错 not support JCEF 记录

问题&#xff1a;Android Studio 安装Markdown插件后&#xff0c;报错not support JCEF不能预览markdown文件。 原因&#xff1a;Android Studio不是新装&#xff0c;之前没留意IDE自带的版本是不支持JCEF的。 解决办法&#xff1a; 在菜单栏选中Help→Find Action&#xff…

sigmastar实现SD卡升级

参考文章:http://wx.comake.online/doc/DD22dk2f3zx-SSD21X-SSD22X/customer/development/software/Px/zh/sys/P3/usb%20&%20sd%20update.html#21-sd 1、构建SD卡升级包 在project下make image完成后使用make_sd_upgrade_sigmastar.sh脚本打包SD卡升级包。 ./make_sd_up…

kafka学习笔记(三、消费者Consumer使用教程——配置参数大全及性能调优)

本章主要介绍kafka consumer的配置参数及性能调优的点&#xff0c;其kafka的从零开始的安装到生产者&#xff0c;消费者的详解介绍、源码及分析及原理解析请到博主kafka专栏 。 1.消费者Consumer配置参数 配置参数默认值含义bootstrap.servers无&#xff08;必填&#xff09;…

【论文笔记】Transcoders Find Interpretable LLM Feature Circuits

Abstract 机制可解释性(mechanistic interpretability)的核心目标是路径分析(circuit analysis)&#xff1a;在模型中找出与特定行为或能力对应的稀疏子图。 然而&#xff0c;MLP 子层使得在基于 Transformer 的语言模型中进行细粒度的路径分析变得困难。具体而言&#xff0c;…

每天总结一个html标签——a标签

文章目录 一、定义与使用说明二、支持的属性三、支持的事件四、默认样式五、常见用法1. 文本链接2. 图片链接3. 导航栏 在前端开发中&#xff0c;a标签&#xff08;锚点标签&#xff09;是最常用的HTML标签之一&#xff0c;主要用于创建超链接&#xff0c;实现页面间的跳转或下…

android binder(1)基本原理

一、IPC 进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;机制&#xff0c;用于解决不同进程间的数据交互问题。 不同进程之间用户地址空间的变量和函数是不能相互访问的&#xff0c;但是不同进程的内核地址空间是相同和共享的&#xff0c;我们可…

行业分析---小米汽车2025第一季度财报

1 背景 最近几年是新能源汽车的淘汰赛&#xff0c;前短时间比亚迪再次开始了降价&#xff0c;导致一片上市车企的股价大跌&#xff0c;足见车圈现在的敏感度。因此笔者会一直跟踪新势力车企的财报状况&#xff0c;对之前财报分析感兴趣的读者朋友可以参考以下博客&#xff1a;…

边缘计算网关支撑医院供暖系统高效运维的本地化计算与边缘决策

一、项目背景 医院作为人员密集的特殊场所&#xff0c;对供暖系统的稳定性和高效性有着极高的要求。其供暖换热站传统的人工现场监控方式存在诸多弊端&#xff0c;如人员值守成本高、数据记录不及时不准确、故障发现和处理滞后、能耗难以有效监测和控制等&#xff0c;难以满足…