TCP协议
TCP协议概述
TCP(Transmission Control Protocol,传输控制协议)是互联网协议栈(TCP/IP协议族)中的核心传输层协议之一, 它是一种面向连接的、可靠的、基于字节流的传输协议。它主要用于在不可靠的网络环境中(如互联网)提供可靠的数据传输服务,它被广泛应用于Web浏览、电子邮件、文件传输等需要数据完整性和顺序的应用中。
TCP协议的设计目标是解决底层网络(如IP协议)的不可靠性问题。IP协议只负责数据包的路由和传递,但不保证数据包的到达、顺序或完整性。TCP在IP之上添加了可靠机制,确保数据在发送方和接收方之间可靠传输。
TCP的关键特性
TCP协议具有以下主要特性,这些特性使其成为可靠传输的首选,其特性如下表:
特性 | 描述 | 实现机制 |
---|---|---|
面向连接 | 必须先建立连接后传输数据 | 三次握手、四次挥手 |
可靠传输 | 保证数据不丢失、不乱序 | ACK、重传、序号机制 |
流式传输 | 数据作为连续流处理 | 段分割与重组 |
流量控制 | 防止接收方缓冲区溢出 | 滑动窗口 |
拥塞控制 | 避免网络过载 | 慢启动、拥塞避免等算法 |
错误检测 | 检测传输错误 | 校验和 |
面向连接(Connection-Oriented):
在数据传输前,必须通过“三次握手”建立连接;在传输结束后,通过“四次挥手”关闭连接。这确保了双方都准备好通信,避免了单方面的数据丢失。可靠传输(Reliable Delivery):
TCP使用确认(ACK)、重传、校验和等机制保证数据不丢失、不重复、不乱序。如果数据包丢失或损坏,发送方会重传。流式传输(Byte Stream-oriented):
TCP将应用层的数据视为连续的字节流,而不是独立的消息。发送方将数据分割成段(Segments),接收方重组它们,确保数据按顺序交付。全双工通信(Full-Duplex):
连接建立后,双方可以同时发送和接收数据。流量控制(Flow Control):
使用滑动窗口机制,接收方告知发送方其缓冲区大小,防止发送方过快发送数据导致接收方溢出。拥塞控制(Congestion Control):
TCP监测网络拥塞,通过调整发送速率(如慢启动、拥塞避免、快速重传等算法)避免网络崩溃。常见算法包括Tahoe、Reno和NewReno。错误检测和恢复:
每个TCP段包含校验和(Checksum),用于检测传输错误。如果错误,数据会重传。
TCP的工作原理
TCP的工作可以分为连接建立、数据传输、连接终止三个阶段。
1. 连接建立:三次握手(Three-Way Handshake)
假设客户端是 A,服务器是 B:
第一次握手:
A → B:发送 SYN=1,seq=x(A 请求建立连接,并告诉 B 我这边的初始序列号是 x)表示“我想和你通信,并从序号 x 开始发送数据。”
第二次握手:
B → A:发送 SYN=1,ACK=1,seq=y,ack=x+1表示“我收到了你的请求(ACK),我也准备好通信(SYN),我的初始序列号是 y。”
第三次握手:
A → B:发送 ACK=1,seq=x+1,ack=y+1表示“我也收到了你的确认,我们可以正式开始传输数据了。”
如果任何一步失败,连接不会建立。这防止了“半开连接”问题。
2. 数据传输
- 分段与序号:数据被分成TCP段,每段有序列号。接收方使用确认号回复已接收的数据。
- 重传机制:如果未收到ACK,发送方超时重传(RTO,Retransmission Time-Out)。
- 滑动窗口:窗口大小动态调整,允许发送方发送多个未确认的段,提高效率。
- 拥塞控制阶段:
- 慢启动:窗口从1开始指数增长。
- 拥塞避免:线性增长窗口。
- 快速恢复:检测到丢失时,快速重传而不减速太多。
3. 连接终止:四次挥手(Four-Way Handshake)
假设客户端是 A,服务器是 B:
第一次挥手:
A → B:发送 FIN=1,seq=u“我没有数据要发了,但还能接收你的数据。”
第二次挥手:
B → A:发送 ACK=1,ack=u+1“我收到了你的关闭请求,但我还有数据要发。”
第三次挥手:
B → A:发送 FIN=1,seq=v“我的数据也发完了,准备关闭。”
第四次挥手:
A → B:发送 ACK=1,ack=v+1“我收到了你的关闭确认。”
四次挥手允许半关闭(一方关闭发送,但仍可接收)。
为什么是三次握手和四次挥手
知其然必须知其所以然,为什么不能是一次,两次,更多次?
为什么是三次握手
至少是两次握手,因为需要确认双方都准备好通信,A发送SYN,B回一次ACK答复A可以建立连接。
最后一次A向B发送ACK是A告诉B,确实是“我”要建立新连接,你收到的不是网络中因为网络拥塞等原因
晚到达的旧SYN报文。同时,通过最后一次ACK,B也能确认A接收数据能力正常。为什么是四次挥手
因为TCP是全双工通信,连接的两端都可进行数据发送和接收,断开连接时,A,B双方都需要通告对方自己数据已经发送完成,需要关闭连接, 从而确保双方 各自的发送和接收通道都安全关闭。
TCP与UDP的比较
UDP(User Datagram Protocol,用户数据报协议)是TCP的“轻量级”替代品。以下是二者的比较:
方面 | TCP | UDP |
---|---|---|
连接性 | 面向连接 | 无连接 |
可靠性 | 可靠(重传、ACK) | 不可靠(无重传) |
传输类型 | 字节流 | 数据报(消息边界) |
开销 | 高(头部20-60字节,额外机制) | 低(头部8字节) |
速度 | 较慢(由于可靠性机制) | 更快 |
应用场景 | HTTP、FTP、SMTP(需要可靠传输) | DNS、视频流、游戏(容忍丢失) |
TCP适合对数据完整性要求高的场景,而UDP适合实时性强的应用。
TCP的头部结构
TCP段的头部至少20字节,包括:
各个字段解释如下:
字段 | 长度(位) | 描述 |
---|---|---|
源端口(Source Port ) | 16 | 标识发送方应用程序的端口号 |
目的端口(Destination Port ) | 16 | 标识接收方应用程序的端口号 |
序列号(Sequence Number ) | 32 | 标识发送的数据段的顺序号 |
确认号(Acknowledgment Number ) | 32 | 期望收到的下一个数据段的序列号 |
标志位 | 若干 | 包括SYN、ACK、FIN、RST等控制标志 |
窗口大小(Window Size ) | 16 | 接收方告知发送方自己的缓冲区可用大小 |
校验和(Checksum ) | 16 | 用于检验数据完整性 |
可选项(Options ) | 可变 | 包括MSS、时间戳等可选参数 |
常见应用和扩展
- 应用:TCP是HTTP/HTTPS、FTP、SSH、SMTP等协议的基础。现代网络中,QUIC(基于UDP的协议)正在部分取代TCP以提高性能。
- 问题与优化:TCP在高延迟网络(如卫星)中表现差;拥塞控制算法不断优化(如BBR算法,使用带宽和延迟估算)。
- 安全性:TCP本身不加密,但常与TLS结合形成HTTPS。