TCP/IP运输层的两个主要协议都是互联网的正式标准,即:
两种协议在协议栈中的位置。
按照OSI的术语,两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元TPDU(Transport Protocol Data Unit)。但在TCP/IP体系中,则根据所使用的协议是TCP或UDP,分别称为TCP报文段(segment)或UDP用户数据报。
UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但由于UDP非常简单,在某些情况下UDP是一种最有效的工作方式。
TCP则提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或多播服务。由于TCP要提供可靠的,面向连接的运输服务,因此不可避免地增加了许多的开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。
常用的应用和应用层协议主要使用的运输层协议
应用 | 应用层协议 | 运输层协议 |
---|---|---|
名字转换 | DNS(域名系统) | UDP |
文件传送 | TFTP(简单文件传送协议) | UDP |
路由选择协议 | RIP(路由信息协议) | UDP |
IP地址配置 | DHCP(动态主机配置协议) | UDP |
网络管理 | SNMP(简单网络管理协议) | UDP |
远程文件服务器 | NFS(网络文件系统) | UDP |
IP电话 | 专用协议 | UDP |
流式多媒体通信 | 专用协议 | UDP |
多播 | IGMP(网际组管理协议) | UDP |
电子邮件 | SMTP(简单邮件传送协议) | TCP |
远程终端接入 | TELNET(远程终端协议) | TCP |
万维网 | HTTP(超文本传送协议) | TCP |
文件传送 | FTP(文件传送协议) | TCP |
服务器端使用的端口号:又可分为两类,最重要的一类叫作熟知端口号(wellknown port number)或全球通用端口号,数值为01023**。常用的熟知端口号如下,另一类叫作**登记端口号**,数值为**102449151。这类端口号是为没有熟知端口号的应用程序使用的。
客户端使用的端口号
无差错情况可用下图表示。A发送分组 M 1 M_1 M1,发完就暂停发送,等待B的确认。B收到了 M 1 M_1 M1就向A发送确认。A在收到了对 M 1 M_1 M1的确认后,就再发送下一个分组 M 2 M_2 M2。同样,在收到B对 M 2 M_2 M2的确认后,再发送 M 3 M_3 M3。
出现差错情况可用下图表示。B接收 M 1 M_1 M1时检测出了差错,就丢弃 M 1 M_1 M1,其他什么也不做(不通知A收到有差错的分组)。也可能是 M 1 M_1 M1在传输过程中丢失了,这时B当然什么都不知道。在这两种情况下,B都不会发送任何信息。可靠传输协议是这样设计的:A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这就叫作超时重传。要实现超时重传,就要在每发送完一个分组时设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。
出现差错应注意3个问题:
我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,就会造成数据的丢失。所谓流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
上图中设A向B发送数据。在连接建立时,B告诉A:“我的接收窗口rwnd=400”(rwnd,receiver window)。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。注意,TCP的窗口单位是字节,不是报文段。TCP连接建立时的窗口协商过程在图中没有显示。再设一个报文段为100字节长,而数据报文序号的初始值设为1(图中第一个箭头上面的序号seq=1)。图中箭头上面大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值。
注意,接收方的主机B进行了三次流量控制。第一次把窗口减小到rwnd=300,第二次又减小到rwnd=100,最后减到rwnd=0,即不允许发送方再发送数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。注意,B向A发送的三个报文段都设置了ACK=1,只有在ACK=1时确认好字段才有意义。
现在考虑另一种情况,B向A发送了零窗口的报文段后不久,B的接收缓存又有了一些存储空间。于是B向A发送了rwnd=400的报文段。然而这个报文段在传输过程中丢失了。A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据。如果没有其他措施,这种互相等待的死锁局面将一直延续下去。
为了解决此问题,TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口值仍然是零,那么收到这个报文段的一方就重新设置持续计时器。如果窗口不是零,那么死锁的僵局就可以打破。