剖析TCP和UDP协议( 二 )


16位长的窗口区域表示了“滑动窗口”的大小,也就是告诉发送方它已经预备好接收多少个字的数据 。TCP通过调整窗口的大小来控制数据的流量 。一个值为0的窗口意味着通告发送方:假如没有进一步的通知,接收器已满,不能再接收更多的数据了 。大的窗口可以确保在任何给定的时间传输多达65536个未经确认的字节,但是,当重发定时器超时且又没有得到接收确认时,窗口将减半,从而有效地降低传输速率 。
16位的校验码区域保证了数据的完整性,保护了TCP头部和IP头部的各个区域 。发送方计算校验值并把它插入这个区域,接收方根据收到的包重新计算该值并比较二者,假如它们是匹配的,则认为数据是完整无损的 。
当设置紧急标志位时,紧急指针是一个16位的偏移量,它代表必须加快的最后一个字 。选择区域可以容纳0或多个32位字,可扩展TCP的性能 。大多数常用的选择区域支持大于65536字节的窗口,从而缩短了等待确认的时间,尤其是在高传输率时 。
TCP的传输机构有多个定时器 。当一个包发送时,重发定时器开始计数;当收到确认信号后,重发定时器停止计数 。假如超过设定时间段还没有收到确认信号,就重发该包 。一个比较棘手的问题是如何设置该时间段 。假如太长,当网络传输错误增加时将导致不必要的等待时间;假如太短,就会产生过多的重复包从而降低网络的反应时间 。现代TCP协议根据实际情况对重发定时器进行动态设定 。
持续定时器对于避免死锁是必不可少的 。假如网络收到了一个大小为0的窗口确认并且丢失了随后的重发数据的确认,持续定时器将超时并发送一个探针 。探针的回应将指出窗口的大小(也许仍为0) 。保持定时器在本端没有任何活动后,将检查在连接的另一端是否还有运行的进程 。假如没有任何回应,该定时器将断开连接 。
当断开一个连接时,断开连接定时器将包的最大生命期加倍 。该定时器在连接断开之前确保流量最大 。
不管重发过程执行得多么有效,很少的丢失包就能严重地降低TCP连接的流量 。每个未收到的包或包的片段只会在重发定时器超时的时候才会丢失 。在数据重发时,接收过程一直在递送这些重发的数据,这样就使总体的数据传输陷于停顿,直到丢失的数据被取代为止 。这些重发过程导致基于TCP的连接有时处于不稳定状态 。
TCP与UDP的选择
假如比较UDP包和TCP包的结构,很明显UDP包不具备TCP包复杂的可靠性与控制机制 。与TCP协议相同,UDP的源端口数和目的端口数也都支持一台主机上的多个应用 。一个16位的UDP包包含了一个字节长的头部和数据的长度,校验码域使其可以进行整体校验 。(许多应用只支持UDP,如:多媒体数据流,不产生任何额外的数据,即使知道有破坏的包也不进行重发 。)
很明显,当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,TCP协议是当然的选择 。当强调传输性能而不是传输的完整性时,如:音频和多媒体应用,UDP是最好的选择 。在数据传输时间很短,以至于此前的连接过程成为整个流量主体的情况下,UDP也是一个好的选择,如:DNS交换 。把SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时,UDP较低的开销使其有更好的机会去传送治理数据 。TCP丰富的功能有时会导致不可预料的性能低下,但是我们相信在不远的将来,TCP可靠的点对点连接将会用于绝大多数的网络应用 。

推荐阅读