tcp传输协议机制

强关联博客:TCP协议报头及各个字段的作用-CSDN博客


目录

​编辑

[一. 三次握手建立连接](#一. 三次握手建立连接)

1、字段

2、三次握手过程

[1. 第一次握手:客户端发送 SYN 报文](#1. 第一次握手:客户端发送 SYN 报文)

[2、第二次握手:服务器回应 SYN-ACK 报文](#2、第二次握手:服务器回应 SYN-ACK 报文)

[3.第三次握手:客户端发送 ACK 报文](#3.第三次握手:客户端发送 ACK 报文)

3、三次握手的总结

4、为什么需要三次握手?

[二. 可靠数据传输](#二. 可靠数据传输)

[(1) 序列号和确认号](#(1) 序列号和确认号)

[(2) 重传机制](#(2) 重传机制)

[(3) 校验和](#(3) 校验和)

[三. 流量控制](#三. 流量控制)

[(1) 接收窗口](#(1) 接收窗口)

[(2) 滑动窗口机制](#(2) 滑动窗口机制)

[四. 拥塞控制](#四. 拥塞控制)

[(1) 慢启动](#(1) 慢启动)

[(2) 拥塞避免](#(2) 拥塞避免)

[(3) 快重传和快恢复](#(3) 快重传和快恢复)

[五. 四次挥手断开连接](#五. 四次挥手断开连接)

[(1) 第一次挥手:FIN](#(1) 第一次挥手:FIN)

[(2) 第二次挥手:ACK](#(2) 第二次挥手:ACK)

[(3) 第三次挥手:FIN](#(3) 第三次挥手:FIN)

[(4) 第四次挥手:ACK](#(4) 第四次挥手:ACK)

六、确认应答(ACK)机制

[1. ACK 机制的基本原理](#1. ACK 机制的基本原理)

[2. ACK 机制的工作流程](#2. ACK 机制的工作流程)

[3. ACK 机制的细节](#3. ACK 机制的细节)

[(1) 累积确认](#(1) 累积确认)

[(2) 延迟确认](#(2) 延迟确认)

[(3) 选择性确认(SACK)](#(3) 选择性确认(SACK))

[4. ACK 机制的作用](#4. ACK 机制的作用)

[5. ACK 机制的示例](#5. ACK 机制的示例)

总结




一. 三次握手建立连接

1、字段

在数据传输前,TCP通过三次握手确保双方准备好通信:

  1. SYN:客户端发送SYN报文,包含初始序列号(ISN)。

  2. SYN-ACK:服务器回应SYN-ACK报文,确认客户端的SYN,并发送自己的ISN。

  3. ACK:客户端发送ACK报文,确认服务器的SYN。


2、三次握手过程

1. 第一次握手:客户端发送 SYN 报文
  • 客户端行为

    • 客户端希望与服务器建立 TCP 连接,首先发送一个 SYN 报文(Synchronize Sequence Numbers)。

    • 该报文包含以下关键信息:

      • SYN 标志位:设置为 1,表示这是一个同步报文。

      • 初始序列号(ISN, Initial Sequence Number):客户端随机生成的一个序列号(例如,ISN = 1000),用于标识数据字节流的起始位置。

    • 客户端进入 SYN_SENT 状态,等待服务器的确认。


2、第二次握手:服务器回应 SYN-ACK 报文
  • 服务器行为
  • 服务器收到客户端的 SYN 报文后,会检查是否可以接受该连接请求。
  • 如果接受,服务器会发送一个 SYN-ACK 报文 ,包含以下关键信息:
    • 服务器的初始序列号(ISN):服务器随机生成的一个序列号(例如,ISN = 5000),用于标识服务器数据字节流的起始位置。

    • 确认号(Acknowledgment Number):值为客户端 ISN + 1(例如,1000 + 1 = 1001),表示服务器期望接收的下一个字节的序列号。

    • ACK 标志位:设置为 1,表示确认客户端的 SYN 报文。

    • SYN 标志位:设置为 1,表示服务器也在同步自己的序列号。

    • 服务器进入 SYN_RECEIVED 状态,等待客户端的确认。


3.第三次握手:客户端发送 ACK 报文
  • 客户端行为

    • 客户端收到服务器的 SYN-ACK 报文后,会检查确认号是否正确(即是否为客户端 ISN + 1)。

    • 如果正确,客户端会发送一个 ACK 报文,包含以下关键信息:

      • ACK 标志位:设置为 1,表示确认服务器的 SYN 报文。

      • 确认号(Acknowledgment Number):值为服务器 ISN + 1(例如,5000 + 1 = 5001),表示客户端期望接收的下一个字节的序列号。

    • 客户端进入 ESTABLISHED 状态,表示连接已建立。

    • 服务器行为

      • 服务器收到客户端的 ACK 报文后,检查确认号是否正确(即是否为服务器 ISN + 1)。

      • 如果正确,服务器也进入 ESTABLISHED 状态,表示连接已建立。


3、三次握手的总结

  1. 第一次握手

    • 客户端发送 SYN 报文,携带自己的初始序列号(ISN)。

    • 目的是告诉服务器:"我想和你建立连接,我的序列号从 ISN 开始。"

  2. 第二次握手

    • 服务器回应 SYN-ACK 报文,携带自己的初始序列号(ISN),并确认客户端的 SYN 报文。

    • 目的是告诉客户端:"我收到了你的请求,同意建立连接,我的序列号从 ISN 开始。"

  3. 第三次握手

    • 客户端发送 ACK 报文,确认服务器的 SYN 报文。

    • 目的是告诉服务器:"我收到了你的确认,连接已建立。"


4、为什么需要三次握手?

  1. 确保双方都能发送和接收数据

    • 三次握手确保客户端和服务器都能正常发送和接收数据,验证了双向通信的能力。
  2. 防止旧的重复连接初始化

    • 如果网络中存在延迟的旧 SYN 报文,三次握手可以避免错误地建立连接。
  3. 同步初始序列号(ISN)

    • 三次握手确保双方都知道了对方的初始序列号,为后续可靠数据传输奠定基础。

二. 可靠数据传输

TCP 通过以下机制确保数据可靠传输:

(1) 序列号和确认号

  • 序列号(Sequence Number)

    • 每个字节的数据都有一个唯一的序列号,用于标识数据在字节流中的位置。

    • 例如,如果初始序列号(ISN)为 1000,那么第一个字节的序列号为 1000,第二个字节为 1001,依此类推。

  • 确认号(Acknowledgment Number)

    • 接收方通过确认号告知发送方已成功接收的数据。

    • 确认号的值是接收方期望接收的下一个字节的序列号。例如,如果接收方收到序列号为 1000-1999 的数据,它会发送确认号 2000,表示期望接收序列号为 2000 的数据。

  • 作用

    • 确保数据按顺序到达,并且没有丢失或重复。

(2) 重传机制

  • 超时重传

    • 发送方发送数据后,会启动一个定时器。如果在规定时间内未收到确认(ACK),发送方会重传该数据。
  • 快速重传

    • 如果接收方收到乱序的数据(例如,收到序列号为 2000 的数据,但未收到 1000-1999 的数据),它会重复发送对缺失数据的确认(即重复 ACK)。

    • 发送方收到 3 个重复的 ACK 后,会立即重传缺失的数据,而不等待超时。

  • 作用

    • 确保数据在网络中丢失时能够被及时恢复。

(3) 校验和

  • 校验和字段

    • TCP 报文头中包含一个 16 位的校验和字段,用于检测数据在传输过程中是否发生错误。
  • 计算方式

    • 发送方对报文头和数据进行计算,生成校验和。

    • 接收方收到数据后,重新计算校验和,并与报文头中的校验和进行比对。如果不一致,则丢弃该数据。

  • 作用

    • 确保数据的完整性,防止传输过程中出现错误。

三. 流量控制

TCP 通过滑动窗口机制控制发送速率,防止接收方缓冲区溢出:

(1) 接收窗口

  • 接收窗口大小

    • 接收方通过 TCP 报文头中的窗口字段(Window Size)通告其可用缓冲区大小。

    • 例如,如果接收窗口大小为 5000 字节,表示接收方当前只能接收 5000 字节的数据。

  • 动态调整

    • 接收方会根据缓冲区使用情况动态调整窗口大小,并通过 ACK 报文通知发送方。

(2) 滑动窗口机制

  • 发送窗口

    • 发送方根据接收窗口大小调整自己的发送窗口,确保发送的数据量不超过接收方的处理能力。
  • 滑动原理

    • 当发送方收到接收方的确认后,发送窗口会向前滑动,允许发送新的数据。
  • 作用

    • 防止接收方缓冲区溢出,同时提高网络利用率。

四. 拥塞控制

TCP 通过拥塞控制算法避免网络过载:

(1) 慢启动

  • 初始阶段

    • 发送方从较小的拥塞窗口(Congestion Window, cwnd)开始,通常为 1 个 MSS(最大报文段大小)。
  • 指数增长

    • 每收到一个 ACK,拥塞窗口大小加倍,直到达到慢启动阈值(ssthresh)。

(2) 拥塞避免

  • 线性增长

    • 当拥塞窗口达到慢启动阈值后,进入拥塞避免阶段,窗口大小每经过一个往返时间(RTT)增加 1 个 MSS。
  • 目的

    • 避免窗口增长过快导致网络拥塞。

(3) 快重传和快恢复

  • 快重传

    • 当发送方收到 3 个重复的 ACK 时,立即重传丢失的数据,而不等待超时。
  • 快恢复

    • 在快重传后,发送方将拥塞窗口减半,并直接进入拥塞避免阶段,而不是从慢启动开始。
  • 作用

    • 快速检测和恢复丢包,减少网络拥塞的影响。

五. 四次挥手断开连接

TCP 通过四次挥手终止连接:

(1) 第一次挥手:FIN

  • 主动关闭方(例如客户端)发送 FIN 报文,表示数据发送完毕,请求关闭连接。

  • 客户端进入 FIN_WAIT_1 状态。


(2) 第二次挥手:ACK

  • 被动关闭方(例如服务器)收到 FIN 报文后,发送 ACK 报文确认。

  • 服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。


(3) 第三次挥手:FIN

  • 服务器完成数据发送后,发送自己的 FIN 报文,请求关闭连接。

  • 服务器进入 LAST_ACK 状态。


(4) 第四次挥手:ACK

  • 客户端收到服务器的 FIN 报文后,发送 ACK 报文确认。

  • 客户端进入 TIME_WAIT 状态,等待 2 个 MSL(最大报文段生存时间)后关闭连接。

  • 服务器收到 ACK 后,立即关闭连接。


六、确认应答(ACK)机制

1. ACK 机制的基本原理

  • 确认号(Acknowledgment Number)


    接收方通过确认号告知发送方已经成功接收的数据。

    • 确认号的值是接收方期望接收的下一个字节的序列号。例如,如果接收方成功接收了序列号为 1000-1999 的数据,它会发送确认号 2000,表示期望接收序列号为 2000 的数据。
  • ACK 标志位

    • 在 TCP 报文头中,ACK 标志位用于指示该报文是一个确认报文。

    • 当 ACK 标志位为 1 时,确认号字段才有效。


2. ACK 机制的工作流程

  1. 发送数据

    • 发送方发送一个数据报文,报文中包含序列号(Sequence Number),用于标识数据的起始位置。
  2. 接收数据

    • 接收方收到数据后,检查数据的完整性和顺序性。

    • 如果数据正确,接收方会发送一个 ACK 报文,报文中包含确认号(Acknowledgment Number),表示已经成功接收的数据。

  3. 确认数据

    • 发送方收到 ACK 报文后,根据确认号更新自己的发送窗口,继续发送后续数据。

3. ACK 机制的细节

(1) 累积确认
  • TCP 使用累积确认机制,即接收方发送的确认号表示已经成功接收的所有数据。

  • 例如:

    • 接收方收到序列号为 1000-1999 的数据后,发送确认号 2000。

    • 如果接收方后续收到序列号为 2000-2999 的数据,它会发送确认号 3000,而不是分别确认 1000-1999 和 2000-2999。

  • 优点

    • 减少确认报文的数量,提高网络效率。

(2) 延迟确认
  • 为了进一步减少确认报文的数量,TCP 实现了延迟确认机制。

  • 工作原理

    • 接收方在收到数据后,不会立即发送 ACK,而是等待一段时间(通常为 200ms),看看是否有数据需要一起发送。

    • 如果在等待期间有数据需要发送,接收方会将 ACK 和数据一起发送。

  • 优点

    • 减少网络中的小报文数量,提高网络利用率。

(3) 选择性确认(SACK)
  • 在某些情况下,接收方可能会收到乱序的数据。为了更高效地处理这种情况,TCP 提供了选择性确认(SACK)机制。

  • 工作原理

    • 接收方通过 SACK 选项告知发送方已经成功接收的非连续数据块。

    • 发送方根据 SACK 信息只重传丢失的数据,而不是重传所有数据。

  • 优点

    • 提高重传效率,减少不必要的重传。

4. ACK 机制的作用

  1. 确保数据可靠传输

    • 通过确认号,发送方可以知道接收方已经成功接收了哪些数据。

    • 如果发送方未收到 ACK,会触发重传机制,确保数据不会丢失。

  2. 控制流量

    • 接收方通过 ACK 报文中的窗口字段(Window Size)通告自己的接收能力。

    • 发送方根据窗口大小调整发送速率,防止接收方缓冲区溢出。

  3. 实现拥塞控制

    • 发送方根据 ACK 的到达情况判断网络拥塞程度。

    • 如果 ACK 延迟到达或未到达,发送方会减少发送速率,避免网络拥塞。


5. ACK 机制的示例

假设客户端和服务器之间进行数据传输:

  1. 客户端发送数据

    • 客户端发送序列号为 1000-1999 的数据。
  2. 服务器确认数据

    • 服务器成功接收数据后,发送 ACK 报文,确认号为 2000。
  3. 客户端继续发送数据

    • 客户端收到 ACK 后,继续发送序列号为 2000-2999 的数据。
  4. 服务器确认数据

    • 服务器成功接收数据后,发送 ACK 报文,确认号为 3000。

总结

  • 可靠数据传输:通过序列号、确认号、重传机制和校验和确保数据可靠传输。

  • 流量控制:通过滑动窗口机制动态调整发送速率,防止接收方缓冲区溢出。

  • 拥塞控制:通过慢启动、拥塞避免、快重传和快恢复算法避免网络拥塞。

  • 四次挥手:通过四次挥手优雅地关闭连接。

  • 其他机制:保活机制和延迟确认进一步优化了 TCP 的性能和可靠性。

  • 核心功能:通过确认号确保数据的可靠传输。

  • 优化机制:累积确认、延迟确认和选择性确认(SACK)进一步提高了 ACK 机制的效率。

  • 与其他机制的协同:ACK 机制与重传机制、流量控制和拥塞控制紧密结合,共同保证了 TCP 协议的高效性和可靠性。

  • 这些机制共同保证了 TCP 协议的高效性、可靠性和健壮性。

相关推荐
skinGap13 分钟前
Jenkins设置防火墙规则允许访问本机IP端口
tcp/ip·jenkins
Aishenyanying332 小时前
从零开始设计一个完整的网站:HTML、CSS、PHP、MySQL 和 JavaScript 实战教程
javascript·css·网络·mysql·html·php
a栋栋栋2 小时前
手动配置IP
linux·网络协议·tcp/ip
钟离墨笺7 小时前
【Linux】【网络】IO多路复用 select、poll、epoll
linux·运维·网络
WoTrusSSL9 小时前
企业网站如何快速实现全站HTTPS安全访问?
网络协议·安全·https
小昊子的iPhone9 小时前
springboot配置https
网络协议·http·https
岑梓铭9 小时前
计算机网络第九章——数据链路层《概念、组帧、差错控制、可靠传输...》
网络·网络协议·计算机网络·考研·408
兀行者(做个有情怀的java程序员)11 小时前
Java网络编程入门
java·网络
ziyu_jia14 小时前
WebSocket 握手过程
网络·websocket·网络协议