1.3.3 传输层
虽然还没有多谈这一层,但它是非常重要的一层。传输层协议包括有TCP、UDP(将在1.4节介绍)和因特网控制消息协议(Internet Control Message Protocol ,ICMP)。设计这些协议的目的主要是处理连接、数据传输率以及数据完整性的验证。
例如,前文中已提到过,如果采用IP协议,则绝对不知道发送的包是否到达了它的目的地。若要解决这一问题,就需要用传输层协议来处理包的传输。
例如,当将数据封装到TCP(Transmission Control Protocol)包中时,TCP会计算所有数据的校验和,接着操作系统将整个TCP包封装到IP首部中,并发送出去。
当包的接收方收到发送方所发送的数据时,它会发送一个基于TCP的确认包(ACK),告知发送方已收到包。但是,由于各种各样的原因,接收方也可能并没有收到这样的消息。例如,如果原始的TCP包就丢失了,则根本不会发送ACK包,或者也可能是ACK包本身丢失了。如果发送方并没有收到ACK包,则发送方会再次发送数据,并一直将数据保留到收到对方的确认消息为止。这里简单地列出了这一过程:
(1)发送包。
(2)等待ACK。
(3)如果在指定的时间内没有收到ACK,则返回到第(1)步。
(4)发送下一个包。
与由IP协议本身来检查数据的完整性并响应发送方,告知其发送有错误相比,这种数据验证方法的硬件费用要低得多。路由选择硬件实际上并不太在意确认信息,它只是假定通信是成功的,而让最终计算机来断定是否有错误。这么做的原因是数据传输失败的次数远远少于传输成功的次数,因此如果使传输路径上的每一个节点都检查传输成功以及沿传输路径的反方向发送错误消息,确实没有多少意义。
数据传输发生错误的概率很小,而且只是稍微减慢了一点传输速度,因为发送者一直在试图发送数据。但是,最终权衡利弊,这种解决方案比采用昂贵得令人难以置信的路由选择硬件来要理想得多。
用户数据报协议(User Datagram Protocol ,UDP)则放弃考虑数据完整性问题,它所考虑的主要是速度,换句话说,这种协议并不能保证将发送的包交付给接收方。正因如此,速度很快的游戏(例如,第一人称视角射手)常常首选UDP,而不是TCP。本书并不详细介绍UDP,因为对低速的MUD来说,它并不是一个重要的协议。虽然TCP速度要慢一些,但它是一种更健壮的协议,而且能保证可靠传输,所以还是坚持使用TCP。






