5.1运输层协议概述
5.1.1进程之间的通信
*从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
*当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
应用进程之间的通信两个主机进行通信实际上就是两个主机中的应用进程互相通信。
从运输层的角度看通信的真正端点并不是主机而是主机中的进程。应用进程之间的通信又称为端到端的通信。
运输层的一个很重要的功能就是复用和分用。发送方不同的应用进程可以使用同一个运输层协议传送数据。
“运输层提供应用进程间的逻辑通信”。“逻辑通信”的意思是:运输层之间的通信好像是沿水平方向传送数据。
但事实上这两个运输层之间并没有一条水平方向的物理连接。
运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。
令当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。
*当运输层采用无连接的UDP协议时,这种逻辑通信信道是一条不可靠信道。
5.1.2运输层的两个主要协议
TCP/IP的运输层有两个不同的协议:
(1)用户数据报协议UDP(User Datagram Protoco1)
(2)传输控制协议TCP(Transmission Control Protoco1)
*按照OSI的术语,两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元TPDU(Transport ProtocolData Unit)。
*TCP/IP体系结构中,TCP传送的数据协议单位是TCP报文段(segment)。UDP传送的数据协议单位是UDP用户数据报。
*UDP在传送数据之前不需要先建立连接。对方的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP是一种最有效的工作方式。
*TCP则提供面向连接的服务。TCP不提供广播或多播服务。由于TCP要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销,如确认、流量控制、计时器以及连接的管理等,这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。
5.1.3运输层的端口
令运行在计算机中的进程是用进程标识符来标志的。
5.1.3运输层的端口
*运行在应用层的各种应用进程却不应当让计算机操作系统指派它的进程标识符。这是因为在因特网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。
*为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对TCP/IP体系的应用进程进行标志。
协议端口号令解决这个问题的方法就是在运输层使用协议端口号,或通常简称为端口(port)。
令当运输层收到IP层交上来的运输层报文,就能根据其首部中的目的端口号把数据交付给应用层的目的应用进程。
注意:软件端口与硬件端口在协议栈层间的抽象的协议端口是软件端口。
路由器或交换机上的端口是硬件端口。
硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。
*TCP/IP的运输层的端口用一个16位端口号进行标志。
端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程在和运输层交互时的层间接口。在因特网中不同计算机的相同端口号是没有关联的。
两个计算机中的进程要互相通信,不仅必须知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。
两类端口(1)服务器端使用的端口号熟知端口号或系统端口号,数值一般为0~1023。
*登记端口号,数值为1024~49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在IANA登记,以防止重复。
(2)客户端口号或短暂端口号:数值为49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。
5.2 用户数据报协议UDP
1 UDP概述
UDP(用户数据报协议)只在IP的数据报服务之上增加了很少一点的功能。增加的功能就是复用和分用的功能以及差错检测的功能。
2 UDP的主要特点:
(1)UDP是无连接的;
(2)UDP使用尽最大努力交付,即不保证可靠交付;
(3)UDP是面向报文的。即UDP一次交付一个完整的报文,因此,应用程序必须选择合适大小的报文。若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率。反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率;
(4)UDP没有拥塞控制,很适合多媒体通信的要求;
(5)UDP支持一对一、一对多、多对一和多对多的交互通信;
(6)UDP的首部开销小,只有8个字节。
UDP的首部格式,如图1
图 1
源端口和目的端口各占两个字节,这里的端口就是标志应用进程的协议端口,发送方的应用进程对应源端口,接收方的应用进程对应目的端口;
UDP用户数据报的长度,其最小值为8;
检验和检验整个用户数据报,检验时会加上一个伪首部参与检验,如图2
图2
5.3 传输控制协议TCP概述
1 TCP最主要的特点
(1)TCP是面向连接的运输层协议;
(2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的;
(3)TCP提供可靠交付的服务;
(4)TCP提供全双工通信;
(5)TCP面向字节流。
2 TCP的连接
TCP连接的端点叫做套接字或插口
套接字socket=(IP地址:端口号)
5.4可靠传输的工作原理
1. TCP下面的网络所提供的是不可靠的传输,因此TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠。
2. 理想的传输条件有以下两个特点:
(1) 传输信道不产生差错;
(2)不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
3. 在理想的传输条件下,不需要采取任何措施就能够实现可靠传输。
5.4.1 停止等待协议协议
1.在发送完一个分组后,必须暂时保留已发送的分组的副本。
2.分组和确认分组都必须进行编号。
3.令超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
一、可靠通信的实现
1.使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。
2. 这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)。
3.ARQ表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。
二、信道的利用率U
U=To/(Tn+RTT+Ta)
1.当往返时间RTT远大于分组发送时间T时,信道的利用率就会非常低。
2.如果考虑出现差错后的分组重传,信道的利用率还要降低。
三、流水线传输
1.发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。
2.由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。
5.4.2连续ARQ协议
一、累积确认
1.接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
2.累积确认有的优点是:容易实现,即使确认丢失也不必重传。缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。
二、Go-back-N(回退N)
1.如果发送方发送了前5个分组,而中间的第3个分组丢失了。这时接收方只能对前两个分组发出确认。
2.发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。 这就叫做Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组。
3.可见当通信线路质量不好时,连续ARQ协议会带来负面的影响。
5.5 TCP报文段的首部格式
1、源端口和目的端口
各占两字节,分别写入源端口号和目的端口号。
2、序号
占四字节,序号使用。在一个TCP连接中传送的字节流中的每一个字都按顺序编号。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号,也称为“报文段序号”。
3、确认号
占四个字节,期望收到对方下一个报文的第一个数据字节的序号。
4、数据偏移
占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
5、保留
占六位,保留为今后使用,但目前应置为0。
6、紧急URG
当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,而不需要按照原来排队顺序来传送。
7、确认ACK
仅当ACK=1时确认号字段才有效,ACK=0时确认号字段无效。TCP规定,当连接建立后所有传送的报文段必须把ACK置1。
8、推送PSH
当两个应用进程交互式通信时,又时咋一端的应用进程希望在键入一个命令后立即就能够收到对方的响应,在这种情况下TCP就可以使用推送(push)操作。
9、复位RST
当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后在重新建立运输连接。
10、同步SYN
在连接建立时用来同步序号。
11、终止FIN
用来释放一个连接。当FIN=1时表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
12、窗口
占两字节,窗口是指发送本报文段的一方的接收窗口。窗口值是指作为接收方让发送方设置其发送窗口的依据。
13、检验和
占两字节。检验和字段检验的范围包括首部和数据这两部分
14、紧急指针
占两字节。紧急指针在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。
15、选项
长度可变,最长可达四十字节。当没有使用“选项”时,TCP的部首长度是20字节。TCP最初只规定了一种选项,即最大报文段长度MSS,MSS是每一个TCP报文段中的数据字段的最大长度。
5.6TCP可靠传输的实现
以字节为单位的滑动窗口。
TCP连接的每一端都必须设有两个窗口---一个发送窗口一个接受窗口。
接受窗口决定了发送窗口的大小。
TCP的可靠传输机制用字节的序号进行控制。TCP所有的确认都是基于序号而不是基于报文段。
TCP两端的四个窗口经常处于动态变化中。
设A发送数据,B接收数据:A的发送窗口并不是总和B的接受窗口一样大。
TCP标准没有规定对不按序到达的数据应如何处理。通常是先临时存放接受窗口中,等到字节流中所缺少的字节收到后,在按序交付上层的应用进程。
TCP要求接收方必须有累计确认的功能,这样可以减少传输开销。
选择确认SACK:接收方收到了和前面的字节流不连续的两个字节块。如果这些字节的序号都在接受窗口之内,那么接收方就先收下这些数据,但要把这些数据准确的告诉发送方,是发送方不要再重复发送这些已收到的数据。
如果要使用选择确认,那么建立TCP连接时,就要在TCP首部加上“允许SACK”的选项,而双方必须事先商定好。
如果使用选择确认,那么原来首部中的“确认字段”的用法仍然不变。只是以后在TCP报文段的首部中都增加了SACK选项,以便报告收到的不连续的字节块的边界。
由于首部选项的长度最多只有40个字节,而指明一个边界就要用掉4字节,因此在选项中最多只能指明4个字节块的边界信息。
5.7 TCP的流量控制
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现流量控制。
持续计时器
TCP为每一个连接设有一个持续计时器;
只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器;
若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值;
若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器;
若窗口不是零,则死锁的僵局就可以打破了。
5.8TCP的拥塞控制
5.8.1 TCP拥塞控制的一般原理
拥塞控制的概念
(1)在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞。
(2)出现资源拥塞的条件:
若网络中有许多资源同时产生拥塞,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。
是否可以任意增加一些资源,例如,把节点缓存的存储空间扩大,或把链路更换为更高速的链路,或把结点处理机的运算速度提高,是从而解决网络拥塞的问题?
不能。因为网络拥塞是一个非常复杂的问题。简单的采用上述做法,在许多情况下,不但不能解决拥塞问题,而且还可能使网络的性能更坏。
拥塞控制和流量控制的关系
(1)拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制就是防止过多的数据注入局域网中,这样可以使网络中的路由器或链路不致过载。
(2)拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
(3)流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。
(4)流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接受。
4、拥塞控制的作用:
5、拥塞控制的一般原理
(1)拥塞控制是很难设计的,因为它是一个动态的(而不是静态的)问题。
(2)当前网络正朝着高速化的方向发展,这很容易出现缓存不够大而造成分组的丢失。但分组的丢失是网络发生拥塞的征兆而不是原因。
(3)在许多情况下,甚至正是拥塞控制本身成为引起网络性能恶化甚至发生死锁的原因。这电影特别引起重视。
(4)拥塞控制需要付出代价:
一般在检测到拥塞发生时,要将拥塞发生的信息传送到产生分组的源站。通知拥塞发生的分组同样会使网络更加拥塞。
另一种方法是在路由器转发的分组中保留一个比特或字段,用该比特或字段的值表示没有拥塞或产生了拥塞。也可以由一些主机或路由器周期性的发出探测分组,以询问拥塞是否发生。
开环控制和闭环控制
开环控制方法就是在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞。
闭环控制时基于反馈环路的概念。属于闭环控制的有以下几种措施:
监测网络系统以便检测到拥塞在何时、何处发生。
将拥塞发生的信息传送到可采取行动的地方。
调整网络系统的运行以解决出现的问题。
监测网络拥塞的指标:(这些指标的上升都标志着拥塞的增长)
由于缺少缓存空间而被丢弃的分组的百分数
平均队列长度
超时重传的分组数
平均分组时延
分组时延的标准差
5.8.2 TCP拥塞控制方法
闭环控制方法(TCP采用基于窗口的方法进行拥塞控制)
TCP发送一个拥塞窗口cwnd(Congestion Window)
拥塞窗口的大小取决于网络的拥塞程度,并且动态的在变化。
发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
慢开始算法
在主机刚刚开始发送报文段时可先设置拥塞窗口cwnd=1,即设置为一个最大报文段MSS的数值。
在每收到一个对新的报文段的确认后,将拥塞窗口加1,即增加一个MSS的数值。
用这样的方法逐步增大发送端的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理
每经过一个轮次,拥塞窗口cwnd就加倍。一个传输轮次所经历的时间其实就相当于往返时间RTT。窗口大小按指数增加。
慢开始门限状态变量ssthresh
当cwnd 当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法。 当cwnd=ssthresh时,即可使用慢开始算法,也可使用拥塞避免算法。 拥塞避免算法 拥塞避免算法的思路是让拥塞窗口cwnd缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长。 当网络出现拥塞时 (1)无论在慢开始阶段还是在拥塞阶段,只要发送方判断网络出现拥塞(重传定时器超时): ssthresh=max(cwnd/2,2) cwnd=1; 执行慢开始算法 这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。 快重传算法 快重传算法要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方,而不要等待自己发送数据报时才进行捎带确认。 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。 6、快恢复算法 当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法: (1)慢开始门限ssthresh=当前拥塞窗口cwnd/2; (2)新拥塞窗口cwnd=慢开始门限ssthresh; (3)开始执行拥塞避免算法,使拥塞窗口缓慢的线性增大。 7、加法增大,乘法减小(AIMD) (1)在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为“加法增大”AI(Additive Increase)。 (2)当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为“乘法减小”MD(Multiplicative Decrease)。 8、发送窗口的上限值 发送方的发送窗口的上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,即应按以下公式确定: 当rwnd 当cwnd 5.9 TCP的运输连接管理 1 运输连接基本情况 TCP运输连接分为三个阶段:连接建立、数据传送、连接释放 运输连接的管理就是使运输连接的建立和释放都能正常地运行 2 TCP连接建立的准备工作 TCP连接的建立采用客户/服务器的方式 主动发起连接建立请求的应用进程叫做客户。 被动等待连接建立的应用进程叫做服务器。 客户和服务器都能确知对方的存在。 要允许双方协商一些参数:最大窗口值、时间戳、服务质量等。 要能对运输实体资源进行分配:缓存大小、连接表中的项目等。 3 TCP连接建立的准备工作 服务器B创建传输控制块TCB; TCB存储连接中所需的TCP连接请求表、窗口值、序号、时间戳等重要信息。 客户端A确定要访问的地址,准备发起网络访问 4 TCP连接建立过程之第一次握手 客户端A向服务器B发出连接请求报文段; 报文段首部:同步控制位SYN=1,初始序号seq=x。 第二次握手 服务器B收到连接请求报文段后,如果同意,则发回确认信息。 确认报文段首部:同步控制位SYN=1,确认位ACK=1,确认号ack=x+1,序号seq=y。 第三次握手 客户端A收到确认报文段后,再向服务器B给出确认(对确认的确认) 报文段首部:ACK=1,seq=x+1,ack=y+1。 经过三次握手,TCP连接建立。 5 两次握手可能发生的问题 客户A发送的“已失效的连接请求报文段”又传送到了服务器端B,产生错误,浪费资源。 这种情况下,采用三次握手可以有效避免:即,对于这种已超时失效的报文,客户端A不会向B的确认发出确认,B收不到这种确认,就会明白A并没有要求建立这种连接,就不会分配资源等待了。 6 TCP的连接释放 客户端A向服务器B发出释放报文段; 报文段首部:终止控制位FIN=1,序号seq=u; u的值为:已经传送数据的最后一个字节的序号加1。 服务端收到连接释放报文段后,如果同意,则发回确认信息; 从客户端A到服务器B方向上的连接已释放,TCP连接处于半关闭状态; 如果服务器B还向客户端A发送数据,则A还要接收数据; 报文段首部:确认位ACK=1,确认号ack=u+1,序号seq=v。 服务器B向客户端A发出连接释放报文段; 报文段首部:ack=u+1。 客户端A收到服务器B发送的连接释放报文段后,向服务器B发送确认。 经过时间2MSL,A关闭。TCP连接释放。 7 四次握手 第一次握手:客户端A向服务器B发送FIN+ACK报文,要求释放连接: FIN+ACK报文(FIN,ACK,seq,ack),FIN-WAIT-1; 第二次握手:服务器B向客户端A发送ACK报文,表示对A的信息确认: ACK报文(ACK,seq,ack),CLOSE-WAIT/FIN-WAIT-2; 第三次握手:服务器B再向A发送FIN+ACK报文,可以关闭连接了: FIN+ACK报文(FIN,ACK,seq,ack),LAST-ACK。 第四次握手:客户端A向服务器B发送ACK报文,确认连接释放: ACK报文(ACK,seq,ack),TIME-WAIT/CLOSED 8 为什么等待2MSL? MSL:最长报文段寿命 为保证客户端A发送的最后一个ACK报文段能到达服务器B; 防止“已失效的连接请求报文段”出现在本连接中。 客户端A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。