尽管 TCP 和 UDP 使用相同的网络层(IP),TCP 却向应用层提供与 UDP 完全不同的服务。TCP 提供一种面向连接的、可靠的字节流服务。
面向连接意味着两个使用 TCP 的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个 TCP 连接。
在一个 TCP 连接中,仅有两方进行彼此通信。广播和多播不能用于 TCP。
TCP 通过以下方式来提高可靠性:
-
应用数据被分割成 TCP 认为最适合发送的数据块。这和 UDP 完全不同,应用程序产生的数据报长度将保持不变。由 TCP 传递给 IP 的信息单位称为报文段/段(Segment)。
-
当 TCP 发送一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
-
当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
-
TCP 将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中的任何变化。如果收到的校验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段(希望发送端超时并重发)
-
既然 TCP 报文作为 IP 数据报来传输,而 IP 数据报的到达可能会失序,因此 TCP 报文段的到达也可能会失序。如果必要,TCP 将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
-
既然 IP 数据报会发生重复,TCP 的接收端必须丢弃重复的数据。
-
TCP 还能提供流量控制。TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓存区所能接纳的数据。这将防止较快主机致使较慢主机的缓存区溢出。
另外,TCP 对字节流的内容不做任何解释。TCP 不知道传输的数据字节流是二进制数据,还是 ASCII 字符、EBCDIC字符或者其他类型数据。对字节流的解释由 TCP 连接双方的应用层解释。
-
请求端(客户)发送一个 SYN 段表明客户打算连接的服务器端口,以及初始序号(ISN)。
-
服务端发回包含服务器的初始序号的 SYN 报文段作为应答。同时,将确认序号(ACK)设置为客户的 ISN 加 1以对服务器的 SYN 报文段进行确认。一个 SYN 将占用一个序号。
-
客户端必须将确认序号(ACK)设置为服务器的 ISN 加 1 以对服务器的 SYN 报文段进行确认。
发送第一个 SYN 的一端将执行主动打开,接收这个 SYN 并发回一个 SYN 的另一端执行被动打开。
当一端为建立连接而发送它的 ISN 时,它为连接选一个初始序号。ISN 随时间而变化,因此每个连接都具有不同的 ISN。ISN 可看作是一个 32 bit 的计数器,每 4ms 加 1.这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。
既然 TCP 是全双工的,因此没每个方向都必须单独地关闭。当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的发送。当一端收到一个 FIN,它必须通知应用层另一端几经终止了那个方向的数据传送。发送 FIN 通常是应用层进行关闭的结果。
收到一个 FIN 意味着这一方向上没有数据流动。一个 TCP 连接在收到一个 FIN 后仍能发送数据。
- FIN,ACK
- ACK(FIN + 1)
- FIN,ACK
- ACK(FIN + 1)
首先进行关闭的一方(即发送第一个 FIN)将执行主动关闭,而另一方(收到这个 FIN)执行被动关闭。