强关联博客:TCP协议报头及各个字段的作用-CSDN博客
目录
[一. 三次握手建立连接](#一. 三次握手建立连接)
[1. 第一次握手:客户端发送 SYN 报文](#1. 第一次握手:客户端发送 SYN 报文)
[2、第二次握手:服务器回应 SYN-ACK 报文](#2、第二次握手:服务器回应 SYN-ACK 报文)
[3.第三次握手:客户端发送 ACK 报文](#3.第三次握手:客户端发送 ACK 报文)
[二. 可靠数据传输](#二. 可靠数据传输)
[(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)
[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 机制的示例)
![](https://i-blog.csdnimg.cn/direct/fca2cd39bd4341f48bed5d8d78ad228f.png)
一. 三次握手建立连接
1、字段
在数据传输前,TCP通过三次握手确保双方准备好通信:
-
SYN:客户端发送SYN报文,包含初始序列号(ISN)。
-
SYN-ACK:服务器回应SYN-ACK报文,确认客户端的SYN,并发送自己的ISN。
-
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、三次握手的总结
-
第一次握手:
-
客户端发送 SYN 报文,携带自己的初始序列号(ISN)。
-
目的是告诉服务器:"我想和你建立连接,我的序列号从 ISN 开始。"
-
-
第二次握手:
-
服务器回应 SYN-ACK 报文,携带自己的初始序列号(ISN),并确认客户端的 SYN 报文。
-
目的是告诉客户端:"我收到了你的请求,同意建立连接,我的序列号从 ISN 开始。"
-
-
第三次握手:
-
客户端发送 ACK 报文,确认服务器的 SYN 报文。
-
目的是告诉服务器:"我收到了你的确认,连接已建立。"
-
4、为什么需要三次握手?
-
确保双方都能发送和接收数据:
- 三次握手确保客户端和服务器都能正常发送和接收数据,验证了双向通信的能力。
-
防止旧的重复连接初始化:
- 如果网络中存在延迟的旧 SYN 报文,三次握手可以避免错误地建立连接。
-
同步初始序列号(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 机制的工作流程
![](https://i-blog.csdnimg.cn/direct/f747d50bda8a43bcbb00574bbf64c97a.png)
-
发送数据:
- 发送方发送一个数据报文,报文中包含序列号(Sequence Number),用于标识数据的起始位置。
-
接收数据:
-
接收方收到数据后,检查数据的完整性和顺序性。
-
如果数据正确,接收方会发送一个 ACK 报文,报文中包含确认号(Acknowledgment Number),表示已经成功接收的数据。
-
-
确认数据:
- 发送方收到 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 机制的作用
-
确保数据可靠传输:
-
通过确认号,发送方可以知道接收方已经成功接收了哪些数据。
-
如果发送方未收到 ACK,会触发重传机制,确保数据不会丢失。
-
-
控制流量:
-
接收方通过 ACK 报文中的窗口字段(Window Size)通告自己的接收能力。
-
发送方根据窗口大小调整发送速率,防止接收方缓冲区溢出。
-
-
实现拥塞控制:
-
发送方根据 ACK 的到达情况判断网络拥塞程度。
-
如果 ACK 延迟到达或未到达,发送方会减少发送速率,避免网络拥塞。
-
5. ACK 机制的示例
假设客户端和服务器之间进行数据传输:
-
客户端发送数据:
- 客户端发送序列号为 1000-1999 的数据。
-
服务器确认数据:
- 服务器成功接收数据后,发送 ACK 报文,确认号为 2000。
-
客户端继续发送数据:
- 客户端收到 ACK 后,继续发送序列号为 2000-2999 的数据。
-
服务器确认数据:
- 服务器成功接收数据后,发送 ACK 报文,确认号为 3000。
总结
-
可靠数据传输:通过序列号、确认号、重传机制和校验和确保数据可靠传输。
-
流量控制:通过滑动窗口机制动态调整发送速率,防止接收方缓冲区溢出。
-
拥塞控制:通过慢启动、拥塞避免、快重传和快恢复算法避免网络拥塞。
-
四次挥手:通过四次挥手优雅地关闭连接。
-
其他机制:保活机制和延迟确认进一步优化了 TCP 的性能和可靠性。
-
核心功能:通过确认号确保数据的可靠传输。
-
优化机制:累积确认、延迟确认和选择性确认(SACK)进一步提高了 ACK 机制的效率。
-
与其他机制的协同:ACK 机制与重传机制、流量控制和拥塞控制紧密结合,共同保证了 TCP 协议的高效性和可靠性。
-
这些机制共同保证了 TCP 协议的高效性、可靠性和健壮性。
![](https://i-blog.csdnimg.cn/direct/6d63799c12f040b7b1a19ba90897fefc.gif)