深入解析 TCP 协议【真题】

传输控制协议(TCP)解析与题目解析

题目解析

关于传输控制协议(TCP)表述不正确的是?
A. 主机寻址
B. 进程寻址
C. 流量控制
D. 差错控制

TCP(Transmission Control Protocol)是面向连接、可靠传输传输层协议,用于需要数据传输可靠性保障的场景,如网页浏览(HTTP/HTTPS)、文件传输(FTP)等。

逐项分析

B. 进程寻址(正确)
TCP 通过 端口号(Port Number) 区分不同的应用程序,使多个进程能同时收发数据:

  • HTTP 使用 80 端口
  • HTTPS 使用 443 端口
  • FTP 使用 21 端口

C. 流量控制(正确)
TCP 提供流量控制(Flow Control),防止发送方数据发送过快,使接收方无法处理:

  • 滑动窗口(Sliding Window) 控制数据发送量,避免溢出。
  • 拥塞控制(Congestion Control) 避免网络过载,采用慢启动、拥塞避免、快重传等机制

D. 差错控制(正确)
TCP 确保数据完整性,避免传输错误:

  • 校验和(Checksum):检测数据包是否出错。
  • 确认机制(ACK):确保数据正确送达。
  • 超时重传(Timeout Retransmission):数据丢失时重新发送。

A. 主机寻址(错误)
主机寻址是网络层(IP 层)的任务,TCP 只负责端口管理:

  • IP 地址 负责主机寻址,在 IP 协议(Internet Protocol) 中完成。
  • TCP 依赖 IP 地址 进行数据传输,但本身不负责主机寻址

最终答案:A. 主机寻址(错误)


深入理解 TCP

1. TCP 主要特点

特性说明
面向连接三次握手 建立连接,四次挥手 断开连接
可靠传输采用 确认应答(ACK)、超时重传 机制
流量控制滑动窗口机制 限制数据发送速度
拥塞控制采用 慢启动、拥塞避免 等机制防止网络拥塞
面向字节流字节流 方式传输,而非独立数据包

2. TCP 连接管理

(1) TCP 三次握手(建立连接)

📌 目的:确保通信双方都准备好数据传输
1️⃣ 客户端发送 SYN(请求连接)
2️⃣ 服务器回复 SYN-ACK(确认连接)
3️⃣ 客户端回复 ACK(确认收到)
✅ 连接建立成功!

“你听得到吗?”(SYN)
“我听得到,你能听到吗?”(SYN-ACK)
“我能听到!”(ACK)

(2) TCP 四次挥手(断开连接)

📌 目的:确保双方安全断开,防止数据丢失
1️⃣ 客户端发送 FIN(请求断开)
2️⃣ 服务器回复 ACK(确认请求)
3️⃣ 服务器发送 FIN(服务器也要断开)
4️⃣ 客户端回复 ACK(确认收到)
✅ 连接完全断开!

“我要走了”(FIN)
“好,我知道了”(ACK)
“我也要走了”(FIN)
“好,拜拜”(ACK)


1. 为什么 TCP 需要三次握手而不是两次?

就像你和朋友打电话,需要确认双方的听说能力:

  1. :📞 “喂,你听得到吗?”(SYN)
  2. 朋友:📞 “我听得到,你能听到我吗?”(SYN-ACK)
  3. :📞 “我也能听到!咱们开始聊天吧!”(ACK)

如果只有两次握手,比如:

  1. :📞 “喂,你听得到吗?”(SYN)
  2. 朋友:📞 “我听得到。”(SYN-ACK)

那问题来了,你并没有确认自己也能听到朋友的声音,万一朋友以为你听到了,而你其实没听清,就会导致通信失败。因此,需要 三次握手 来确保双方都准备好通信。

解析
TCP 连接的建立采用 三次握手(Three-Way Handshake) 主要是为了确保通信双方都具备发送和接收能力,并且能正确同步初始序列号(ISN,Initial Sequence Number)。

三次握手过程
  • 第一次握手(SYN):客户端发送 SYN(同步序列号)报文,表示要建立连接,同时携带一个初始序列号 seq = x
  • 第二次握手(SYN-ACK):服务器收到 SYN 后,回复 SYN + ACK,表示收到请求,同时发送自己的 seq = y
  • 第三次握手(ACK):客户端收到服务器的 SYN + ACK 后,回复 ACK 确认连接建立,携带 ack = y + 1
为什么不能用两次握手?

如果只用 两次握手,可能会导致旧连接请求的干扰问题:

  • 设想 第一个 SYN 丢失,但 客户端重传了一个新的 SYN 并成功建立连接。
  • 但是旧的 SYN 可能在网络中滞留,并在某个时刻被服务器收到,此时服务器会认为客户端想要重新建立连接,并回复 SYN + ACK
  • 如果使用 两次握手,客户端会直接进入通信状态,导致服务器和客户端的状态不同步,从而出现错误的连接建立

三次握手通过 客户端在最后发送 ACK 确认,确保服务器知道客户端已经准备好进行数据传输,从而避免了旧 SYN 报文的干扰问题。


2. 为什么 TCP 需要四次挥手,而不是三次?

就像你和朋友打电话结束时,不能一方直接挂断,而是要确认对方也准备好挂断:

  1. :📞 “我不说了,你继续吧。”(FIN)
  2. 朋友:📞 “好的,我知道你不说了,但我还有点话要说。”(ACK)
  3. 朋友:📞 “我也说完了,我们挂电话吧。”(FIN)
  4. :📞 “收到,挂了!”(ACK)

如果只用三次挥手,比如:

  1. :📞 “我不说了,你继续吧。”(FIN)
  2. 朋友:📞 “我也说完了,我们挂电话吧。”(FIN)
  3. :📞 “收到,挂了!”(ACK)

问题来了,你没有确认朋友是否真的说完了,可能他还有话没说完,数据就会丢失。因此需要 四次挥手 来确保双方都真正完成通信。
解析
TCP 连接的释放采用 四次挥手(Four-Way Handshake),主要是为了确保双方都能安全地关闭连接,避免数据丢失。

四次挥手过程
  • 第一次挥手(FIN):客户端发送 FIN,表示不再发送数据,但仍能接收数据。
  • 第二次挥手(ACK):服务器收到 FIN 后,返回 ACK,表示收到断开请求,但可能还有数据要发送。
  • 第三次挥手(FIN):服务器处理完剩余数据后,主动发送 FIN,请求断开连接。
  • 第四次挥手(ACK):客户端收到服务器的 FIN 后,返回 ACK,并进入 TIME_WAIT 状态。
为什么不能用三次挥手?

TCP 采用 全双工通信,双方的数据发送和接收是独立的,因此需要 四次握手 确保:

  1. 客户端关闭发送(第一、二次握手),但仍能接收服务器数据。
  2. 服务器关闭发送(第三、四次握手),以确保剩余数据能被客户端接收。

如果采用 三次挥手,服务器可能在未完全发送完数据的情况下被强制关闭,导致数据丢失。


3. 为什么 TCP 需要 TIME_WAIT 状态?

想象你挂了电话,但仍然在原地等几秒,以防朋友发现自己话没说完,再补充一句话:

  1. 你挂了电话(发送最后的 ACK)。
  2. 但你不会立刻走开,而是 等 2 分钟,以防对方发现自己忘了说点什么,还能找你再确认。
  3. 如果 2 分钟内朋友没再打回来,你才真正离开。

这个 等待 2 分钟 就是 TIME_WAIT,确保连接真正关闭,不会有遗留信息影响新的通话。

解析
TIME_WAIT 是指客户端在发送 最后一个 ACK 之后,需要等待 2 * MSL(最大报文生存时间),确保服务器已经关闭连接。

TIME_WAIT 的作用
  1. 防止旧的 TCP 报文干扰新连接

    • 如果不等待直接关闭连接,旧的重复报文可能被新连接误认为是新的数据,造成混乱。
  2. 确保服务器已正确关闭

    • 服务器可能没有收到客户端的最后一个 ACK(ACK 丢失),因此它会重发 FIN
    • 如果客户端立刻关闭,服务器就无法收到 ACK,导致连接无法正确关闭。

TIME_WAIT 确保客户端能够处理服务器的重发 FIN,保证连接完整关闭。


TCP vs UDP

1. UDP(用户数据报协议)特点

特性UDP 说明
无连接发送数据前无需建立连接
不可靠可能会丢包、乱序、重复
面向报文数据以报文(Datagram) 形式发送
无流量控制发送方不关心接收方能否处理
低延迟适用于实时通信(视频会议、游戏)

2. TCP vs UDP 对比

特性TCPUDP
是否连接需要三次握手无需建立连接
传输可靠性可靠(有确认、重传)不可靠(可能丢失)
流量控制(滑动窗口)
适用场景HTTP、FTP、邮件DNS、视频、游戏

记忆技巧

📌 “TCP 像打电话📞,UDP 像寄快递📦”

  • TCP 先拨号(三次握手),确认通话后交流(可靠)。
  • UDP 直接寄快递,可能丢件(不可靠)。

TCP 流量控制(Flow Control)—— 滑动窗口机制

TCP 通过 滑动窗口机制(Sliding Window) 进行流量控制,防止发送方数据过快导致接收方处理不过来,从而保证网络稳定、高效。


1. 为什么需要流量控制?

  • 发送方和接收方的处理能力可能不同,比如:
    • 发送方是 高性能服务器,每秒能发送 10GB 数据
    • 接收方是 老旧设备,每秒最多能处理 1GB 数据
    • 如果没有流量控制,接收方就会被淹没,数据会丢失 ❌

TCP 需要调整发送速率,让接收方有足够的时间处理数据,这就是 流量控制 的作用。


2. 滑动窗口机制(Sliding Window)

TCP 通过滑动窗口协议来动态调整发送方的数据量。

🔹 核心概念

  • 发送窗口(Send Window):发送方可以连续发送的数据量
  • 接收窗口(Receive Window):接收方当前能存储的最大数据量
  • 确认ACK:接收方收到数据后,发送 ACK(确认号)通知发送方

📌 示例
假设:

  • 发送窗口大小 = 4,即最多能连续发送 4 个数据包
  • 发送方发送 D1, D2, D3, D4
  • 接收方收到后,发 ACK 确认
  • 窗口滑动,允许发送 D5, D6, D7, D8

3. 滑动窗口的工作过程

(1)初始状态

  • 发送窗口 = 4
  • 发送方可以发送 D1, D2, D3, D4
发送窗口D1D2D3D4D5D6D7D8
状态✅ 已发送✅ 已发送✅ 已发送✅ 已发送❌ 未发送❌ 未发送❌ 未发送❌ 未发送

(2)接收方确认后,窗口滑动

  • 接收方收到 D1、D2,并返回 ACK(3)(表示已收到 D1, D2)
  • 窗口滑动 2 格,允许发送方发送新的数据 D5, D6
发送窗口D3D4D5D6D7D8
状态✅ 已发送✅ 已发送✅ 已发送✅ 已发送❌ 未发送❌ 未发送

(3)丢包情况

  • 如果 D3 丢失,接收方不会发送 ACK(5),而是重传 D3
  • 窗口不滑动,直到 D3 被成功接收
  • 发送方超时后,会重新发送 D3,等待 ACK

4. 窗口大小如何确定?

接收方会在 ACK 中动态调整窗口大小(RWND, Receiver Window)

  • 如果接收方忙(缓冲区快满)窗口变小,减少发送数据
  • 如果接收方空闲(处理快)窗口变大,加快传输

📌 例子

  • 接收方缓冲区剩余 4KB,在 ACK 里告诉发送方 RWND=4KB
  • 发送方只会发送 4KB 数据,然后等待确认
  • 避免接收方缓冲区溢出

你的总结已经很清晰了,但可以再优化一下,使重点更突出、理解更直观。我会进行以下改进:

  1. 补充直观类比:用流水线仓库管理的比喻,让 TCP 流量控制、滑动窗口等概念更容易理解。
  2. 优化表格结构:将核心概念提炼得更简洁,突出关键词。
  3. 强调 TCP 机制的联系:比如流量控制和滑动窗口的关系。

5. 拓展:流量控制 vs 拥塞控制

TCP 流量控制(Flow Control)拥塞控制(Congestion Control) 类似,但作用不同:

机制目标触发条件主要手段
流量控制防止接收方被数据“压垮”接收方反馈 RWND(接收窗口)变小滑动窗口、ACK 确认
拥塞控制防止网络堵塞丢包、RTT 变大,网络变慢慢启动、拥塞避免、快速重传、快速恢复

类比:

  • 流量控制 → 你吃饭的速度不能超过咀嚼的速度,否则会噎住(接收方能力)。
  • 拥塞控制 → 高速公路上的车不能太多,否则会堵车(网络负载)。

6. 记忆技巧

🎯 口诀“先试探,再调整,慢慢来,不卡顿”

  • 发送方 先发一部分 数据(试探)
  • 根据接收方反馈 动态调整窗口大小(调整)
  • 避免数据丢失,保证高效传输(不卡顿)

类比
👉 流水线:工人(接收方)能处理多少,传送带(TCP 发送)就放多少,防止过载。


7. 总结

概念作用联系
滑动窗口让 TCP 连续发送 数据,提高效率核心机制,动态调整窗口大小
ACK 确认接收方确认已收到数据,窗口才滑动结合超时重传,保证可靠性
窗口大小(RWND)由接收方控制,防止溢出用于流量控制,影响滑动窗口
超时重传数据丢失时,TCP 重新发送与 ACK 确认配合,保证可靠传输

整体逻辑

  1. TCP 发送数据 → 采用滑动窗口,提高吞吐量。
  2. 接收方反馈 → 通过 ACK + RWND 控制数据量,避免溢出(流量控制)。
  3. 网络异常时 → 通过超时重传,确保数据不丢失。

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

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

相关文章

单例模式的五种实现方式

1、饿汉式 ①实现:在类加载的时候就初始化实例 ②优点:线程安全 ③缺点:实例在类加载的时候创建,可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…

SwiftUI 让视图自适应高度的 6 种方法(四)

概览 在 SwiftUI 的世界里,我们无数次都梦想着视图可以自动根据布局上下文“因势而变”‌。大多数情况下,SwiftUI 会将每个视图尺寸处理的井井有条,不过在某些时候我们还是得亲力亲为。 如上图所示,无论顶部 TabView 容器里子视图…

小程序SSL证书过期怎么办?

SSL证书就像小程序的“安全锁”,一旦过期,用户访问时会被提示“不安全”,轻则流失客户,重则数据泄露!作为企业负责人,如何快速解决证书过期问题?又该如何避免再次踩坑?这篇指南给你答…

ClickHouse优化技巧实战指南:从原理到案例解析

目录 ​ClickHouse优化核心思想​表结构设计优化​查询性能优化技巧​数据写入优化方案​系统配置调优实战​高可用与集群优化​真实案例解析​总结与建议 1. ClickHouse优化核心思想 ClickHouse作为OLAP领域的明星引擎,其优化需遵循列式存储特性,把握…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_02带边框和斑马纹的固定表头表格

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

服务自动被kill掉的原因和查看

服务在运行一段时间后被自动kill掉可能是由多种原因引起的,包括系统资源限制、进程管理策略、应用程序错误等。以下是一些常见的原因以及定位问题的过程: 常见原因 系统资源限制: 内存不足:如果服务消耗了过多的内存,系统可能会kill掉该进程以释放内存资源。CPU使用过高:…

基础算法——顺序表

一、询问学号 题⽬来源&#xff1a;洛⾕ 题⽬链接&#xff1a;P3156 【深基15.例1】询问学号 - 洛谷 难度系数&#xff1a;★ 1. 题目描述 2. 算法原理 直接⽤ vector 或者数组模拟即可。 3. 参考代码 #include <iostream> #include <vector>using namespace st…

Ubuntu用户安装cpolar内网穿透

前言 Cpolar作为一款体积小巧却功能强大的内网穿透软件&#xff0c;不仅能够在多种环境和应用场景中发挥巨大作用&#xff0c;还能适应多种操作系统&#xff0c;应用最为广泛的Windows、Mac OS系统自不必多说&#xff0c;稍显小众的Linux、树莓派、群辉等也在起支持之列&#…

C#实现高性能异步文件下载器(支持进度显示/断点续传)

一、应用场景分析 异步文件下载器用处很大&#xff0c;当我们需要实现以下功能时可以用的上&#xff1a; 大文件下载&#xff08;如4K视频/安装包&#xff09; 避免UI线程阻塞&#xff0c;保证界面流畅响应多任务并行下载 支持同时下载多个文件&#xff0c;提升带宽利用率后台…

Oracle比较好的几本书籍

1.《Oracle专家高级编程》 2.《Oracle高效设计》 3.《Oracle9i&10g&11g编程艺术深入数据库体系结构》 4.《让Oracle跑的更快》(1/2) ....... n.《Oracle官方文档的阅读》下面包括这几个部分&#xff0c;可以跟进研读一下&#xff1a; &#xff08;1&#xff09;《…

js和java中方法重载(js本身是不支持方法重载,方便对比学习)

js如果需要实现方法重载 示例 1&#xff1a;根据参数数量实现重载 function overloadExample() {if (arguments.length 1) {console.log(一个参数:, arguments[0]);} else if (arguments.length 2) {console.log(两个参数:, arguments[0], arguments[1]);} else {console.l…

Android : Camera之CHI API

来自&#xff1a; https://www.cnblogs.com/szsky/articles/10861918.html 一、CAM CHI API功能介绍&#xff1a; CHI API建立在Google HAL3的灵活性基础之上&#xff0c;目的是将Camera2/HAL3接口分离出来用于使用相机功能&#xff0c;它是一个灵活的图像处理驱动程序&#…

Netty基础—2.网络编程基础四

大纲 1.网络编程简介 2.BIO网络编程 3.AIO网络编程 4.NIO网络编程之Buffer 5.NIO网络编程之实战 6.NIO网络编程之Reactor模式 5.NIO网络编程之Buffer (1)Buffer的作用 Buffer的作用是方便读写通道(Channel)中的数据。首先数据是从通道(Channel)读入缓冲区&#xff0c;从…

Git前言(版本控制)

1.Git 目前世界上最先进的分布式版本控制系统。 git官网&#xff1a;https://git-scm.com/ 2.版本控制 2.1什么是版本控制 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容修改历史&#xff0c;方便查看更改历史记录备份以便恢复以前…

调试正常 ≠ 运行正常:Keil5中MicroLIB的“量子态BUG”破解实录

调试正常 ≠ 运行正常&#xff1a;Keil5中MicroLIB的“量子态BUG”破解实录——从勾选一个选项到理解半主机模式&#xff0c;嵌入式开发的认知升级 &#x1f4cc; 现象描述&#xff1a;调试与烧录的诡异差异 在线调试时 程序正常运行 - 独立运行时 设备无响应 ! 编译过程 0 Err…

算法每日一练 (9)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (9)最小路径和题目描述解题思路解题代码…

【高项】信息系统项目管理师(四)项目整合管理【4分】

一、管理基础 项目整合管理的责任不能被授权或转移&#xff0c;项目经理必须对整个项目承担最终责任。 执行项目整合时项目经理承担双重角色&#xff1a; 1、组织层面上&#xff0c;项目经理扮演重要角色&#xff0c;与项目发起人携手合作&#xff0c;了解战略目标并确保项目目…

ECEF与ENU坐标系定义及C语言实现

一、ECEF与ENU坐标系定义 ECEF坐标系&#xff08;地心地固坐标系&#xff09; 原点&#xff1a;地球质心X轴&#xff1a;指向本初子午线与赤道交点Y轴&#xff1a;在赤道平面内与X轴垂直Z轴&#xff1a;指向北极数学表示&#xff1a; P e c e f ( x , y , z ) P_{ecef} (x,…

sql语句分页的关键字是?

在 SQL 中&#xff0c;分页通常是通过限制查询结果的数量并指定从哪一行开始获取数据来实现的。不同的数据库系统使用不同的分页关键字。 以下是常见数据库系统的分页关键字&#xff1a; MySQL / PostgreSQL / SQLite 使用 LIMIT 和 OFFSET 来进行分页&#xff1a; LIMIT 限…

大模型中的剪枝、蒸馏是什么意思?

环境&#xff1a; 剪枝 蒸馏 问题描述&#xff1a; 大模型中的剪枝、蒸馏是什么意思&#xff1f; 解决方案&#xff1a; 大模型的剪枝&#xff08;Pruning&#xff09;和蒸馏&#xff08;Distillation&#xff09;是两种常见的模型优化技术&#xff0c;用于减少模型的大小…