当前位置:首页>Linux>【Linux】网络知识点——TCP协议详解

【Linux】网络知识点——TCP协议详解

  • 2026-09-10 09:38:00
【Linux】网络知识点——TCP协议详解

一、TCP 是什么?定位与特点

TCP(Transmission Control Protocol):传输层面向连接、可靠、字节流协议,基于 IP 封装,协议号为 6。

核心特点(必记)

  • 面向连接
    :通信前必须建立连接(三次握手)
  • 全双工
    :双方可同时收发
  • 可靠传输
    :丢包重传、确认应答、序号、校验和
  • 流量控制
    :防止发送方发太快把接收方 “撑爆”
  • 拥塞控制
    :防止网络拥堵导致雪崩
  • 字节流
    :数据无边界,按字节顺序传输

典型用途:SSH、HTTP/HTTPS、FTP、车载 OTA、DoIP、SOME/IP 等。


二、TCP 头部结构(精简版,抓包必认)

最小 20 字节,最大 60 字节(带选项)。

关键字段(Linux 调试 / 抓包高频):

  • Source Port / Dest Port
    :源端口、目的端口
  • Sequence Number(序号)
    :字节流编号,保证顺序
  • Ack Number(确认号)
    :期望收到的下一个字节序号
  • Data Offset
    :TCP 头部长度(4bit,单位 4 字节)
  • Control Bits(标志位)
    :
    • URG、ACK、PSH、RST、SYN、FIN
  • Window Size
    :接收窗口(流量控制核心)
  • Checksum
    :校验和(防篡改 / 传输错误)

最常用标志位:

  • SYN
    :同步序号,用于建立连接
  • ACK
    :确认有效
  • FIN
    :关闭连接
  • RST
    :强制断开(异常重置)

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

目的:确认双方收发能力正常 + 初始化序号

流程(C = 客户端,S = 服务端)

  1. C → S:SYN

    • 客户端发送:SYN=1, Seq=x
    • 状态:C → SYN_SENT
  2. S → C:SYN + ACK

    • 服务端回复:SYN=1, ACK=x+1, Seq=y
    • 状态:S → SYN_RCVD
  3. C → S:ACK

    • 客户端回复:ACK=y+1
    • 状态:C、S 都进入 ESTABLISHED(连接建立)

Linux 视角意义

  • 服务端 listen() 后进入 LISTEN
  • 握手完成才会从全连接队列取走
  • 可通过 ss -tan / netstat 查看状态

四、TCP 四次挥手(正常关闭连接)

因为是全双工,双方要各自关闭发送通道,所以要 4 步。

标准流程

  1. C → S:FIN(我不再发数据了)

    • C:FIN_WAIT1
  2. S → C:ACK(收到你的关闭)

    • S:CLOSE_WAIT
    • C:FIN_WAIT2
  3. S → C:FIN(我也不发了)

    • S:LAST_ACK
  4. C → S:ACK(收到,关闭完成)

    • C:TIME_WAIT(固定等待 2MSL)
    • S:CLOSED

关键状态(Linux 必懂)

  • TIME_WAIT
    :主动关闭方会进入,持续 2MSL作用:确保对方收到最后 ACK、防止旧报文干扰新连接
  • CLOSE_WAIT
    :被动关闭方,说明应用层没调用 close ()(常见代码 Bug)

五、TCP 可靠传输机制(核心原理)

1. 序列号 + 确认应答(Seq + Ack)

  • 每个字节都有编号
  • 接收方回复 Ack = 期望下一个字节号
  • 没收到 Ack → 判定丢包 → 重传

2. 超时重传

发送方启动定时器,超时未确认则重传。

3. 滑动窗口(流量控制)

  • Window Size
     表示接收方还能收多少数据
  • 发送方不能超过对方窗口
  • 防止发送过快导致接收缓冲区溢出

4. 拥塞控制(网络层面)

四个核心阶段:

  1. 慢启动
    (指数增长)
  2. 拥塞避免
    (线性增长)
  3. 快重传
    (连续 3 个重复 Ack 立即重传)
  4. 快恢复
    (丢包后不降回 1,快速恢复)

六、Linux 下 TCP 常用查看 / 调试命令

1. 看 TCP 连接状态

ss -tan# 或老版netstat-tanp

常见状态:

  • LISTEN
    :监听中
  • ESTAB
    :已连接
  • SYN_SENT / SYN_RECV
    :握手中
  • FIN_WAIT1/2
    :关闭中
  • TIME_WAIT
    :主动关闭后等待
  • CLOSE_WAIT
    :被动关闭,应用未 close(常见问题)

2. 查看 TCP 内核参数

sysctl  net.ipv4.tcp_timestampssysctl  net.ipv4.tcp_syncookiessysctl  net.ipv4.tcp_tw_reusesysctl  net.ipv4.tcp_fin_timeout

3. 抓 TCP 包(定位问题神器)

tcpdump -i eth0 tcp port 22 -nn -S


七、车载 / 嵌入式 Linux 特别关注点

  1. 低时延、高可靠车载以太网(DoIP、 SOME/IP)大量使用 TCP,要求稳定不丢包。

  2. TIME_WAIT 优化(高并发 / 频繁重连场景)

    net.ipv4.tcp_tw_reuse =1net.ipv4.tcp_tw_recycle =1(部分内核已废弃)net.ipv4.tcp_fin_timeout =30

3. SYN 泛洪防护

net.ipv4.tcp_syncookies =1

4. 长连接 vs 短连接

    • 车载 ECU 通信:多用长连接,减少握手开销
    • 诊断 / 刷写:短连接即可

八、TCP vs UDP(极简对比表)

特性
TCP
UDP
连接
面向连接
无连接
可靠性
可靠(重传、确认、有序)
不可靠
速度
较慢
极快
头部开销
20~60 字节
8 字节
适用场景
OTA、SSH、HTTP、DoIP
视频、音频、实时雷达、车载 SOME/IP 部分场景

九、一句话总结(适合写文档 / 面试收尾)

TCP 是面向连接、可靠、全双工、带流量控制与拥塞控制的字节流协议,通过三次握手建立连接、四次挥手关闭,依靠序列号、确认应答、滑动窗口、超时重传保证可靠传输,是 Linux 网络与车载以太网中最核心的传输层协议。

最新文章

随机文章