3.4.6 TCP和UDP
TCP和UDP以一种对应用程序有用的形式提供了互联网的通信能力。应用开发者可能需要其他类型的传输服务,如提供实时保证或安全性,但这些服务需要比IPv4更多的网络层支持。TCP和UDP忠实地反映了IPv4提供的应用编程级的通信设施。IPv6必然会继续支持TCP和UDP,但它包含了通过TCP和UDP无法方便访问的功能。当IPv6的部署已足够广,从而证明了那些功能的开发是必要的,那么可引入其他类型的传输服务来挖掘这些功能。
第4章从分布式程序开发者的角度描述了TCP和UDP的特征。这里我们仅描述它们给IP加入的功能。
端口的使用 第一个要注意的特征是,尽管IP协议支持两台计算机(由IP地址标识)之间的通信,但作为传输层的协议,TCP和UDP必须提供进程间的通信。这通过使用端口来完成。端口号用于将消息寻址到特定计算机上的进程,它仅在此计算机上有效。端口号是一个16位整数。一旦一个IP数据包被发送到目的主机,TCP或UDP层的软件就通过该主机的特定端口将它分派到一个进程中。
UDP的特点 UDP基本上是IP在传输层的一个复制。UDP数据报被封装在一个IP数据包中,它具有一个包含了源端口号和目的端口号的短的头部122(相应的主机地址位于IP头部)、一个长度域和一个校验和。UDP不提供传输保证。我们已经注意到,IP数据包可能会由于拥塞或网络错误被丢弃。除了可选的校验和外,UDP未增加任何额外的可靠性机制。如果校验和域非零,则接收主机根据数据包内容计算出一个校验值,与接收到的校验和相比,若两者不匹配则数据包被丢弃。
因此,依赖IP传输,UDP提供了一种在IP上附加最小开销或传输延迟、在进程对(或者在数据报地址是IP组播地址情况下,从一个进程发送到多个进程)之间传送最长达64KB的消息的方法。它不需要任何创建开销以及管理用的确认消息,但它只适应于不需要可靠传送单个或多个消息的服务和应用。
TCP的特点 TCP提供了一个更复杂的传输服务。它通过基于流的编程抽象,提供了任意长度字节串的可靠传输。可靠性保证使得发送进程递交给TCP软件的数据传送到接收进程时,其顺序是相同的。TCP是面向连接的,在数据被传送前,发送进程和接收进程必须合作,建立一个双向的通信通道。连接只是一个执行可靠数据传输的端到端的协议,中间结点(如路由器)并没有关于TCP连接的知识,一个TCP传输中传输数据的所有IP数据包并不一定使用相同的路由。
TCP层包含额外机制(在IP之上实现)以保证可靠性。这些机制包括:
排序:TCP发送进程将流分割成数据片断序列,然后将之作为IP数据包传送。每个TCP片断均有一个序号。它在该片断的第一个字节给出流中的字节数。接收程序在将数据放入接收进程的输入流前,使用序号对收到的片断排序。只有所有编号较小的片断都已收到并且放入流中后,编号大的片断才能被放入流中,因此,未按顺序到达的片断必须保存在一个缓冲区中,直到它前面的片断到达为止。
流控制:发送方管理不能使接收方或者中间结点过载,这通过片断确认机制完成。当接收方成功地接收了一个片断后,它会记录该片断的序号。接收方会不时地向发送方发送确认信息,给出输入流中片断的最大序号以及窗口大小。如果有反向的数据流,则确认信息被包含在正常的片断中,否则被放在确认数据片中。确认片断中的窗口大小域指定了在下一个确认之前允许发送方传送的数据量。
当一个TCP连接用于与一个远程交互程序通信时,会猝发产生数据,但产生的数据量可能很小。例如,利用键盘输入可能每秒仅输入几个字符,123但字符的显示必须足够快,以便用户看到自己的打字结果。这通过在本地缓冲区中设置一个超时值T(一般是0.5s)来实现。使用这个简单的方案,只要数据片断已在输出缓冲区中停留T秒,或是缓冲区的内容到达MTU限制,就将片断发送到接收方。该缓冲区方案不会使交互式延迟再增加T秒以上。Nagle描述了另一个产生较少流量的算法,它对一些交互式应用更有效[Nagle 1984]。Nagle的算法已用于许多TCP实现中。大多数TCP实现是可以配置的,允许应用程序修改T值,或是在几个缓冲区算法中选择其一。
由于无线网络的不可靠性,会导致数据包丢失频繁发生,上面的流控制机制对于无线通信不是特别适用。这是广域移动通信使用的WAP协议族采纳另一种传输机制的原因。但对无线网络而言,实现TCP也是很重要的,为此提出了TCP机制的修改提议[Balakrishnan et al.1995,1996]。其思想是在无线基站(有线网络和无线网络之间的网关)实现一个TCP支持组件。该组件探听进出无线网络的TCP片断,重传任何未被移动接收方快速确认的外发片断,并且在注意到序列号有间隔时,请求重传接收数据。
重传:发送方记录它发送的片断的序号。当它接收到一个确认消息时,它知道片断被成功接收,并将之从外发缓冲区中清除。如果在一个指定超时时间内,片断并没有得到确认,则发送方重发该片断。
缓冲:接收方的接收缓冲区用于平衡发送方和接收方之间的流量。如果接收进程发出receive操作的速度比发送进程发出send操作的速度慢很多,那么缓冲区中的数据量就会增加。通常情况下,数据在缓冲区满之前被取出,但最终缓冲区会溢出,此时到达的片断不被记录就直接被丢弃了。因此,接收方不会给出相应的确认,而发送方将被迫重新发送片断。
校验和:每个片断包含一个对头部和片断中数据的校验和,如果接收到的片断和校验和不匹配,则片断被丢弃。