《计算机网络原理与Internet技术》-第5章传输层与进程通信_第1页
《计算机网络原理与Internet技术》-第5章传输层与进程通信_第2页
《计算机网络原理与Internet技术》-第5章传输层与进程通信_第3页
《计算机网络原理与Internet技术》-第5章传输层与进程通信_第4页
《计算机网络原理与Internet技术》-第5章传输层与进程通信_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章传输层与进程通信5.1网络需求与传输层功能5.2传输控制协议TCP5.3用户数据报协议UDP返回5.1网络需求与传输层功能5.1.1传输层实现进程间的通信从通信的视角看,传输层的作用是区分和标识进程,实现进程间的通信。相信读者都有自己的QQ,可能不止一个吧。回想我们熟悉的一个场景吧,网吧里,一台机器上同时挂着两三个QQ,这个闪,那个叫,同时和多个号上的好友聊天。想想,好友回来的消息有没有搞混过,也就是说,QQ1上好友的返回消息在QQ2的好友窗口呈现了。遇到过吗?没有吧。那么同学们有没有思考过这个问题:两个QQ号在网上收发数据都是用的一个IP地址,对方回复回来的IP分组都是通过主机的网络层接收到的,它们都以该主机的IP地址作为目标地址,主机是如何区分这些IP分组,并将它们正确并有序地分发到多个不同的QQ上的呢?下一页返回5.1网络需求与传输层功能或者说,我们的机器上是如何保证同时运行的这两个QQ数据不会混淆的。这种情况IP地址是相同的,我们主机上的网络层是不能区分的,网络层只能区分到IP,即区分到主机。因此我们说,要想实现应用程序间一对一的通信,单有网络层是不够的,网络层只能区分到主机。就像邮差,他只负责把信件送到单位。从IP层来说,通信的两端是两个主机,IP数据报的头部明确地标识了这两个主机的IP地址,IP层只能识别到主机。所以,在这之前,我们一直强调,网络层实现了主机间的通信。但从刚才的例子可以看到,“两个主机之间的通信”这种说法还不够准确。这是因为,真正进行通信的实体是主机中的进程,是这个主机中的一个进程和另一个主机中的一个进程在交换数据(即通信)。因此更具体、更准确地讲,主机间的通信实质上是主机上的应用进程间的相互通信。上一页下一页返回5.1网络需求与传输层功能进程(process)是计算机操作系统中的一个基本概念。进程与程序既有联系,又有区别。它是应用程序的一次执行过程,是正在运行的应用程序。IP协议虽然能把分组送到目的主机,但主机的IP层只能验证分组中的IP地址,它并不知道送给主机上哪个进程。所以,至此从实现进程通信的需求上看还有欠缺。担当此任的正是传输层。网络层从收到的IP数据报中取出数据部分交给传输层,由传输层分发给相应的应用进程。那么传输层又是如何区分不同进程的呢?上一页下一页返回5.1网络需求与传输层功能传输层要对主机收到的数据进行分发,就要区分主机上的不同进程。传输层使用协议端口号(简称端口,port)来区分进程。原来,不同的进程在通过传输层进行网络通信时,使用不同的接口,传输层用端口号来标识这个层间接口。这样,不同的端口号就对应着不同的进程。或者说,不同的应用进程通信时使用不同的端口号。因此,从传输层的角度看,通信的真正端点并不是主机,而是主机中的进程,进程是网络通信的起始和终止端点。也就是说,端到端的通信是应用进程之间的通信。在一个主机中经常有多个应用进程同时分别和另一个主机中的多个应用进程通信,如图5-1所示。上一页下一页返回5.1网络需求与传输层功能5.1.2传输层实现可靠传输从为高层用户服务的视角看,传输层提供可靠传输,提升网络的传输质量。网络层虽然提供了从源到目标主机的通信服务,但是数据通信的可靠性却没有保障。其原因是多方面的。首先,在Internet上的网际层,IP协议提供的是无连接的、“尽力而为”的数据报服务,是不可靠的。它不保证端到端数据传输的可靠性,IP分组在传输过程中有众多的原因会导致数据丢失、乱序或重复,对此,IP协议没有应对措施,它实现的是简单通信。其次,虽然在OSI模型中设计了数据链路层的可靠传输,但在实际应用中,考虑到效率、成本等因素,大多链路层只实现了简单通信,没有实现可靠传输。上一页下一页返回5.1网络需求与传输层功能这样物理层、数据链路层、网际层的错误就得不到纠正,如果传输层也没有纠正,错误会留到用户哪里,使得网络的可用性降低,尤其是对可靠性有要求的应用。最后,互联网上端到端的通信可能会跨越一系列的通信子网,不同的通信子网使用的技术不同,数据传输速率、时延、错误率等通信质量不同,这也导致整个端到端的通信质量没有保障。当然,大量的、突发性的数据发送也容易造成网络拥塞,导致数据丢失、时延增大。这些都是网络传输的不可靠、不确定因素,使通信子网的服务质量没有保障。鉴于高层的一些应用对可靠性的要求,传输层的TCP协议提供了可靠传输机制。可靠传输的技术原理如第3章所述,主要是在面向连接的传输中使用确认、重传、流量控制等传输机制,以保证数据的无错、无丢失、无重复、有序。上一页下一页返回5.1网络需求与传输层功能5.1.3传输层实现用户接口由上可见,传输层的作用很像现实中公司、单位里的秘书。对来往的信件、物资负责分发;对物流托运中变质、丢失的物资负责检验、追讨。在完成这两项任务的同时,秘书的存在还使得高层主管更加省心、放心。同样,在计算机网络中,如果高层用户直接使用网络层传输数据会涉及通信子网细节,不易操作。处在高层用户和网络层之间的传输层,可以屏蔽通信子网的细节,作为用户和网络的接口,用户通过传输层使用网络比直接使用网络层会容易得多、方便得多。上一页下一页返回5.1网络需求与传输层功能正是有了传输层,应用程序员才可以按照一组标准的原语来编写代码,并且程序可以运行在各种各样的底层网络上;他们根本无须处理不同的网络接口,也不用担心传输的可靠性。如果所有实际的网络都完美无缺,具有相同的服务原语,并保证不会发生变化,那么传输层或许就不再需要。然而,现实世界中并不是,传输层承担了把上层与技术、设计和各种缺陷隔离的关键作用。综上可见,传输层在高层用户和通信子网之间承上启下,有多方面的功能。上一页下一页返回5.1网络需求与传输层功能从通信的角度看,传输层使用端口机制区分进程,向上提供进程间端到端的通信,它属于面向通信部分的最高层。从用户的角度看,传输层面向高层用户服务,为高层用户提供接口和通信质量的升值服务,是用户功能中的最低层,是资源子网中的最低层,如图5-2所示。正像秘书工作在单位里。传输层存在于主机里,通信子网中是不存在的,比如路由器上只有网络层以下的层次。因此,传输层是直接在发送端和接收端起作用,从协议栈上看它跨越中间转发结点(如路由器)提供端到端的通信,如图5-1所示。也就是说,网络体系结构中的底3层构成了通信子网,高层协议只存在于主机中,如图5-2所示。上一页下一页返回5.1网络需求与传输层功能5.1.4TCP/IP的传输层1.TCP/IP传输层组成针对不同的网络应用对数据可靠性和实时性的要求,TCP/IP传输层设计了两个协议供不同应用选择。这两个协议分别是用户数据报协议UDP(UserDatagramProtocol)和传输控制协议TCP(TransmissionControlProtocol)。图5-3给出了这两种协议在协议栈中的位置。应用层中使用TCP协议的应用有FTP、HTTP、SMTP、Telnet、DNS等;使用UDP协议的应用有DNS、TFTP、SNMP等。在TCP/IP体系中,根据所使用的协议是TCP或UDP,分别称之为TCP数据段(seg⁃ment)或UDP用户数据报。上一页下一页返回5.1网络需求与传输层功能UDP在传送数据之前不需要先建立连接。远地主机的传输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作方式,支持因特网音频、视频等实时性应用。TCP则提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或多播服务。由于TCP要提供可靠的、面向连接的传输服务,因此不可避免地增加了许多的开销,如确认、流量控制、计时器以及连接管理等。这不仅使协议数据单元的头部增大很多,还要占用许多的处理机资源,因此,网络时延较大。支持可靠性要求高的应用,不适合实时性强的应用。UDP和TCP中都提供了端口机制区分进程。上一页下一页返回5.1网络需求与传输层功能2.端口前面曾讲过,传输层与网络层最大的区别是传输层提供进程通信能力。为了标识相互通信的网络进程,IP网络通信的最终地址不仅要包括主机的IP地址,还要包括可描述网络进程的某种标识。因此,无论是TCP还是UDP,都必须首先解决进程的标识问题。我们知道,在单个计算机中的进程是用进程标识符来标志的。但是在因特网环境下,用计算机操作系统所指派的这种进程标识符来标志运行在应用层的各种应用进程则是不行的。这是因为在因特网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法(而这种方法必须与特定操作系统无关)对TCP/IP体系的应用进程进行标志。上一页下一页返回5.1网络需求与传输层功能TCP/IP的传输层用端口来标识进程。一个端口用一个16位二进制编码来标志。16位的端口号可允许有65535个不同的端口号,这个数目对一个计算机来说是足够的。端口号只具有本地意义。因此,因特网上不同计算机中的进程可能具有相同的端口。所以,要在因特网上唯一地标识定位一个进程就应该使用一个参数对,即(IP地址,端口)。在网络通信中,应用进程通过传输层使用网络收发数据,在因特网不同的计算机中,相同的端口号是没有关联的。TCP/IP传输层使用端口号对进程寻址,端口号的作用有点类似IP地址在网络层的作用或MAC地址在数据链路层的作用,只不过IP地址是主机的逻辑标识,MAC地址是主机的物理标识,而端口号是网络应用进程的一种逻辑标识。由于同一时刻一台主机上可以有大量的网络应用进程在运行,所以需要有多个不同的端口号来对进程进行标识。上一页下一页返回5.1网络需求与传输层功能原来,TCP/IP设计了一套有效的端口分配和管理办法,对于知名应用端口有特别的规定。因特网赋号管理局(IANA)将端口号分为熟知端口(Well-knownports)、登记端口和临时端口三类。其中的熟知端口和登记端口就是用在服务器端的,临时端口号主要在客户机中使用。(1)熟知端口号。数值为0~1023,这些数值可在网址www.iana.org查到。IANA把这些端口号指派给了TCP/IP最重要的一些应用程序,让所有的用户都知道。表5-1是一些常用的熟知端口号。这部分端口号就像生活中的119、110等服务电话号码,众所周知,用户需要时可以方便地请求服务。上一页下一页返回5.1网络需求与传输层功能当一种新的应用程序出现后,IANA必须为它指派一个熟知端口,否则因特网上的其他应用进程就无法和它进行通信。(2)登记端口号。数值为1024~49151。这类端口号是为没有熟知端口号的应用程序使用的。使用这类端口号必须在IANA按照规定的手续登记,以防止重复。(3)临时端口号。数值为49152~65535。由于这类端口号仅在客户进程运行时才动态选择,因此又叫作短暂端口号。这类端口号是留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。通信结束后,刚才已使用过的客户端口号就不复存在。这个端口号就可以供其他客户进程以后使用。上一页返回5.2传输控制协议TCP5.2.1TCP的传输模型TCP协议比较复杂,是面向连接的传输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接,在传送数据完毕后,必须释放已经建立的TCP连接。应用进程之间的通信好像在“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放连接。TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。所有的TCP连接都是全双工的,并且是点到点的通信。TCP允许通信双方的应用进程在任何时候都能发送数据;不支持多播或者广播传输模式;提供面向字节流的服务;TCP还有流量控制和拥塞控制的功能。下面详细说明TCP的有关概念和传输模型。下一页返回5.2传输控制协议TCP1.TCP连接的概念TCP提供的是面向连接的服务,先建立TCP连接再传输数据,建立连接是为了提高传输的可靠性。每一条TCP连接的两端用两个套接字(socket)来确定,即(IP地址,端口号)。并且每一条TCP只能有两个端点,也就是说,TCP连接只能是点对点的,进行一对一的数据传输。TCP把连接作为最基本的抽象。通信的双方建立了TCP连接,表现在双方主机里动态地相互记录对方的状态。TCP“连接”不像线路交换中的端到端的TDM或者FDM电路,也不是一个虚电路,TCP的连接状态是完全驻留在两个终端系统中的。中间的路由器不知道,也不保留TCP连接的状态。上一页下一页返回5.2传输控制协议TCP2.面向流的传输TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。一个TCP连接就是一个字节流,而不是消息流。端到端之间不保留消息的边界。也就是说,TCP把应用进程送来的长短不一的消息(报文)在缓冲区里排队,它把应用程序交来的数据看成仅仅是一连串的无结构的字节流。每当数据达到一个段的大小,TCP就把它加上TCP头部,包装成一个TCP数据段发送出去,如图5-5所示。上一页下一页返回5.2传输控制协议TCPTCP接收端也不能识别报文,它只是把收到的字节流上交给应用程序。接收方的应用程序有能力识别收到的字节流,把它还原成有意义的应用层数据。如果传输中不出错,接收方应用程序收到的字节流应该和发送方应用程序发出的字节流完全一样。从图5-5中可见,可能几个报文封装在一个TCP段里发送,也可能一个报文分成几个TCP段发送。TCP发送中并不考虑报文边界,而把相继到来的报文当成连续的字节流来统一处理。发送过程中,TCP把写入到发送缓冲区的数据段按字节连续编号,以便接收方按字节序号接收,从而实现顺序接收,也能发现丢失的数据段。上一页下一页返回5.2传输控制协议TCPTCP的这种发送方式和现实社会中的物流模式非常一致。在物流公司收纳点,接收并暂存各散户的货物,等到同一目的地的物品足够一车时便把各散户货物集中装成一车发出,若某一客户物品足够多,也可能要分装成多车发送。TCP用一个TCP头将用户数据封装,得到TCP数据段。发送时,TCP数据段被传送到下面的网际层,在那里它被封装到IP数据报中,以IP数据报的形式在网络层传输。TCP对于应用进程一次把多长的报文发送到TCP的缓存中是不关心的。TCP根据对方给出的窗口值和当前网络拥塞的程度来决定一个数据段应包含多少个字节(UDP是把整个报文包装成一个UDP数据段)。如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分短一些再传送。如果应用进程一次只发来很少的字节,TCP也可以等待积累有足够多的字节后再构成数据段发送出去。上一页下一页返回5.2传输控制协议TCP3.TCP传输模式TCP传输数据时,需要建立连接。连接是可靠传输的基础,在端到端的连接上实现数据流的可靠传输。TCP按字节序号把数据封装成TCP段,使用TCP连接发送到接收端。我们知道,TCP发送的数据段是交给IP层传送的。但IP层只能提供尽最大努力的服务,也就是说,TCP下面的网络所提供的是不可靠的传输。因此,TCP必须采用适当的措施才能使得两个传输层之间的通信变得可靠。可靠传输是指传输的数据无差错、无丢失、无重复,接收的数据有次序。IP层的服务是不可靠的,TCP是如何在不可靠的IP服务基础上构建可靠通信的?这主要得益于以下机制:差错校验机制、应答机制、重传机制、序号机制。上一页下一页返回5.2传输控制协议TCPTCP按字节序号进行数据收发。TCP把应用程序送发的数据在缓冲区里排队,并按字节编号。初始序号可以是任意值,由双方在建立连接时商定,发送时从初始序号字节处开始发送;在TCP连接两端配置发送缓冲区和接收缓冲区,发送缓冲区是存放已发送但还没有确认的数据段,接收缓冲区存放已接收但还没处理的数据段;接收方处理收到的TCP段时,进行差错校验,丢弃出错的TCP段,对正确接收的TCP段进行应答,为提高效率,允许捎带应答和累积应答,应答序号是已收到的字节序号加1;对出错和丢失的TCP段采用重发机制更正。TCP中没有否定应答,对出错被丢弃的数据段不作应答。这样发送计时器就会超时,引起重发。对重复的数据TCP接收方会丢弃,但要作出确认。为什么对丢弃的重复段还要确认?正是因为发送端没收到数据段的第一次确认才重发,所以还需要给出确认。上一页下一页返回5.2传输控制协议TCP图5-6展示了一数据流的发送模式,TCP对数据流按字节编号(起始编号由建立连接时约定,不一定从0开始)。每个数据段的大小为100字节,起始序号为201。从图5-6可以看出,为了提高发送效率,TCP采用了连续ARQ的发送方式。请读者注意TCP确认号的特点。图5-6(a)中,B收到了A发送过来的一个数据段,其序号字段值是201,而数据长度是100字节,检验无误后B要发回确认。确认序号是301,这表示B期望从第301字节处开始接收,正是下一个数据段的起始序号。意味着B正确收到了A发送的到序号300为止的数据。因此,B在发送给A的确认数据段中把确认号置为301。请注意,此时的确认号不是201,也不是300。上一页下一页返回5.2传输控制协议TCPTCP中无否定应答。TCP使用差错检测技术对收到的数据段进行检验。图5-6(b)中,发现起始序号为501的数据段出错后直接丢弃,并不确认,等待发送方超时重发。TCP是双工通信,接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上,以减少网络数据包的发送,这称作捎带确认。捎带确认实际上并不经常发生,因为大多数应用程序不同时在两个方向上发送数据。由于IP层提供的是数据报服务,TCP段可能会无序到达。对于不按序到达的数据应如何处理,TCP标准并无明确规定。如果接收方把不按序到达的数据一律丢弃,那么接收窗口的管理将会比较简单,但这样做对网络资源的利用不利(因为发送方会重复传送较多的数据)。因此TCP通常对不按序到达的数据是先临时存放在接收缓冲区中,等到字节流中所缺少的字节收到后,再按序交付给上层的应用进程。上一页下一页返回5.2传输控制协议TCP5.2.2TCP数据段结构TCP数据段是TCP传送数据的单元,TCP以数据段的形式传输字节流。TCP段由一个头部(最少20字节)以及随后的数据构成。没有任何数据的TCP段也是合法的,通常被用作确认和控制消息。TCP软件决定了段的大小,有两个因素限制了段的大小。首先,包括TCP头在内的每个段,必须适合IP数据报的65515个字节的有效载荷;其次,每个链路层网络都有一个最大传输单元MTU,每个段必须适合MTU才能以单个不分段的数据包发送和接收。实际上,MTU通常是1500字节(以太网的),它规定了段长度的上界。上一页下一页返回5.2传输控制协议TCPTCP数据段的结构是与TCP的数据传输模式相适配,数据段结构的设计支持TCP的传输机制。TCP头的各字段结构是与TCP传输中实现的功能相适应的。只有弄清TCP头部各字段的作用才能掌握TCP的工作原理。TCP数据段的头部格式如图5-7所示。TCP数据段头部的前20个字节是固定的,选项是根据需要可选的,选项的长度应是4字节的整数倍(不足时可以填充)。因此TCP头部的最小长度是20字节。现在让我们逐个字段地剖析TCP头结构。源端口和目的端口各占2个字节,分别写入源端口号和目的端口号。上一页下一页返回5.2传输控制协议TCP序号字段占4字节。序号范围是[0,232-1],循环使用。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。确认号字段占4字节,是期望收到对方下一个数据段的第一个数据字节的序号,也就是已经接收到的最后一个字节序号加1。由于序号段有32位长,可对4GB(即4千兆字节)的数据进行编号。在一般情况下可保证当序号重复使用时不会引起混淆,因为旧序号的数据早已通过网络到达终点了。上一页下一页返回5.2传输控制协议TCPTCP头长度字段占4位。它指明了数据段头的长度,以4字节为单位。TCP数据段的头部长度是不确定的,因为头部中还有长度不确定的选项字段,因此该字段是必要的。由于4位二进制数能够表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP头部的最大长度(即选项长度不能超过40字节)。保留部分占6位,保留为今后使用,但目前应置为0。之后有6个比特是标志位,它指明了本数据段的性质。上一页下一页返回5.2传输控制协议TCP(1)紧急URG(URGent)位。当URG=1时,表明紧急指针字段有效。它告诉系统此数据段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。因此用户从键盘发出中断命令(Control+C)。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾,只有在所有的数据被处理完毕后这两个字符才被交付到接收方的应用进程。这样做就浪费了许多时间。(2)ACK(ACKnowlegment)标志位设置为1时,表示确认号字段有效。当ACK=0时,确认字段不包含确认信息,所以可以被忽略。TCP规定,在连接建立后所有传送的数据段都必须把ACK置1。上一页下一页返回5.2传输控制协议TCP(3)PSH(PuSH)标志位置为1时,表示这个段是被推送(PuSH)的数据,接收方一旦收到数据后立即将数据递交给应用程序,而不是将它缓冲起来直到整个缓冲区满才处理上交数据。虽然应用程序可以选择推送操作,但推送操作还很少使用。(4)复位RST(ReSeT)标志位。当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。RST置1还用来拒绝一个非法的数据段或拒绝打开一个连接。RST也可称为重建位或重置位。(5)SYN(SYNchronization)在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求数据段。对方若同意建立连接,则应在响应的数据段中使SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。上一页下一页返回5.2传输控制协议TCP(6)终止FIN(FINis)标志位用来释放一个连接。当FIN=1时,表明此数据段的发送方的数据已发送完毕,并要求释放传输连接。检验和字段占2字节。检验和字段检验的范围包括头部和数据这两部分。在计算检验和时,要在TCP数据段的前面加上12字节的伪头部,如图5-8所示。伪头部的格式与UDP用户数据报的伪头部一样。接收方收到此数据段后,仍要加上这个伪头部来计算检验和。若使用IPv6,则相应的伪头部也要改变。TCP最初只规定了一种选项,即最大数据段长度MSS(MaximumSegmentSize)。MSS是每一个TCP数据段中的数据字段的最大长度。数据字段加上TCP头部才等于整个的TCP数据段。所以MSS并不是整个TCP数据段的最大长度,而是“TCP数据段长度减去TCP头部长度”。上一页下一页返回5.2传输控制协议TCP5.2.3TCP的流量控制1.流量控制概念与实现原则数据丢失是影响可靠传输的重要方面,传输中的数据丢失有两种:一种是在传输链路上的丢失,另一种是由于接收方来不及接收而导致的数据丢失。后一种情况往往会造成数据的大量丢失,为此,TCP中设计了流量控制机制来避免这种情况出现。一般说来,我们总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。数据丢失是影响传输可靠性的重大因素。其主成因分析如下。上一页下一页返回5.2传输控制协议TCPTCP连接的接收方机器上设置有接收缓冲区。当TCP接收到正确的、有序到达的字节时,它就将数据放入到接收缓冲区里。相关应用程序进程可以从该缓冲区中读出数据,但不一定是在数据到达的那个时刻。事实上,接收方应用程序可能忙于其他事务,在数据到达很久以后才会去读。如果应用程序读数据的速度相对较慢,而发送方发送数据过快的话,则很容易造成连接的接收缓冲区溢出而导致数据丢失的情况。为此,TCP提供了一个流量控制服务,避免因来限制发送方造成接收方缓冲区溢出的可能性。流量控制就是控制发送方的发送速度不至过快,避免因超过接收能力使接收方来不及接收而造成数据丢失。由此看来,流量控制就是一个速度匹配服务,使得发送方发送的速度与接收方读出的速度相匹配。上一页下一页返回5.2传输控制协议TCP在发送方机器上也配置有一个缓冲区,用以存放应用程序送来要发送的数据;同时,TCP已发送出但尚未收到确认的数据有可能需要重发,也要暂时保留在缓冲区中。在发送端,由于应用进程写入数据而使发送缓冲区变满,因收到对方应答释放缓存的已发数据段而变得空闲。发送方来说,只要应用程序提供足够多的数据,发送方就可以连续大流量地把数据发送到对方。但接收方的缓冲区有限,它不能允许发送方放开量地倾泻。采用的办法是把接收方缓冲区的空闲大小反馈给发送方,以控制其后续发送量。上一页下一页返回5.2传输控制协议TCP发送窗口是发送方可以发送的数据序号范围,它包括已经发送还未被确认的以及可以发送的数据。发送窗口是发送方缓冲区中的数据流中的一部分。在发送方,它要跟踪两个变量:一个是最后发送的字节序号,记为s;一个是最后被确认的字节序号,记为c。两个序号的差,即s-c就是已经发送出去还未确认的数据量。发送方只要在整个连接的存活期中保持s-c≤w,就可以保证接收方缓冲区不会溢出,如图5-9所示。可见,接收缓冲区与接收窗口不是一个概念,发送缓冲区与发送窗口也不是一个概念;接收窗口制约着发送窗口的大小。它们之间有关系也有区别,请注意分析过程、区分概念、理清联系。上一页下一页返回5.2传输控制协议TCP2.滑动窗口机制为了提高效率,TCP使用了连续ARQ传输数据。连续发送提高了效率,但发送者又会担心连续过量的发送导致接收方缓冲区溢出,所以,最好能让发送方掌握一个发送上限,只要不超此限,就可以放心发送而不必担心。TCP的滑动窗口机制正是基于此而实现的。根据以上TCP的分析,我们看到发送方要保持发送窗口时刻小于接收窗口,就能保证接收主机的缓冲区不会溢出。但是,接收窗口是时刻变化的,随着接收方接收数据段而变小,随着应用程序读出数据而变大,同时,系统分给进程的缓冲总数也可能动态增多或变少。接收窗口会发生变化,发送窗口也就要随着变化,因此,TCP发送是一个动态过程。那么发送方是如何跟上接收窗口的变化实现流量的动态控制的呢?上一页下一页返回5.2传输控制协议TCPTCP滑动窗口是一复杂的机制,以上我们在理想情况下分析了其主要原理,以便让读者快速构建一个控制模型。具体实现中还有许多特殊情况需要解决。比如,在发送较快的情况下,可能让接收缓冲区充满,接收方会发出接收窗口为0的通报,发送方将停止发送。因此,接收方以后也不会再有应答,从而失去了向发送方通告窗口的机会,即使其缓冲区已经被应用进程提取空了。最终使系统陷入死锁不能推进。对此类问题,还需读者深入思考或查阅相关资料。除了流量控制因素,考虑到TCP大量的数据突发会导致网络拥塞,正如刚才所言,TCP的发送能力还受网络拥塞状况的制约。为此,我们进入下一节拥塞控制的讨论。上一页下一页返回5.2传输控制协议TCP5.2.4TCP的拥塞控制流量控制只是考虑了接收能力而设置的控制机制,TCP的拥塞控制是考虑到网络和承受能力,考虑TCP最大量发送对网络的影响而设置的控制机制,它不同于流量控制。1.拥塞控制的一般原理在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫作拥塞(congestion)。可以把出现网络拥塞的条件写成如下的关系式:Σ对资源的需求>可用资源上一页下一页返回5.2传输控制协议TCP若网络中有许多资源同时呈现供应不足,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降,严重的情况下导致网络的吞吐量下降到零,即进入死锁状态。拥塞控制的目的就是控制着网络不进入拥塞状态,或检测拥塞、解除拥塞,使网络保持在一个正常的可控状态。网络拥塞的害处及拥塞控制的作用如图5-11所示。有人可能会说:“只要任意增加一些资源,例如,把结点缓存的存储空间扩大,或把链路更换为更高速率的链路,或把结点处理机的运算速度提高,就可以解决网络拥塞的问题。”其实不然。网络拥塞是一个非常复杂的问题,简单地采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏。上一页下一页返回5.2传输控制协议TCP网络拥塞往往是由多种因素引起的,拥塞的控制也应该是多方面的,网络层有拥塞控制的功能,TCP的拥塞控制是整个拥塞控制系统的一部分。TCP使用拥塞控制机制,避免突发数据的大量发送导致网络拥塞。为了集中精力讨论拥塞控制,我们假定:(1)数据是单方向传送,而另一个方向只传送确认;(2)接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。上一页下一页返回5.2传输控制协议TCP2.慢开始和拥塞避免为了不让发送端突发大量的数据导致网络拥塞,发送方维持一个叫作拥塞窗口cwnd(congestionwindow)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方要控制自己的发送窗口不能大于拥塞窗口。以后我们就知道,如果再考虑到接收方的接收能力,发送窗口还可能小于拥塞窗口。发送方控制拥塞窗口的原则是:只要上一轮次网络没有出现拥塞,下一轮次拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络中的分组数。上一页下一页返回5.2传输控制协议TCP现在困难的是,传输层的控制实体是在主机上,而网络拥塞发生在主机之外的网络中。发送方的控制实体又是如何知道网络发生了拥塞呢?TCP将数据超时作为拥塞的标志。我们知道,当网络发生拥塞时,路由器就要丢弃分组。因此只要发送方没有按时收到应当到达的确认报文,就可以猜想网络可能出现了拥塞,因此将数据超时视作网络拥塞。当然,导致超时的还有很多其他方面的因素,但确实没有更好的办法来区分,好在现在通信线路的传输质量一般都很好,因传输出差错而丢弃分组的概率是很小的(远小于1%)。上一页下一页返回5.2传输控制协议TCP在一开始发送方先设置cwnd=1,TCP向网络发送第一个数据段并等待确认。如果该数据段在超时之前被确认,则发送方将拥塞窗口增加1个MSS。于是发送方在第一个轮次中发送两个数据段,接收方对这两个数据段正常确认,发送方每收到一个对新数据段的确认(重传的不算在内)就使发送方的拥塞窗口加1,因此发送方在收到两个确认后,cwnd就从2增大到4,并可在下一轮次中发送4个数据段。因此使用慢开始算法后,每经过一个传输轮次(transmissionround),拥塞窗口cwnd就加倍,如图5-12所示。可见,TCP数据发送的开始阶段是很慢,但这个阶段的速率增长是很快的,以指数规律递增,是慢开始,快增长。上一页下一页返回5.2传输控制协议TCP在有大量数据发送的情况下,这种快速增长势必会导致网络拥塞,所以增长到一定程度,就要小心了。为此,TCP设置了一个警界值,即慢开始门限ssthresh状态变量。慢开始门限ssthresh的用法如下:当cwnd<ssthresh时,使用上述的慢开始算法;当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法;当cwnd=ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法。上一页下一页返回5.2传输控制协议TCP拥塞避免算法的思路是让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。拥塞避免阶段是基于临近拥塞的一个估计而小心试探的过程,这个阶段的数据发送量大,同时又缓慢增长,它是TCP试图以最高限度发送数据的体现。这种做法的结果很可能导致拥塞而进入拥塞阶段。拥塞阶段的处理算法。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(有数据段超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。上一页下一页返回5.2传输控制协议TCP图5-13说明了上述拥塞控制的过程。现在发送窗口的大小和拥塞窗口一样大。(1)当TCP连接进行初始化时,把拥塞窗口cwnd置为1。前面已说过,为了便于理解,图中的窗口单位不使用字节而使用数据段的个数。慢开始门限的初始值设置为16个数据段,即ssthresh=16。(2)在执行慢开始算法时,拥塞窗口cwnd的初始值为1。以后发送方每收到一个对新数据段的确认ACK,就把拥塞窗口值加1,然后开始下一轮的传输。因此拥塞窗口cwnd随着传输轮次按指数规律增长。当拥塞窗口cwnd增长到慢开始门限值ssthresh时(即当cwnd=16时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。上一页下一页返回5.2传输控制协议TCP(3)假定拥塞窗口的数值增长到24时,网络出现超时(这很可能就是网络发生拥塞了)。更新后的ssthresh值变为12(即变为出现超时时的拥塞窗口数值24的一半),拥塞窗口再重新设置为1,并执行慢开始算法。当cwnd=ssthresh=12时改为执行拥塞避免算法,拥塞窗口按线性规律增长,每经过一个往返时间增加一个MSS的大小。上一页下一页返回5.2传输控制协议TCP在TCP拥塞控制的文献中经常可看见“乘法减小”(MultiplicativeDecrease)和“加法增大”(AdditiveIncrease)这样的提法。“乘法减小”是指不论在慢开始阶段还是拥塞避免阶段,只要出现超时(即很可能出现了网络拥塞),就把慢开始门限值ssthresh减半,即设置为当前的拥塞窗口的一半(与此同时,执行慢开始算法)。当网络频繁出现拥塞时,ssthresh值就下降得很快,以大大减少注入网络中的分组数。而“加法增大”是指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。上面两种算法合起来常称为AIMD算法(加法增大乘法减小)。对这种算法进行适当修改后,又出现了其他一些改进的算法。但使用最广泛的还是AIMD算法。上一页下一页返回5.2传输控制协议TCP3.快重传与快恢复机制TCP在对网络拥塞的判断上并无良策,视丢包、数据段超时为拥塞是不严谨的。这将导致在一些不应该的时刻启动拥塞算法。快恢复就是在快重传情况下发生的,快恢复算法是对拥塞控制算法缺陷的修补或改进。我们首先看快重传的应用情景。快重传算法首先要求接收方每收到一个失序的数据段后就立即发出重复确认(为的是使发送方及早知道有数据段没有到达对方)而不要等待自己发送数据时才进行捎带确认。上一页下一页返回5.2传输控制协议TCP在图5-14所示场景中,发送方连续发送了5个以上的数据段。接收方收到了第一个数据段M1后发出了确认(ACK2)。第二个数据段M2在传输中丢失,但后续数据段M3等都正确到达了。显然,接收方不能确认M3。因为M3是收到的失序数据段,如果对M3进行确认,就意味着M3之前的数据段都已经正确接收,这里显然不是。根据可靠传输原理,接收方可以什么都不做。为了实施快重传算法,TCP规定,接收方应及时发送对M1的重复确认。同样,对后续到达的M4、M5,接收方收到后,也还要再次发出对M1的重复确认。这就会让发送方收到了接收方的四个对M1的确认,其中后三个都是重复确认。重复确认M1,即ACK2,意味着接收方一再向发送方索要M2,说明接收方没有收到M2。重复索要,说明M2的后续数据段到达了接收方,证明网络是通畅的;在网络通畅的情况下M2没有到达,意味着M2丢失,聪明的发送方应该能意识到这点。上一页下一页返回5.2传输控制协议TCP按照一般的TCP重传规定,M2丢失需要依据超时来判断,计时器超时后才重发。但这时还不到M2超时时间。如果继续等待其超时再重发,很显然,接收方会因为M2缺席不能处理后续到达的数据段而“卡”在这里。此时,发送方聪明的做法应该是:在连续收到三个重复确认后立即重传数据段M2,而不必等待M2的重传计时器到期。这种算法,我们称作快重传。据统计,快重传可以使整个网络的吞吐量提高约20%。与快重传配合使用的快恢复算法有以下两个要点:(1)当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限ss⁃thresh减半,启动拥塞算法;上一页下一页返回5.2传输控制协议TCP(2)与慢开始不同的是此时并不将拥塞窗口cwnd设置为1,即不执行慢开始算法,而是把cwnd值设置为新的慢开始门限ssthresh值,然后开始执行拥塞避免算法,即让拥塞窗口从线性增长开始。很显然,快恢复的使用是必要的,是对拥塞控制算法的补充与改进。这样,快重传就把拥塞超时与偶然丢失超时两种情况区分开了。对于偶然丢失,使用快重传、快恢复。对于拥塞超时事件,后续分组也都会被丢弃,因接收方一直不能收到而超时重发。当然,此时的重发从慢开始执行是很有必要的。因为网络上已经积累了大量的分组,大量的重发会加剧网络拥塞,形成恶性循环。上一页下一页返回5.2传输控制协议TCP5.2.5超时时间的确定从上述章节讨论可见,网络数据段的超时计时器有重要作用,可以用它判断丢失触发重传,判断拥塞触发拥塞算法的执行,进而影响到整个系统的效率与稳定,非同小可。然而,在现实实现中,超时时间的合理设定却是一个模糊难题,是TCP最复杂的问题之一。之所以难以确定,这是因为,作为用户“秘书”的TCP是不出单位的,存在于主机上,并不了解网络的远近、拥塞情况,只能根据数据传输的往返时延RTT来推测。而每次发送数据的目的主机的物理距离不同、网络带宽不同、时间段不同、网络繁忙状态不同,这都导致每次发送数据时的往返时延不同。所以即使用RTT作参照也很难估算出超时时间的合理定值。当然,使用RTT作参照是最可行的办法。上一页下一页返回5.2传输控制协议TCP如果把超时重传时间设置得太短,就会引起很多数据段的不必要的重传,使网络负荷增大。但若把超时重传时间设置得过长,则又使网络的空闲时间增大,降低了传输效率。传输层的超时计时器的超时重传时间究竟应如何确定,设置为多大呢?TCP设计者采用了一种自适应算法,它根据网络性能的连续测量情况,不断地调整超时间隔。通常采用的是Jacobson算法。对于每一个连接,TCP维护一个变量SRTT(SmoothedRound⁃TripTime,平滑的往返时间),即加权平均RTT。它代表到达接收方往返时间的当前最佳估计值。当一个段被发送出去时,TCP启动一个计时器,该计时器有两个作用:一是看该段被确认需要多长时间;二是若确认时间太长,则触发重传动作。如果在计时器超时前确认返回,则TCP测量这次确认所花的时间,即本次传输的RTT,记为R,我们用R作最新RTT样本,根据下面原则确定新SRTT。上一页下一页返回5.2传输控制协议TCP在采集往返时间的样值R过程中有可能引发的一个问题是,当一个段超时并重新发送,以后该怎么办?确认到达时,无法判断该确认是针对第一次传输,还是针对后来的重传,如图5-15所示。若猜测错误,则会严重影响重传超时值。PhilKarn发现这个问题很艰难。Karn是一名业余无线电爱好者,他对在一种极不可靠的无线介质上传输TCP/IP数据包有浓厚的兴趣。他提出了一个很简单的建议:不更新任何重传段的估算值SRTT。此外,每次连续重传的超时时间值加倍,直到段能收到一次确认为止。这个修正算法称为Karn算法(Karn和Partridge,1987)。大多数TCP实现都采用了此算法。上一页下一页返回5.2传输控制协议TCP5.2.6TCP的连接管理TCP的连接管理是指TCP连接的建立、拆除和维护。传输连接的管理就是使传输连接的建立和释放都能正常地进行。TCP是面向连接的协议。TCP数据传输过程有三个阶段,即建立连接、数据传送和释放连接。下面我们分别分析建立连接、释放连接的作用和做法。1.建立连接我们首先要搞清,为什么要建立一个TCP连接?上一页下一页返回5.2传输控制协议TCP简单地说,就是为了通信的可靠。根据5.2.1节的阐述,TCP连接是一个虚连接,其实质是通信双方维持一个状态记录,跟踪和记录数据传输,以防出错;或者说,即使出错也能核查出来加以纠正。建立连接的实质一方面就是确认对方的存在,并让接收方做好接收数据的准备,即申请缓冲区、数据结构等资源;另一方面就是对通信状态进行初始化,这是通过建立连接的参数协商实现的,如确定数据流的起始序号、商定数据段的大小、确定最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等。上一页下一页返回5.2传输控制协议TCP用TCP连接传输数据时,首先要建立连接,建立连接须由一方主动发起,另一方响应才能完成。主动发起连接建立的应用进程叫作客户(client),而被动等待连接建立的应用进程叫作服务器(server)。在因特网上,要和另一主机进程建立TCP连接,必须知道对方主机的IP地址和进程的端口号。因特网上最常用的方式是客户机访问服务器,由客户机发起连接,服务器端服务进程一直监听在服务端口。服务器的IP可以通过域名键入,服务器的端口号使用默认熟知端口号,所以客户端能够联系上服务器。TCP使用三次握手协议来建立连接。图5-16给出了TCP的建立连接的三个过程。上一页下一页返回5.2传输控制协议TCP主机A首先发起TCP连接请求(第一次握手),并将所发送的数据段头部字段中的SYN标志置为1、ACK标志置为0,同时选择一个初始序号seq=x,表明发送方字节流的起始序号是x。主机B收到连接请求数据段后,如果同意建立连接,则发回一个连接请求确认。在确认数据段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。完成了连接建立的第二次握手。TCP客户进程收到B的确认后,还要向B给出确认。确认数据段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP的标准规定,ACK数据段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据段的序号仍是seq=x+1。至此TCP连接已经建立。上一页下一页返回5.2传输控制协议TCP2.释放连接数据都传输完了,释放连接对可靠传输还有影响吗?还有什么意义?答案是肯定的,首先有序地释放连接防止了因连接中断而导致的数据传输丢失;其次,TCP通过释放连接让对方知道,发送方的数据发送全部完成,接收方不必再等待,不必再维持传输状态参数,不必再保留接收缓冲区等系统资源。可见,数据传输完成后,TCP要进行连接的拆除或释放。TCP连接是全双工的,可以看作两个不同方向的单工数据流传输。所以一个完整连接的拆除涉及两个单向连接的拆除。释放连接的过程分两部分,如图5-17所示。上一页下一页返回5.2传输控制协议TCPA的应用进程先向其TCP发出连接释放数据段,并停止再发送数据,主动关闭TCP连接。A把连接释放数据段首部的FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。等待B的确认。请注意,TCP规定,FIN数据段即使不携带数据,它也消耗掉一个序号。B收到连接释放数据段后即发出确认,确认号是ack=u+1,而这个数据段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭(halfclose)状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一些时间。上一页下一页返回5.2传输控制协议TCP若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放数据段必须使FIN=1。现假定B的序号为m(在半关闭状态B可能又发送了一些数据),B还必须重复上次已发送过的确认号ack=u+1,等待A的确认。A在收到B的连接释放数据段后,必须对此发出确认。在确认数据段中把ACK置1,确认号ack=m+1,而自己的序号是seq=u+1。请注意,现在TCP连接还没有释放掉。必须经过时间等待计时器(TIME-WAITtimer)设置的时间2MSL后,A才能释放连接。一旦当两个单向连接都被关闭,两个端结点上的TCP软件就要删除与这个连接有关记录,原先所建立的TCP连接才被完全释放。上一页下一页返回5.2传输控制协议TCP5.2.7TCP可靠传输的实现综上所述,TCP的工作过程是很复杂的,以上也仅讲了其主要实现过程,实现中的许多细节问题还需要讨论。至此,大家应该思考一个问题,那就是,TCP做的这么复杂,究竟是为什么?TCP中众多工作机制都是为什么目的而设置?答案只有一个,那就是可靠传输。TCP的目标只有一个,所有的机制都是为此而工作的。不是吗?这些机制包括以下几种。(1)TCP的连接机制:让通信双方协商参数,达成初始状态,让通信双方主机系统分配资源做好接收准备,跟踪记录通信状态的演变,保证各个机制协调有序地进行,最后有序地释放连接,确保数据在最后的传输阶段不丢失,避免因拆除连接而导致数据丢失。上一页下一页返回5.2传输控制协议TCP(2)差错检验机制:发现传输过程中出现的比特错误。(3)应答机制:应答的目的是把接收情况反馈给发送方,以便让发送方重发,通过重发改正传输错误。同时,应答机制也保证了丢失的数据包、超时的数据包得到重发。(4)重传机制:重传是更正传输错误的机制,也是为了找回丢失数据包和因超时而失效的数据包。(5)序号机制:序号机制保证了最终接收方的有序接收,在IP传输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论