TCP(Transmission Control Protocol,传输控制协议)
TCP(Transmission Control Protocol,传输控制协议) 是互联网协议族(TCP/IP)中的核心协议之一,负责在网络中提供可靠的、面向连接的字节流传输服务。
TCP 的核心特点
1.面向连接(Connection-Oriented)
- 通信双方在传输数据前需先建立逻辑连接(通过 “三次握手” 实现),数据传输完成后释放连接(“四次挥手”)。
- 类似 “打电话”,需先拨号建立连接,通话结束后挂断。
2.可靠性(Reliability)
- 通过确认机制(ACK)确保数据到达:发送方发送数据后等待接收方确认,未确认则重传。
- ** 序列号(Sequence Number)和确认号(Acknowledgment Number)** 机制:确保数据按顺序接收,乱序时重新排序。
- 流量控制(Flow Control):通过滑动窗口(Sliding Window)机制避免发送方发送速度超过接收方处理能力。
- 拥塞控制(Congestion Control):避免网络拥塞,动态调整发送方的传输速率(如慢启动、拥塞避免、快速重传等算法)。
3.字节流服务(Byte Stream Service)
- 数据被视为无边界的字节流,发送方逐字节写入,接收方逐字节读出,不保留消息边界(与 UDP 的 “数据报” 服务不同)。
TCP 报文段(Segment)格式
TCP 数据传输的基本单位是报文段,其头部格式如下(共 20 字节固定部分,可包含可选字段):\
字段 | 长度 | 说明 |
---|---|---|
源端口号 | 16 位 | 发送方端口号(标识应用进程) |
目的端口号 | 16 位 | 接收方端口号(标识应用进程) |
序列号 | 32 位 | 本报文段数据的第一个字节在字节流中的编号 |
确认号 | 32 位 | 期望接收的下一个字节的编号(表示已成功接收该编号之前的数据) |
数据偏移 | 4 位 | 头部长度(以 4 字节为单位,标识可选字段的长度) |
保留 | 6 位 | 保留字段(未使用,置 0) |
控制位 | 6 位 包含多个标志位: | - URG(紧急指针有效) - ACK(确认号有效) - PSH(推送数据) - RST(重置连接) - SYN(建立连接) - FIN(释放连接) |
窗口大小 | 16 位 | 接收方的接收窗口大小(用于流量控制,单位为字节) |
校验和 | 16 位 | 对头部和数据进行校验,确保数据完整性 |
紧急指针 | 16 位 | 配合 URG 标志,标识紧急数据的末尾位置 |
可选字段 | 可变长度 | 如最大段大小(MSS)、时间戳(Timestamp)等 |
客户端和服务器端函数调用
1.客户端(发送端)
1.socket()创建TCP套接字
2.connect()连接服务器端(接收端)的TCP套接字
3.连接成功,调用send()或write()发送数据
2.服务器端(接收端)
1.socket()创建TCP套接字
2.bind()绑定套接字与服务器地址
3.listen()监听套接字上的连接请求
4.accept()接收连接请求建立连接,成功会返回一个新的文件描述符
5.当服务器与客户端成功建立连接,调用recv()或read()接收数据
TCP 连接管理:三次握手与四次挥手
1.三次握手(建立连接)
步骤:
客户端→服务器:发送 SYN 报文段(序列号 = J,SYN=1),请求建立连接。
服务器→客户端:发送 SYN+ACK 报文段(序列号 = K,确认号 = J+1,SYN=1,ACK=1),确认客户端请求并发起自身连接请求。
客户端→服务器:发送 ACK 报文段(序列号 = J+1,确认号 = K+1,ACK=1),确认服务器请求,连接建立完成。
目的:
确保双方确认彼此的接收和发送能力正常。
同步双方的初始序列号(避免历史残留报文段干扰新连接)。
2.四次挥手(释放连接)
步骤:
主动关闭方→被动关闭方:发送 FIN 报文段(序列号 = M,FIN=1),请求关闭连接。
被动关闭方→主动关闭方:发送 ACK 报文段(序列号 = N,确认号 = M+1,ACK=1),确认收到关闭请求(此时连接处于半关闭状态,被动关闭方仍可发送剩余数据)。
被动关闭方→主动关闭方:发送 FIN 报文段(序列号 = P,FIN=1),表示自身数据已发送完毕。
主动关闭方→被动关闭方:发送 ACK 报文段(序列号 = M+1,确认号 = P+1,ACK=1),确认关闭,连接正式释放。
为什么需要四次挥手?
因为 TCP 是全双工通信,双方需各自单独关闭发送通道(主动关闭方先关闭自己的发送通道,被动关闭方处理完剩余数据后再关闭自己的发送通道)。
TCP 与 UDP 的对比
特性 | UDP | TCP |
---|---|---|
连接性 | 无连接 | 面向连接(三次握手) |
可靠性 | 不可靠 | 可靠(重传、排序) |
传输效率 | 高(开销小) | 低(协议开销大) |
应用场景 | 实时音视频、游戏、DNS | 文件传输、网页浏览、邮件 |
拥塞控制 | 无 | 有(慢启动、拥塞避免) |
传输单位 | 数据报(Datagram | 字节流(Byte Stream) |
TCP 的应用场景
TCP 广泛应用于需要可靠数据传输的场景,例如:
- Web 服务:HTTP/HTTPS 基于 TCP 传输网页数据。
- 文件传输:FTP、SFTP 通过 TCP 保证文件完整传输。
- 电子邮件:SMTP、POP3、IMAP 协议基于 TCP 收发邮件。
- 远程登录:SSH、Telnet 通过 TCP 建立远程连接。
- 数据库访问:MySQL、PostgreSQL 等通过 TCP 进行客户端 - 服务器通信。
TCP 的常见问题与优化
1.超时重传(Timeout Retransmission)
- 发送方在超时未收到 ACK 时重传数据,超时时间需动态调整(如基于 RTT 估算)。
2.拥塞控制算法
- 慢启动(Slow Start):初始时缓慢增加发送窗口大小,避免瞬间拥塞。
- 拥塞避免(Congestion Avoidance):窗口增长到阈值后,改为线性增长。
- 快速重传(Fast Retransmit):收到 3 次重复 ACK 时立即重传,无需等待超时。
- 快速恢复(Fast Recovery):重传后调整窗口大小,恢复传输效率。
3.延迟确认(Delayed ACK)
- 接收方延迟发送 ACK 以合并多个数据段的确认,减少网络开销。
4.Nagle 算法
- 合并小数据段为一个报文段发送,减少网络中的小包数量(适用于交互式应用,如 SSH)。
总结
TCP 通过复杂的机制确保了数据在不可靠网络中的可靠传输,是互联网的 “可靠基石”。理解 TCP 的原理(如三次握手、四次挥手、流量控制、拥塞控制等)对网络编程、性能优化和故障排查至关重要。如需进一步探讨某一细节(如具体协议抓包分析、优化策略等),可随时补充说明!