TCP协议

#TCP协议

文章目录

先看下TCP协议头

  • TCP 头部通常为 20 字节(不含选项),核心字段包括:
字段 长度 作用
端口号 (源端口和目标端口) 32 bit 标识发送方和接收方的应用程序。
序列号 (Seq) 32 bit 解决乱序问题,标识本报文段发送的数据组第一个字节的序号。
确认号 (Ack) 32 bit 期望收到的下一个字节序号(ACK = seq + len)
头部长度(Data Offset) 4 bit TCP 头部长度(单位:4 字节),最小值为 5(20 字节)
标记控制位(Flags) 6 bit SYN:同步序号,用于建立连接。 ACK:确认序号有效。 FIN:发送方完成发送任务,用于释放连接。 RST:强制重置异常连接。
窗口大小 (Window Size) 16 bit 用于流量控制,告知对方本地目前允许接收的数据量。
校验和 (Checksum) 16 bit 检测数据在传输中是否有差错。
紧急指针(Urgent Pointer 16 bit 指示紧急数据末尾位置(配合 URG 使用,现代系统基本弃用)
可选性Options 可变 支持 MSS、窗口缩放、时间戳、SACK 等扩展

TCP如何建立和断开连接

  • 建立连接:三次握手

    • 第一次握手:客户端发送 SYN,进入 SYN_SENT 状态。(确认客户端发送能力)
    • 第二次握手:服务端返回 SYN + ACK,进入 SYN_RCVD 状态。(确认服务端接收和发送能力,进入SYN_RECV半连接队列)
    • 第三次握手:客户端发送 ACK,双方进入 ESTABLISHED 状态。(确认客户端接收能力,进入ACCEPT全队列)
    • 知识点1:服务端监听时指定的backlog半连接、全连接的总和:SYN_RECV连接队列,ACCEPT连接队列,调用accept()方法取走连接
    • 知识点2:为什么不是两次?为了防止已失效(迷路)的连接SYN请求突然又传送到了服务端,导致产生脏连接消耗服务端资源。
  • 端口连接:四次挥手

    • 第一次挥手:客户端发送 FIN。(我不发数据了)
    • 第二次挥手:服务端返回 ACK。(收到,但我可能还没发完,你等会)
    • 第三次挥手:服务端发完剩余数据,发送 FIN。(我也发完了,断开吧)
    • 第四次挥手 :客户端返回 ACK,进入 TIME_WAIT 状态,等待 2MSL 后彻底关闭。
    • 知识点1:拔网线连接是否会断开?不会立即断开,连接仍处于 ESTABLISHED 状态("假连接")
    • 知识点2:为什么需要 TIME_WAIT?防止相同的四元组立断开后立即建立新连接,导致数据错乱

TCP如何可靠传输

  1. 序列号与确认应答 (Seq & Ack):给每个字节编号。接收方收到后必须回传 ACK,否则发送方认为丢失。
  2. 超时重传 (Retransmission):发送方在规定时间内没收到 ACK,就重新发送该数据。
  3. 丢弃重复与乱序重排:利用序列号,接收端会自动剔除重复数据,并按顺序组装被拆分的报文。
  4. 流量控制 (Flow Control) :利用滑动窗口。接收方根据自己的处理能力告知发送方:"我还能收多少",防止发送方发太快导致接收方缓冲区溢出。
  5. 校验和 (Checksum):通过数学算法校验数据块,如果校验失败,直接丢弃。

TCP如何高效传输

滑动窗口 (Sliding Window)

  • 如果不使用窗口,发一个包等一个 ACK,效率极低。
  • 窗口允许发送方在不等待 ACK 的情况下连续发送多个包,极大提高了吞吐量。

延迟确认 (Delayed ACK) 与 Nagle 算法

  • 延迟确认:接收方不立即回 ACK,而是等一会(通常<200ms),看有没有数据要回传给发送方,顺便把 ACK 带回去(捎带应答),减少包数量。
  • Nagle 算法:将多个细小的包合并成一个大包再发送,减少网络包头的开销。

拥塞控制 (Congestion Control)

这是针对整个网络状况的"宏观调控",防止网络拥堵导致崩溃:

  1. 慢启动 (Slow Start):初始发送量小,按指数级倍增(1, 2, 4, 8...)。
  2. 拥塞避免 (Congestion Avoidance):达到阈值后,改为线性增长,小步快跑。
  3. 快重传 (Fast Retransmit):如果接收方收到乱序包,连续发 3 个冗余 ACK,发送方立刻重传,无需等待超时。
  4. 快恢复 (Fast Recovery):网络波动后不直接回到慢启动,而是减半窗口快速恢复。

总结

  • "在不可靠的网络上构建可靠的传输" ------ 通过确认应答、超时重传、滑动窗口、拥塞控制等机制,在尽力而为的 IP 网络之上,提供应用所需的稳定数据通道。
相关推荐
青梅橘子皮5 小时前
Linux---基本指令
linux·运维·服务器
cui_ruicheng7 小时前
Linux进程间通信(三):System V IPC与共享内存
linux·运维·服务器
运维全栈笔记7 小时前
Linux安装配置Tomcat保姆级教程:从部署到性能调优
linux·服务器·中间件·tomcat·apache·web
dllmayday8 小时前
Linux 上用终端连接 WiFi
linux·服务器·windows
ACP广源盛139246256738 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑
Empty-Filled9 小时前
AI生成测试用例功能怎么测:一个完整实战案例
网络·人工智能·测试用例
峥无9 小时前
Linux系统编程基石:静态库·动态库·ELF文件·进程地址空间全景图
linux·运维·服务器
码云数智-大飞10 小时前
本地部署大模型:隐私安全与多元优势一站式解读
运维·网络·人工智能
jinanwuhuaguo10 小时前
(第二十九篇)OpenClaw 实时与具身的跃迁——从异步孤岛到数字世界的“原住民”
前端·网络·人工智能·重构·openclaw
等风来不如迎风去10 小时前
【win11】最佳性能:fix 没有壁纸,一直黑屏
网络·人工智能