目录

  • TCP 是什么:面向连接 + 可靠 + 字节流
  • 三次握手:为什么不是两次
  • 四次挥手与 TIME_WAIT:谁等谁
  • 序列号/确认号与去重、排序、确认
  • 重传机制:超时重传与快速重传
  • 滑动窗口与流量控制
  • 拥塞控制:慢启动/拥塞避免/快重传/快恢复
  • 保活机制与长连接
  • 半连接队列、全连接队列与 SYN 攻击
  • RST 的语义:什么时候会被动断开
  • 常见高频面试问答(含易错点)
  • 抓包与排错清单
  • 参考与延伸阅读

在这里插入图片描述

TCP 是什么:面向连接 + 可靠 + 字节流

  • 面向连接:通信前需要建立连接(三次握手)。
  • 可靠交付:通过序列号、确认号、校验和、重传、窗口等保证不丢、不重、按序到达(应用层“看起来”按序)。
  • 字节流:没有消息边界,数据是连续字节流,分段与拼包在传输层完成。

简图(字节流与按序):

[App 写入字节] => [TCP 分段 seq=100..] => [网络] => [TCP 重组、去重、排序] => [App 读到连续字节]

三次握手:为什么不是两次

三次握手的目标:

  • 交换初始序列号(ISN)并建立双向通信能力。
  • 让客户端和服务端都“确认”对方的收发能力都正常。

流程(简化):

CLOSE -> SYN-SENT --SYN(x)--> LISTEN
SYN-RCVD <--SYN(y),ACK(x+1)-- LISTEN
ESTABLISHED --ACK(y+1)--> ESTABLISHED

为什么不能两次?

  • 若两次握手,服务端无法判断当前请求是否“历史连接”重放;第三次 ACK 让客户端基于上下文确认“我确实与这个服务端建立了当前连接”,避免“僵尸连接”占用资源。

我常用的比喻:

  • 第一次:我能发(SYN)。
  • 第二次:我能收能发(SYN+ACK)。
  • 第三次:我也能收(ACK),双方都齐活。

注:半连接队列记录“收到 SYN 尚未完成握手”的请求;若第三次 ACK 不到,条目会因超时被清理。


四次挥手与 TIME_WAIT:谁等谁

为什么“挥手”通常是四次?

  • 关闭是“单向”的:一方 FIN 只表示“我不再发了”,对方读到 FIN 但仍可继续发送,故需要两对报文确保双方各自完成“发送通道”的关闭。

典型序列:

(主动关闭)  FIN -> ACK    (被动方进 CLOSE_WAIT)...对方数据发送完...FIN -> ACK    (主动方进 TIME_WAIT)

TIME_WAIT 的意义:

  • 等 2MSL,确保:
    • 最后的 ACK 若丢失,对方重发 FIN,我还能重发 ACK;
    • 旧连接的迟到报文不会影响未来新的同四元组连接。

调优提示:

  • 服务端侧可让“短连接风格”的一方尽量成为被动关闭者,降低其 TIME_WAIT 压力(视业务/栈实现)。

序列号/确认号与去重、排序、确认

我面试常用“翻书”比喻:

能力解决的问题类比
序列号(seq)去重与排序页码防重排
确认号(ack)成功到达的确认勾选“已读”
窗口(win)节流与并行度读写节拍

发送端维护已发送未确认的数据集合,接收端通过累计 ACK 告知“我已经连续收到哪一位点前的所有字节”。


重传机制:超时重传与快速重传

  • 超时重传(RTO):发送后启动定时器,超时无 ACK 则重发;RTO 自适应基于 RTT 与抖动(通常 > RTT 的一定倍数)。
  • 快速重传:收到 3 个重复 ACK(如 ACK=101,101,101),判定某段可能丢了,提前重传,减少等待 RTO 的成本。

要点:

  • 重传报文的 seq 与原始相同,可能合并为更大段(取决于实现)。
  • 局部乱序也会触发重复 ACK,但不等同于丢包;拥塞控制会进一步介入(见下)。

滑动窗口与流量控制

  • 接收窗口(rwnd):接收端缓冲可用空间,通过报文通告给发送端,防止“接收方处理不过来”。
  • 发送窗口(swnd):发送端根据 min(cwnd, rwnd) 决定实际并发在途数据量。
  • 零窗口探测:若 rwnd=0,发送端定期发探测报文,等待窗口开放。

可视化(简略):

|--- 已确认 ---|--- 已发送未确 ---|--- 可发送窗口 ---|^ base            ^ nextSeq

拥塞控制:慢启动/拥塞避免/快重传/快恢复

  • cwnd:拥塞窗口,代表“网络可能承受的并发在途量”的猜测值。
  • 慢启动:从 1 MSS 开始指数增长,阈值 ssthresh 之前翻倍,之后线性增加(拥塞避免)。
  • 快重传/快恢复:
    • 3 次重复 ACK 触发:ssthresh = cwnd/2cwnd = ssthreshssthresh + 3*MSS(依实现),进入快速恢复,避免回到 1 MSS 的冷启动。
  • 超时:说明更严重拥塞,通常将 cwnd 置 1 MSS,重新慢启动。

保活机制与长连接

  • KeepAlive:长时间无数据时周期性发送探测包;若多次无响应,判定连接死亡并关闭。默认关/开与探测周期依 OS 而异,可配置。
  • 应用层心跳:例如 HTTP/2、WebSocket 自带 ping/pong,更灵活。

半连接队列、全连接队列与 SYN 攻击

  • 半连接队列(SYN 队列):收到 SYN,发送 SYN+ACK,等待第三次握手的 ACK。若超时未到达则过期剔除。
  • 全连接队列(Accept 队列):三次握手完成的连接,等待应用层 accept() 取走。
  • 防护思路:
    • SYN Cookies、缩短 SYN/ACK 重传与过期时间、增大队列。
    • 使用负载均衡/防火墙清洗异常 SYN 洪泛。

RST 的语义:什么时候会被动断开

  • RST 表示“连接非法/不存在或异常状态”,常见触发:
    • 目标端口无进程监听;
    • 应用层提前关闭 socket,仍收到对端数据;
    • 抓包/半开异常导致状态机不同步。
  • 面试提示:用 RST 终止连接不会进入 TIME_WAIT(与 FIN 流程不同)。

常见高频面试问答(含易错点)

  1. 为什么是三次握手不是两次?
  • 需要确认“双方收发能力”,并防历史连接的重放,占用资源。
  1. 为什么挥手要四次?
  • 关闭是单向的,两个方向分别 FIN/ACK。
  1. TIME_WAIT 为什么在主动关闭方?
  • 负责兜住最后 ACK 丢失与旧报文消散。
  1. 3 个重复 ACK 一定是丢包吗?
  • 不一定,可能乱序;但为降低时延会触发快速重传并调整拥塞窗口。
  1. rwndcwnd 谁说了算?
  • 实际可发窗口取两者较小值:min(cwnd, rwnd)
  1. 半连接队列爆了怎么办?
  • 开启 SYN Cookies、调大队列、缩短重试、前置抗 DDoS。
  1. 为什么 TCP 是字节流,UDP 是报文?
  • TCP 为可靠按序的连续字节,UDP 不保证顺序、丢失可见,保留消息边界。

抓包与排错清单

  • 观察三次握手:过滤 tcp.flags.syn==1 && tcp.flags.ack==0
  • 快速重传:看是否出现 3 次重复 ACK 与 Dup ACK 标记。
  • RTO 触发:同一 seq 的报文重发,时间间隔接近 RTO。
  • 零窗口:Window Size Value = 0 与周期性探测包。
  • 拥塞事件:[TCP Previous segment not captured][Retransmission]、窗口骤降。

Wireshark 过滤示例:

# 仅看 TCP 握手
tcp.flags.syn==1 || tcp.flags.fin==1 || tcp.flags.reset==1
# 指定四元组
ip.addr==A && ip.addr==B && tcp.port in {PORT1,PORT2}

参考与延伸阅读

  • RFC 793、RFC 5681:TCP 规范与拥塞控制
  • 《Linux高性能服务器编程》《TCP/IP 详解 卷一》
  • Wireshark 官方文档与实践

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

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

相关文章

CentOS 7.2 虚机 ssh 登录报错在重启后无法进入系统

文章目录前言1. 故障描述2. 故障诊断3. 故障原因4. 解决方案总结前言 上周帮用户处理了一个 linux 虚拟机在重启后无法正常进入操作系统的故障&#xff0c;觉得比较有意思&#xff0c;在这里分享给大家。 1. 故障描述 事情的起因是一台系统版本为 CentOS 7.2 的 VMware 虚拟机…

《从使用到源码:OkHttp3责任链模式剖析》

一 从使用开始0.依赖引入implementation ("com.squareup.okhttp3:okhttp:3.14.7")1.创建OkHttpClient实例方式一&#xff1a;直接使用默认配置的Builder//从源码可以看出&#xff0c;当我们直接new创建OkHttpClient实例时&#xff0c;会默认给我们配置好一个Builder …

安装3DS MAX 2026后,无法运行,提示缺少.net core的解决方案

今天安装了3DS MAX 2026&#xff08;俗称3DMAX&#xff09;&#xff0c;安装完毕后死活运行不了。提示如下&#xff1a; 大意是找不到所需的.NET Core 8库文件。后来搜索了下&#xff0c;各种文章说.NET CORE和.NET FRAMEWORK不是一个东西。需要单独下载安装。然后根据提示&…

FastAPI + LangChain 和 Spring AI + LangChain4j

FastAPI+LangChain和Spring AI+LangChain4j这两个技术组合进行详细对比。 核心区别: 特性维度 FastAPI + LangChain (Python栈) Spring AI + LangChain4j (Java栈) 技术栈 Python生态 (FastAPI, LangChain) Java生态 (Spring Boot, Spring AI, LangChain4j) 核心设计哲学 灵活…

Apache 2.0 开源协议详解:自由、责任与商业化的完美平衡-优雅草卓伊凡

Apache 2.0 开源协议详解&#xff1a;自由、责任与商业化的完美平衡-优雅草卓伊凡引言由于我们优雅草要推出收银系统&#xff0c;因此要采用开源代码&#xff0c;卓伊凡目前看好了一个产品是apache 2.0协议&#xff0c;因此我们有必要深刻理解apache 2.0协议避免触犯版权问题。…

自学嵌入式第37天:MQTT协议

一、MQTT&#xff08;消息队列遥测传输协议Message Queuing Telemetry Transport&#xff09;1.MQTT是应用层的协议&#xff0c;是一种基于发布/订阅模式的“轻量级”通讯协议&#xff0c;建构于TCP/IP协议上&#xff0c;可以以极少的代码和有限的带宽为连接远程设备提供实时可…

RabbitMQ--延时队列总结

一、延迟队列概念 延迟队列&#xff08;Delay Queue&#xff09;是一种特殊类型的队列&#xff0c;队列中的元素需要在指定的时间点被取出和处理。简单来说&#xff0c;延时队列就是存放需要在某个特定时间被处理的消息。它的核心特性在于“延迟”——消息在队列中停留一段时间…

Java 提取 PDF 文件内容:告别手动复制粘贴,拥抱自动化解析!

在日常工作中&#xff0c;我们经常需要处理大量的 PDF 文档&#xff0c;无论是提取报告中的关键数据&#xff0c;还是解析合同中的重要条款&#xff0c;手动复制粘贴不仅效率低下&#xff0c;还极易出错。当面对海量的 PDF 文件时&#xff0c;这种传统方式更是让人望而却步。那…

关键字 const

Flutter 是一个使用 Dart 语言构建的 UI 工具包&#xff0c;因此它完全遵循 Dart 的语法和规则。Dart 中的 const 是语言层面的特性&#xff0c;而 Flutter 因其声明式 UI 和频繁重建的特性&#xff0c;将 const 的效能发挥到了极致。Dart 中的 const&#xff08;语言层面&…

Ubuntu22.04中使用cmake安装abseil-cpp库

Ubuntu22.04中使用cmake安装abseil-cpp库 关于Abseil库 Abseil 由 Google 的基础 C 和 Python 代码库组成&#xff0c;包括一些正支撑着如 gRPC、Protobuf 和 TensorFlow 等开源项目并一起 “成长” 的库。目前已开源 C 部分&#xff0c;Python 部分将在后续开放。 Abseil …

FreeRTOS项目(序)目录

这章是整个专栏的目录&#xff0c;负责记录这个小项目的开发日志和目录。附带总流程图。 目录 项目简介 专栏目录 开发日志 总流程图 项目简介 本项目基于STM32C8T6核心板和FreeRTOS&#xff0c;实现一些简单的功能。以下为目前已实现的功能。 &#xff08;1&#xff09…

Python 多任务编程:进程、线程与协程全面解析

目录 一、多任务基础&#xff1a;并发与并行 1. 什么是多任务 2. 两种表现形式 二、进程&#xff1a;操作系统资源分配的最小单位 1. 进程的概念 2. 多进程实现多任务 2.1 基础示例&#xff1a;边听音乐边敲代码 2.2 带参数的进程任务 2.3 进程编号与应用注意点 2.3.…

ADSL技术

<摘要> ADSL&#xff08;非对称数字用户线路&#xff09;是一种利用传统电话线实现宽带上网的技术。其核心原理是频率分割&#xff1a;将一根电话线的频带划分为语音、上行数据&#xff08;慢&#xff09;和下行数据&#xff08;快&#xff09;三个独立频道&#xff0c;从…

信号衰减中的分贝到底是怎么回事

问题&#xff1a;在一个低通滤波中&#xff0c;经常会看到一个值-3dB&#xff08;-3分贝&#xff09;&#xff0c;到底是个什么含义&#xff1f; 今天我就来粗浅的讲解这个问题。 在低通滤波器中&#xff0c;我们说的 “截止频率”&#xff08;或叫 - 3dB 点&#xff09;&…

工具分享--IP与域名提取工具2.0

基于原版的基础上新增了一个功能点:IP-A段过滤&#xff0c;可以快速把内网192、170、10或者其它你想要过滤掉的IP-A段轻松去掉&#xff0c;提高你的干活效率&#xff01;&#xff01;&#xff01; 界面样式预览&#xff1a;<!DOCTYPE html> <html lang"zh-CN&quo…

如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比

在分布式系统或数据库管理系统中&#xff0c;日志先行原则&#xff08;Write-Ahead Logging&#xff0c;WAL&#xff09; 是确保数据一致性、持久性和恢复能力的重要机制。通过 WAL&#xff0c;系统能够在发生故障时恢复数据&#xff0c;保证数据的可靠性。在这篇博客中&#x…

临床研究三千问——临床研究体系的3个维度(8)

在上周的文章中&#xff0c;我们共同探讨了1345-10战策的“临床研究的起点——如何提出一个犀利的临床与科学问题”。问题固然是灵魂&#xff0c;但若没有坚实的骨架与血肉&#xff0c;灵魂便无所依归。今天&#xff0c;我们将深入“1345-10战策”中的“3”&#xff0c;即支撑起…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年9月7日第172弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。(1)定位…

万字详解网络编程之socket

一&#xff0c;socket简介1.什么是socketsocket通常也称作"套接字"&#xff0c;⽤于描述IP地址和端⼝&#xff0c;是⼀个通信链的句柄&#xff0c;应用程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求。⽹络通信就是两个进程间的通信&#xff0c;这两…

维度跃迁:当万物皆成电路,智能将从“拥有”变为“存在”

我们习以为常的电子世界&#xff0c;其本质是一个由电路构成的精密宇宙。而一场从二维到三维的终极变革&#xff0c;正在悄然酝酿&#xff0c;它将彻底颠覆我们创造和交互的方式。一、电子世界的本质&#xff1a;一切都是电路 在深入未来之前&#xff0c;我们首先要理解当下。电…