4.3.4 传输层协议
前已述及,TCP/IP传输层有3个协议:用户数据报协议(UDP)、传输控制协议(TCP)和流控制传输协议(SCTP)。在具体介绍这3个协议之前,首先说明协议端口的概念。
1.协议端口
(1)协议端口的概念
协议端口简称端口,它是TCP/IP参考模型传输层与应用层之间的逻辑接口,即传输层服务访问点(TSAP)。
(2)端口的作用
当某台主机同时运行几个采用TCP/IP协议的应用进程时,需将到达特定主机上的若干应用进程相互分开。为此,TCP/UDP等提出协议端口的概念,同时对端口进行编址,用于标识应用进程。就是让发送主机应用层的各种应用进程都能将其数据通过端口向下交付给传输层,以及让接收主机传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。TCP、UDP和SCTP规定,端口用一个16 bit端口号进行标识,每个端口拥有一个端口号。
2.用户数据报协议(UDP)
(1)UDP的特点
UDP具有以下特点:
·提供协议端口来保证进程通信(区分进行通信的不同的应用进程)。
·提供不可靠、无连接、高效率的数据传输。UDP本身没有拥塞控制和差错恢复机制等,其传输的可靠性由应用进程提供。
·UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给网络层,既不拆分,也不合并,而是保留这些报文的边界,因此应用程序需要选择合适的报文大小。
基于UDP的特点,它特别适于高效率、低延迟的网络环境。在不需要TCP全部服务的时候,可以用UDP代替TCP。
Internet中采用UDP的应用协议主要有简单传输协议(TFTP)、网络文件系统(NFS)和简单网络管理协议(SNMP)等。
(2)UDP报文格式
UDP报文格式如图4-22所示。
图4-22 UDP报文格式
UDP报文由UDP报头和UDP数据部分组成,其中UDP报头由4个16 bit字段组成,各部分的作用如下:
·信源端口字段——用于标识信源端应用进程的地址,即对信源端协议端口编址。
·信宿端口字段——用于标识信宿端应用进程的地址,即对信宿端协议端口编址。
·长度字段——以字节为单位表示整个UDP报文长度,包括报头和数据部分,最小值为8(报头长)。
·校验和字段——此为任选字段,其值置“0”时表示不进行校验和计算;全为“1”时表示校验和为“0”。UDP校验和字段对整个报文即包括报头和数据部分进行差错校验。
·数据字段——该字段包含由应用协议产生的真正的用户数据。由图4-22可见,UDP报文是封装在IP数据报中传输的。
3.传输控制协议(TCP)
(1)TCP的特点
TCP是Internet最重要的协议之一,它具有以下特点:
·提供协议端口来保证进程通信。
·提供面向连接的全双工数据传输。采用TCP时,数据通信经历连接建立、数据传送和连接释放3个阶段。
·提供高可靠的按序传送数据的服务。为实现高可靠传输,TCP提供了确认与超时重传(差错控制)、流量控制、拥塞控制等机制。
需要说明的是,OSI参考模型的数据链路层要负责可靠传输,即要进行检错、纠错及流量控制。但在Internet环境下,网络层的核心协议IP提供的是不可靠的数据报传输,数据链路层(指的是网络接口层,TCP/IP参考模型的网络接口层对应OSI参考模型的物理层和数据链路层)没有必要提供比IP更多的功能,而且数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。所以在TCP/IP协议中,可靠传输(纠错及端到端的流量控制)由传输层的TCP等负责。TCP在确认与超时重传机制(差错控制)中采用选择重发ARQ协议。
(2)TCP报文段的格式
TCP报文段的格式如图4-23所示。
图4-23 TCP报文段的格式
TCP报文段包括两个字段:首部字段和数据字段。
首部各字段的作用如下。
(a)源端口字段——占2 B,用于标识信源端应用进程的地址。
(b)目的端口字段——占2 B,用于标识目的端应用进程地址。
(c)序号字段——占4 B。TCP连接中传送的数据流的每一个字节都编有一个序号,序号字段的值指的是本报文段所发送数据的第一个字节的序号。
(d)确认号字段——占4 B,是期望收到对方的下一个报文段的数据部分第一个字节的序号。(在数据传送时,TCP利用序号字段和确认号字段对报文段进行确认,以便差错控制。)
(e)数据偏移——占4 bit,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多少个字节。即指示首部长度,以4 B为单位指示。
(f)保留字段——占6 bit,保留为今后使用,但目前应置为0。
(g)6个比特集——说明报文段性质的控制比特,具体为:
·紧急比特URG——当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
·确认比特ACK——只有当ACK=1时,确认号字段才有效;当ACK=0时,确认号无效。
·推送比特PSH——接收端TCP收到推送比特置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
·复位比特RST——当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
·同步比特SYN——同步比特SYN置为1,就表示这是一个连接请求或连接接受报文段。
·终止比特FIN——用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放传输连接。
(h)窗口字段——占2 B。窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
(i)检验和字段——占2 B。对整个TCP报文段(包括首部和数据部分)进行差错检验。
(j)紧急指针字段——占16 bit。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
(k)选项字段——长度可变。TCP只规定了一种选项,即最大报文段长度MSS,MSS告诉对方TCP:“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。
(3)TCP通信过程的3个阶段
前已述及,采用TCP时,数据通信经历连接建立、数据传送和连接释放3个阶段。
由于篇幅所限,TCP的连接建立、数据传送和连接释放具体过程在此不再介绍,读者可参阅相关书籍。值得一提的是,TCP传输连接的建立采用3次握手,原因是防止已失效的连接请求报文又传送到接收端而产生错误。
(4)TCP的流量控制
TCP中,数据的流量控制是由接收端进行的,即由接收端决定接收多少数据,发送端据此调整传输速率。
接收端实现控制流量的方法是采用“滑动窗口”,在TCP报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。
一般介绍滑动窗口原理时,发送窗口的尺寸W T代表在还没有收到对方确认的条件下,发送端最多可以发送的报文段个数。TCP采用滑动窗口进行流量控制时,窗口大小的单位是字节,道理与一般原理介绍的是一样的。为了便于理解,我们在分析时往往将以字节为单位的窗口值等效成报文段个数。
TCP采用大小可变的滑动窗口进行流量控制。在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小),这样使传输高效且灵活。
滑动窗口的原理如图4-24所示。
图4-24 滑动窗口的原理示意图
图4-24中假设每次传输的TCP报文段中的数据字段为100 B,且初始发送窗口为500 B(指数据部分)。这可以理解为:在还没有收到对方确认的条件下,发送端最多可以发送的TCP报文段个数为5个。
发送端要发送900 B长的数据,划分为9个数据部分为100 B长的报文段。
当发送完5个报文段(500 B),对应图4-24(a)中的数据1~100、101~200、201~300、301~400、401~500,若没有收到对方的确认,则停止发送。
若收到了对方对前两个TCP报文段〔对应图4-24(b)中的数据1~100、101~200〕的确认,同时窗口大小不变。发送窗口可前移两个TCP报文段(200 B),即又可以发送两个报文段〔对应图4-24(b)中的数据501~600、601~700〕。
接着又收到了对方对两个TCP报文段〔对应图4-24(c)中的数据201~300、301~400〕的确认,但对方通知发送端必须把窗口减小到400 B。现在发送端最多可发送400 B的数据,即与图4-24(b)相比发送窗口只能前移1个TCP报文段(100 B),又可发送701~800数据的TCP报文段。
这里解释一个问题,TCP的滑动窗口机制是基于字节来实现的,滑动窗口在字节流上滑动,滑动窗口的大小也以字节为单位计算。但是数据字节流是要组装成TCP报文段传输的,所以为了说明方便,图4-24以TCP报文段为单位解释滑动窗口原理。
(5)TCP的拥塞控制
当大量数据进入网络时,就会致使路由器或链路过载,而引起严重延迟的现象即为拥塞。一旦发生拥塞,路由器将丢弃数据报,导致重传。而大量重传又进一步加剧拥塞,这种恶性循环将导致整个Internet无法工作,即“拥塞崩溃”。
TCP提供的有效的拥塞控制措施是采用滑动窗口技术,通过限制发送端向Internet输入报文段的速率,以达到控制拥塞的目的。
在具体介绍拥塞控制的方法之前,首先说明拥塞控制与流量控制的区别:
·流量控制——考虑接收端的接收能力,对发送端发送数据的速率进行控制,以便使接收端来得及接收,是在给定的发送端和接收端之间的点对点的通信量的控制。
·拥塞控制——既要考虑到接收端的接收能力,又要使网络不要发生拥塞,以控制发送端发送数据的速率,是与整个网络有关的。即拥塞控制是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
TCP是通过控制发送窗口的大小进行拥塞控制。设置发送窗口的大小时,既要考虑到接收端的接收能力,又要使网络不要发生拥塞,所以发送端的发送窗口应按以下方式确定:
发送窗口=Min[通知窗口,拥塞窗口]
通知窗口其实就是接收窗口,接收端根据其接收能力许诺的窗口值,是来自接收端的流量控制。接收端将通知窗口的值放在TCP报文段的首部中,传送给发送端。
拥塞窗口(Congestion Window,cwnd)是发送端根据网络拥塞情况得出的窗口值,是来自发送端的流量控制。拥塞窗口同接收窗口一样,也是动态变化的。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的报文段发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络中的报文段数。
4.流控制传输协议(SCTP)
流控制传输协议(Stream Control Transmission Protocol,SCTP)是IETF于2000年10月在RFC 2960中制定的一个新的传输层协议。SCTP吸取了TCP和UDP的优点,并对TCP的缺陷进行了完善,它是面向连接的基于分组的可靠传输协议,提供差错控制、流量控制和拥塞控制机制,可防止泛滥和伪装攻击;作为新的特性,SCTP还提供了对多宿主机和多重流的支持。
(1)SCTP的基本特性
SCTP的基本特性主要包括:
·多宿主;
·多重流;
·面向报文与面向连接相结合;
·安全机制;
·证实和避免拥塞等。
①多宿主
在说明SCTP的多宿主特性之前,首先介绍几个概念。
·传送地址——SCTP传送地址由IP地址加SCTP端口号决定。一个传送地址唯一标识一个端点,一个端点可以由多个传送地址进行定义。
·偶联(Association)——偶联是两个SCTP端点通过SCTP规定的4次握手机制建立起来的进行数据传送的逻辑联系或者通道。SCTP规定在任何时刻两个端点之间能且仅能建立一个偶联,偶联由两个端点的传送地址来定义。
·通路——通路是一个端点将SCTP数据报发送到对端端点特定目的传送地址的路由,一个偶联可以包括多条通路。
所谓多宿主(即多地址性)是一个偶联的两个SCTP端点都可以配置多个IP地址,这样一个偶联的两个端点之间具有多条通路。SCTP偶联的多地址性是SCTP与TCP最大的不同,TCP是单地址连接的。
一个偶联可以包括多条通路,但只有一条首选通路。如图4-25所示,设一个端点A包括两个传送地址(180.15.26.16:2908和180.15.26.17:2908),而另一个端点B也包括两个传送地址(180.15.26.18:2907和180.15.26.19:2907)。此两个端点决定了一个偶联,该偶联包括4条通路(Path0、Path1、Path2和Path3),首选通路为Path0。
图4-25 SCTP多宿主示意图
本端端点A发送的SCTP数据报通过首选通路发送到对端端点B。当首选通路出现故障时,SCTP可以自动切换到其他备用通路上(优先切换对端端点的传送地址,再次切换本端端点的传送地址),继续传输数据,而且这种切换对应用进程是透明的。
②多重流
SCTP偶联中的流用来指示需要按顺序递交到高层协议的用户消息的序列,在同一个流中的消息需要按照其顺序进行递交。
SCTP是面向流的可靠传输层协议,一个偶联中可以包含多个流(即多重流),而一个流只能属于一个偶联。各个流之间相对独立,每个流可以单独发送数据信号而不受其他流的影响,即支持流间消息的并行处理,从而避免队头拥塞。
SCTP偶联的多重流也是SCTP与TCP最大的不同,TCP每一个连接只能包含一个单独的流。SCTP的多重流特性,非常适合传输实时性比较强的音频或视频数据。
SCTP的每个流包含一系列用户所需的数据(DATA)块。SCTP采用两个字段来标识和流有关的量:流标识号(SI)用于唯一地标识出偶联中的某个流,而流序号(SSN)则用来标识特定的流中的每一个数据块。使用SI和SSN就可以对传输的数据进行编号,以便接收方准确地接收数据并上交应用进程。
③面向报文与面向连接相结合
SCTP既汲取了TCP面向连接的优点,又采用了类似UDP面向报文的特点。
在SCTP中,使用数据(DATA)块来携带应用进程的数据,而且一个DATA块所携带的数据不能超过一个应用进程报文,但一个应用进程报文可以由多个DATA块来携带(即分片)。这实质上借鉴了UDP保留报文边界以及IP分片的特性,可以在传输层就将比较大的应用进程报文进行分片,避免了在IP层(网络层)再次分片。
SCTP集成了TCP和UDP的优点,面向连接的方式保证了可靠性,而面向报文的方式提高了数据传输的简洁性,减轻了应用程序的负担。
④安全机制
在网络安全方面,SCTP增加了防止恶意攻击的措施。
SCTP是面向连接的协议,在传输数据前要有偶联的建立,数据传输结束后还需要关闭偶联。
在TCP中,连接的建立需要3次握手。而SCTP偶联的建立过程相对于TCP连接而言比较复杂,是个4次握手的过程,并引入了COOKIE的机制。COOKIE是一个含有端点初始信息和加密信息的数据块,通信的双方在偶联建立时需要处理并交换,从而增加协议的安全性,有效地防止了拒绝服务和伪装等潜在的攻击。
⑤证实和避免拥塞
SCTP采用证实和重传机制保证传输的可靠性,避免拥塞沿袭了TCP的窗口机制,进行合适的流量控制。
SCTP使用TSN机制实现数据的确认传输。一个偶联的一端为本端发送的每个数据块顺序分配一个32位的传输顺序号(TSN),以便对端收到数据块时进行确认,保证传输的可靠性。
需要说明的是:传输顺序号(TSN)与流序号(SSN)不同。SSN是SCTP为本端在某个流中发送的每个数据块顺序分配的一个16位的流序号,以便保证流内的顺序传递。TSN和SSN的分配是相互独立的。
⑥SCTP数据报的有效性
SCTP数据报的有效性是SCTP提供无差错传输的基石。SCTP数据报的公共报头包含一个验证标签(Verification Tag)和一个可选的32位校验码(Checksum)。
验证标签的值由偶联两端在偶联启动时选择。如果收到的SCTP数据报中没有期望的验证标签值,那么接收端将丢弃这个SCTP数据报,以阻止攻击和失效的SCTP数据报。
校验码由SCTP数据报的发送方设置,以提供附加的保护,用来避免由网络造成的数据差错。接收端将丢弃包含无效校验码的SCTP数据报。
(2)SCTP数据报格式
如果长度很短的用户数据被加上很大一个SCTP报头,那么其传递效率会很低。因此,SCTP将几个用户数据绑定在一个SCTP数据报里面传输,以提高带宽的利用率。
SCTP数据报由公共报头和一个/多个信息块组成,信息块既可以是用户数据,也可以是SCTP控制信息。SCTP数据报格式如图4-26所示。
图4-26 SCTP数据报格式
①公共报头的格式
SCTP公共报头中包括了源端口号、目的端口号、验证(确认)标签和校验码。
·源端口号(16 bit)——发送端点的SCTP端口号。接收方可以使用源端口号、源IP地址、目的端口号和目的IP地址标识该SCTP数据报所属的偶联。
·目的端口号(16 bit)——目的端点的SCTP端口号。接收主机可以使用目的端口号将SCTP数据报解复用到正确的端点或应用中。
·验证(确认)标签(32 bit)——验证(确认)标签是偶联建立时,本端端点为这个偶联生成的一个随机标识。偶联建立过程中,双方会交换这个标签,到了数据传输时,发送端必须在公共报头中带上这个标签,以备校验。
·校验码(32 bit)——SCTP通过对用户数据使用ADLER-32算法,计算出一个32位的校验码,放置在数据报的公共报头中,在接收端进行同样的运算,通过检查校验码是否相等来验证用户数据是否遭到破坏。
②数据块字段的格式
数据块包括了块类型、块标志位、块长度和块值。
·块类型(8 bit)——块类型定义在块值中消息所属的类型。
·块标志(8 bit)——块标志用法由块类型决定。除非被置为其他值,块标志在传送过程中会被置0,而且接收端点会忽视块标志。
·块长度(16 bit)——指示包括块类型、块标志、块长度和块值的长度,长度使用二进制表示。
·块值(可变长度)——块值的内容是在块中传送的实际信息(如用户数据、SCTP控制信息),内容由块类型决定。块值的长度为不定长。
(3)SCTP的主要应用
IETF制订SCTP的初衷是为了在IP网上传输7号信令,然而在开发过程中,其适应范围被延展到自成一个通用传输协议的程度。它提供了TCP的大多数特性,还增设了崭新的传输层服务。
SCTP的多宿主特性可以用在需要高度可靠性的场合,如军事通信、环境恶劣的场所。在这些网络环境中,把主机配置成多宿主机,当某个网络接口(首选通路)出现故障时,SCTP可以快速地切换到另外一个网络接口(备用通路)。
SCTP的多宿主特性在移动IP网络中也得到了相当好的应用。在移动IP网络中,主机的IP地址会经常性地改变。如果采用TCP连接传输数据信号,当移动主机的IP地址改变时,就必须创建新的TCP连接,这不但会带来时间的巨大浪费,而且会带来额外的开销,使得用户无法忍受。如果采用SCTP偶联传输数据信号,当移动主机的IP地址改变时,SCTP会快速、透明地切换到新的IP地址上,对用户没有任何影响。
一些研究和标准化组织认为SCTP将会成为下一代IP网络上面向连接的可靠传输协议。