我知道的 TCP

或者说,大家都知道的 TCP 知识

1起步
2内部实现
2.1连接管理
3未完待续......

内部实现

在计算机网络中,当我们从一个机器向另一个机器发送多个分组来传递信息的时候,我们可能会遇到各种问题:分组重新排序、分组复制、分组丢失。TCP 需要妥善处理这些问题,才能提供一个可靠的信道。

我们使用自动重复请求(Automatic Repeat Request,ARQ)的方式来处理分组丢失。当我们检测到分组丢失后,会重新发送直到对端接收到该分组。为了能够检测到分组丢失,对端需要返回信息来告知我们已经接收到了对应分组,我们称其为确认(acknowledgment),或 ACK;而如果我们在一段时间内都没接收到 ACK,则认为很大概率发生了分组丢失,于是重复发送该分组。

如果 ACK 丢失,我们也会简单地重复发送分组,也可能因为其他原因导致分组被重复发送。我们需要一个机制来检测到重复分组并丢弃多余的分组,为此我们使用序列号。

为了提高吞吐量,我们不会等待上一个分组返回 ACK 后再发送下一个分组。这就要求 ACK 包能够标识出它确认的是哪个 TCP 分组,同时也要求接收端能够处理乱序的 TCP 分组,因为不同的 TCP 分组在网络中传输需要的时间可能不同。

还有更多问题等待解决。例如,发送数据时需要考虑到接收端处理数据的速度,以及中间路由器传输速率的限制。

可以看到,和 UDP 协议不同的是,TCP 两端都需要维护一个状态,包括需要知晓哪些分组没有接收到 ACK、需要维护序列号等等。我们需要一个机制让双方的状态达成一致,同时在双方正式通信前,以最小的代价确认双方的收发能力正常,并避免历史遗留连接引发的干扰,为此我们使用 “三次握手” 机制来建立 TCP 连接。而为了保证数据流能完整传输,我们一般不会直接断开 TCP 连接,而是使用 “四次挥手” 机制来断开。

链接和引用

  1. 《TCP/IP 详解 -- 卷 1:协议》,[美] Kevin R. Fall, W. Richard Stevens 著,吴英等译,机械工业出版社.