确认收到数据段

TCP 的其中一项功能是确保每个数据段到达目的地。 位于目的主机的 TCP 服务对接收到的数据进行确认,并向源应用程序发送确认信息。

该服务将使用序列 (SEQ) 号以及确认 (ACK) 号来确认已收到包含在已传输数据段中的数据字节。 SEQ 号表示此会话中传输的相对字节数,包括当前数据段中的字节。 TCP 使用 ACK 号发回源,指定接收方期望接收的下一字节。 这称为期待确认。

收到确认信息后,源设备即得知目的设备已收到数据流中确认号之前的所有字节(但不包括 ACK 号所指示的字节)。 随后,源主机将继续发送数据段,且数据段的序列号应等于该 ACK 号。

请记住,每个连接都实际包含两个单向会话, SEQ 号和 ACK 号双向交换。

在右图所示的实例中,左侧主机正在向右侧主机发送数据。 它发送的数据段包含 10 字节的会话数据,数据段报头中的序列号等于 1。

接收主机在第 4 层接收数据段,并确认其序列号为 1,且数据字节数为 10。 该主机随即向左侧主机发送数据段,确认收到数据。 在该数据段中,主机将 ACK 号设为 11,表明它期望下一接收数据的字节数为 11。 当发送主机接收到该确认信息时,它可以立即发送字节编号为 11 的下一会话数据段。

在本例中,如果发送主机必须等待接收每 10 字节的确认,网络会有大量开销。 为减少这些确认信息的开销,可以发送多个数据段,并在相反方向上采用单一 TCP 消息进行确认。 这种确认消息中包含基于所接收的所有会话字节的 ACK 号。 例如当序列号从 2000 起算时,如果已接收到 10 个 1,000 字节的数据段,则可以向源设备发送一条 ACK 号为 12001 的确认消息。

源在收到确认之前可以传输的数据量称为窗口大小,这是 TCP 报头中的一个字段,用于管理丢失数据和流量控制。