这种简单性是 IP 的主要优点,因为它下面的物理介质不做任何假定,IP 可以在任何能
够传递数据包的物理连接上运行。例如,IP 可以简单运行在串行链路上,运行在以太网和
令牌环局域网上,运行在 X.25 和异步转移模式(ATM)的广域网上,运行在无线 cellular
Digital Packet Data(CDPD)网络上,以及运行在除此之外的许多其他网络上。尽管这些网
络技术差异很大,但 IP 总能平等地对待它们就是知道它们可以路由数据包,也不在上面做
任何假定。这种隐含的假设是深奥的。既然 IP 可以运行在任何可以传输数据包的网络之上,
那么整个 TCP/IP 协议族也是可以的。
现在让我们看看 TCP 是如何使用这个简单的无连接服务来提供可靠的面向连接的服务
的。因为 TCP 发送它的数据包,封装在 IP 数据报里面就称作为段(segment),这根本不
能保证它们能够到达目的地,所以更不用说没有被破坏和顺序正确了。为了提供可靠性 ,
TCP 在基本的 IP 服务里增加了三个服务。首先,它为 TCP 段提供了校验和机制。这就能
保证到达目的地的数据在网络上传输时被破坏时也能发现,就可以重传该数据段;其次,
它为每个字节分配一个序列号,如果不按顺序到达目的地,那么接收方也可以重新把它们
按顺序组合起来。当然,TCP 并不为每个字节附加一个序列号,只是每一个 TCP 段的首部
中包含了数据部分起始字节的序列化编号,段中其它字节的序号就可以隐含地知道了。第
三,TCP 提供了一个确认和重传机制来保证每个数据段最终都会到达目的地递交到上层。
确认/重传机制是目前为止最为复杂的一个。
TCP 连接的每一方维护着一个接收窗口(receive window),该窗口是准备接收对等方
的数据的序列号范围。最低值,代表窗口的左边,是下一个将要接收字节的序列号。最高
值,代表窗口的右边,是 TCP 缓存空间准备承载的最大编号的字节。不用期望的下一字节
计数器而用接收窗口是通过提供流控制来增加可靠性。流控制机制是 TCP 用来防止对等方
缓存空间溢出的。
当 TCP 段到达时,丢弃任何超出接收窗口以外的序列号的数据。这些数据包括先前已
经接受过的,也就是这些数据具有接收窗口左边的序号,还有那些具有在接收窗口右边序
号的数据,这些数据没有缓存可用。如果 TCP 段中第一个可接收的字节不是下一个期望接
收的字节,那么该 TCP 段就不是按序到达的,并且大部分 TCP 实现将该段排队直到丢失的
数据到达。如果 TCP 段中第一个可接收的字节是下一个期望接收的字节,那么数据就适用
于提交到上层的应用,并且下一个期望的字节的序号就要更新,增加后面段可接收的字节
数。这就是说,窗口通过可接收的字节个数向有滑动。
图 1.2 TCP 接收窗口
例如,在图 1.2(A)中,虚线盒表示接收窗口,下一个期望的字节有序号 4,TCP 可以
接收 9 个字节(4-12)。 图 1.2(B)显示字节 4,5,6 和 7 接收之后的接收窗口。窗口已经向右
滑动了四个序号,并且 TCP 的确认 ACK 将指定期望的下一字节的序号 8。