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 网络之上,提供应用所需的稳定数据通道。
相关推荐
Ha_To2 小时前
2026.1.12 Linux提升账户权限
linux·运维·服务器
SamtecChina20232 小时前
Electronica现场演示 | 严苛环境下的56G互连
大数据·网络·人工智能·算法·计算机外设
tiantianuser2 小时前
RDMA设计29:RoCE v2 发送及接收模块设计2
服务器·fpga开发·rdma·fpga设计·高速传输
五仁火烧2 小时前
静态文件服务器和动态服务器
运维·服务器
五仁火烧2 小时前
Vite和HTTP 服务器
服务器·网络协议·http·vue
H_z_q24012 小时前
RHCE的时间服务器与NTP、chrony
java·运维·服务器
唐古乌梁海2 小时前
【Test】“用户注册模块”多方法组合测试用例集
网络·测试用例
YYYing.2 小时前
【计算机网络 | 第二篇】计算机组网模型
网络·tcp/ip·计算机网络·信息与通信
python开发笔记2 小时前
can(6) canopen python库使用
服务器·网络·python