与UDP协议不同,TCP协议是面向连接的传输。这意味着在实际的数据传输之前必须在两个节点之间建立连接。IP地址和端口号用于分别标识两个节点。
TCP协议使用三次握手(三个步骤)建立连接。意图建立连接的节点首先传输包含SYN(Synchronize Sequence Number,同步顺序编号)标识的段。SYN标识表示发送方想要与接收方建立连接。
除了SYN标志,第一个段还包括单独的序列号、窗口字段和其他可选参数。序列号由一个随机数、ISN(Initial Sequence Number,初始序列号)和一个连续编号组成。连续编号表示当前发送的字节在整个数据流中的位置。接收方根据连续编号确定所有段的顺序,并重组数据流。
窗口字段提供节点的可用内存的信息,确保发送方发送给接收方的数据不会超过其可用内存的允许范围。因为通信是双向的,所以两个节点都可将各自的可用内存信息传递给对方。
在第二步中,原始接收方会发送一个SYN ACK,包含SYN标识和ACK标识,从而通知原始发送方已经接收建立连接的请求,并做出肯定确认。原始接收方还会发送自己的序列号。现在两个节点都了解对方的信息,将来所有用于交换的段都可关联到相应的发送方。
建立连接的第三步(也是最后一步)是原始发送方发送确认报文,通知对方节点已成功建立连接。之后,数据可以在两个节点之间进行交换。
由于TCP协议需要在两个节点之间建立连接,因此无法在没有特定接收方的情况下向网络发送广播或组播报文。只有通过连接才能进行可靠的数据传输,各种机制可确保数据到达接收方并且不被损坏。
CRC校验和用于保护段数据在传输期间免受损坏。上文提及的序列号可确保即使先发送的段较晚到达接收方,段的顺序也是已知的(不受到达顺序影响)。
ACK编号用于向发送方确认已接收每个段,前提是未检测到任何错误。接收方通过发送包含ACK标识的段进行确认,这表示该段具有一个有效的ACK编号。每个段还包含有关窗口字段中可用内存的更新信息,以便发送方了解当前可以向接收方发送的数据量。
如果发送方在规定的时间段内未收到肯定确认,则再次发送该段,因为这意味着该段出现故障或未到达接收方。该时间段由重发定时器决定,存在于每个段中,并且单独进行倒计时。收到肯定确认之后,发送方将清除该段对应的定时器。
所有数据交换完毕并得到肯定确认之后,连接关闭。为此,节点会发送包含FIN标识的段,表示连接终止。该FIN段的接收方必须进行确认响应,使连接处于半关闭状态。如果接收方也想终止连接,则向原始发送方发送一个包含FIN标志的段。如果得到确认,则完成终止连接,不再传输数据。