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 网络之上,提供应用所需的稳定数据通道。
相关推荐
汤愈韬4 小时前
ACL概述、ACL原理、基本ACL应用及配置
网络·网络协议·网络安全
小二李6 小时前
第11章 nestjs服务端开发:登录鉴权
运维·服务器
i建模7 小时前
如何在Arch Linux中重设忘记的root密码
linux·运维·服务器
码刘的极客手记8 小时前
VCAP4-DCA Beta 考试体验分享与 esxcli 自动化实战(第二、三部分)
网络·esxi·vmware·虚拟机
朝风工作室8 小时前
开源一款轻量级跨网段 IPC 设备发现与网络配置工具
网络·开源
Qaz555666919 小时前
透明DNS选路实验
网络
何中应10 小时前
vmware的linux虚拟机如何设置以命令行方式启动
linux·运维·服务器
haluhalu.10 小时前
Linux网络编程------网络基础
网络·网络协议
坐怀不乱杯魂10 小时前
Linux网络 - HTTP协议
网络·网络协议·http
野犬寒鸦10 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习