TCP 连接的定义
TCP(Transmission Control Protocol,传输控制协议)连接是一种面向连接的、可靠的、基于字节流的传输层通信协议连接。它为应用程序提供了一种可靠的、全双工的通信通道,使得数据能够在网络中的两个端点之间准确、有序地传输。
TCP 连接的核心特性
面向连接
- 三次握手建立连接
在数据传输之前,TCP 需要通过三次握手的过程来建立连接。这就好比两个人打电话,先一方拨号(客户端发送 SYN 包),对方接起电话并回应(服务器发送 SYN + ACK 包),最后拨号方确认(客户端发送 ACK 包),这样双方就建立起了通话连接,TCP 连接也正式建立。- 客户端发送 SYN 包:客户端向服务器发送一个 SYN(Synchronize Sequence Numbers,同步序列编号)包,其中包含客户端的初始序列号(ISN),表示客户端希望建立连接。
- 服务器回应 SYN + ACK 包:服务器收到客户端的 SYN 包后,会发送一个 SYN + ACK 包作为回应。这个包中包含服务器的初始序列号,以及对客户端初始序列号的确认(ACK = 客户端 ISN + 1)。
- 客户端发送 ACK 包:客户端收到服务器的 SYN + ACK 包后,会发送一个 ACK 包作为确认。这个包中的 ACK = 服务器 ISN + 1,表示客户端已经收到了服务器的回应,连接建立成功。
- 四次挥手断开连接
当数据传输完成后,TCP 需要通过四次挥手的过程来断开连接。就像两个人结束通话,一方先说"我要挂电话了"(客户端发送 FIN 包),对方回应"好的"(服务器发送 ACK 包),然后对方也表示要挂电话(服务器发送 FIN 包),最后一方确认(客户端发送 ACK 包),连接才正式断开。- 客户端发送 FIN 包:客户端向服务器发送一个 FIN(Finish,结束)包,表示客户端已经没有数据要发送了,希望关闭连接。
- 服务器回应 ACK 包:服务器收到客户端的 FIN 包后,会发送一个 ACK 包作为回应,确认收到了客户端的关闭请求。此时,客户端到服务器的连接已经关闭,但服务器到客户端的连接还可以继续传输数据。
- 服务器发送 FIN 包:当服务器也没有数据要发送时,会向客户端发送一个 FIN 包,表示服务器也希望关闭连接。
- 客户端发送 ACK 包:客户端收到服务器的 FIN 包后,会发送一个 ACK 包作为确认,连接正式断开。
可靠性
- 数据确认与重传
TCP 采用确认和重传机制来保证数据的可靠传输。发送方每发送一个数据段,都会等待接收方的确认(ACK)。如果在规定的时间内没有收到确认,发送方会认为数据丢失,重新发送该数据段。例如,你给朋友发一条消息,朋友收到后会回复"已收到",如果你长时间没收到回复,就会重新发送这条消息。 - 序列号与校验和
每个 TCP 数据段都包含一个序列号,用于标识数据段在数据流中的位置。接收方可以根据序列号将接收到的数据段按顺序重新组装成完整的数据。同时,TCP 还使用校验和来检测数据在传输过程中是否发生了错误。如果校验和不匹配,接收方会丢弃该数据段,并要求发送方重新发送。
基于字节流
TCP 将应用程序传输的数据看作是一连串无结构的字节流,而不是像 UDP 那样以数据报为单位进行传输。这意味着 TCP 可以根据网络状况和接收方的处理能力,灵活地调整数据段的长度和发送速率。例如,你可以将一篇文章当作一个字节流,TCP 会自动将其分割成合适大小的数据段进行传输,接收方再将这些数据段重新组装成完整的文章。
TCP 连接的工作过程
数据传输
- 数据分段:当应用程序通过 TCP 套接字发送数据时,TCP 会将数据分割成适当大小的数据段(Segment)。每个数据段都包含一个 TCP 头部和数据部分,TCP 头部中包含了序列号、确认号、窗口大小等控制信息。
- 流量控制:TCP 使用滑动窗口机制来实现流量控制。接收方会通过 ACK 包中的窗口大小字段告诉发送方自己还有多少缓冲区空间可以接收数据。发送方根据接收方的窗口大小来调整发送速率,避免发送方发送数据过快导致接收方无法及时处理。例如,接收方的缓冲区只能容纳 1000 字节的数据,那么发送方每次最多发送 1000 字节的数据,等接收方处理完并返回新的窗口大小后,再继续发送。
- 拥塞控制:TCP 还会根据网络的拥塞情况来调整发送速率。当网络出现拥塞时,TCP 会减小发送窗口的大小,降低发送速率,以避免网络拥塞进一步加剧。常见的拥塞控制算法有慢开始、拥塞避免、快重传和快恢复等。
错误处理
- 超时重传:如果发送方在规定的时间内没有收到接收方的确认,会认为数据丢失,重新发送该数据段。超时时间的设置会根据网络的往返时间(RTT)进行动态调整。
- 快速重传:当接收方连续收到三个重复的 ACK 时,会认为后面的数据段丢失,立即向发送方发送重复的 ACK,要求发送方快速重传丢失的数据段,而不需要等待超时。
TCP 连接的应用场景
- Web 浏览:当我们使用浏览器访问网页时,浏览器和 Web 服务器之间通过 TCP 连接进行通信。浏览器发送 HTTP 请求,服务器返回 HTTP 响应,通过 TCP 连接保证了网页数据的可靠传输。
- 文件传输:FTP(文件传输协议)等文件传输协议使用 TCP 连接来传输文件,确保文件在传输过程中不会丢失或损坏。
- 电子邮件:SMTP(简单邮件传输协议)、POP3(邮局协议版本 3)和 IMAP(互联网消息访问协议)等电子邮件协议也使用 TCP 连接来传输邮件,保证邮件的准确送达。