考研笔记-运输层服务和工作原理

5.运输层服务和工作原理

  5.1.1传输层提供的服务

    从通信和信息处理的角度来看,传输层向上面的应用层提供通信服务,属于面向通信的最高层,同时也是用户功能的最低层。传输    层位于网络层之上,为运行在不同主机上的进程间提供逻辑通信,而网络层提供不同主机间的逻辑通信。即使网络层不能提供可靠的传    输协议,运输层同样能为应用程序提供可靠服务。

    传输层的功能:

    1)传输层提供应用进程之间的逻辑通信(即端到端通信)。与网络层的区别是,网络层提供的是主机间的逻辑通信。

    2)复用和分用。复用是指发送方不同的应用程序都可以采用同一个传输层协议传送数据;分用是指接收方的传输层在去除报文首部      后能把这些数据正确交付到目的应用程序。

    注:传输层的复用分用与网络层的不同,网络层的复用是指发送方不同的协议数据都可以封装成IP数据报发送出去,分用是指接收      方的网络层在去除首部后把数据交付给相应的协议。

    3)传输层还要对收到的报文进行差错检验(首部和数据部分)。而网络层只检查IP数据报的首部,不检查数据。

    4)提供两种协议,即面向连接的TCP和无连接的UDP。而网络层无法同时实现两种协议(即在网络层要么只提供面向连接的服务,如      虚电路,要么只提供无连接的服务,如数据报,不可能在网络层同时出现这两种方式)。

    5)接收进程收到的报文顺序应与发送顺序一致,发送进程发送一次报文,接收方应收到且只收到一次。对应用层报文长度没有限      制,发送进程和接收进程间保持报文同步。由接收进程控制发送进程的发送速率,提供流量控制。

    传输层向高层用户屏蔽了底层网络核心的细节,他使应用程序看起来是在两个对等实体间有一条端到端的逻辑通信信道,这条逻辑    信道会因为传输层协议不同会有很大的差别。当传输层采用TCP协议时,这条信道就相当于一条可靠的全双工信道。当采用采用无连接    的UDP时,这种逻辑通信信道仍然是一条不可靠信道。

 

  5.1.2 传输层的寻址与端口

    1.端口的作用

      端口能让各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应该将其报文段的数据向上通过端口交付给相      应的应用进程。端口就是传输层的服务访问点TSAP,在传输层的作用类似于网络层的IP地址或者是数据链路层的MAC地址,只是IP地      址与MAC地址标识的是主机,而端口标识的是进程。

    2.端口号

      端口号长度16bit,能表示65536个不同的端口号,端口号只具有本地意义,不同计算机之间的端口号没有联系。

      根据端口号范围可分为两类:

      1)服务端使用端口。这里又分为两类,最重要的一类是熟知端口号,数值为0~1023,IANA把这些端口指派给了TCP/IP最重要的      一些应用程序。另一类叫做登记端口号,数值为1024~49151。这些为不是熟知应用程序所使用,必须在IANA登记,防止重复。

    常用的熟知端口号:

      2)客户端常用的端口号,数值为49152~65535,由于这类端口仅在客户程序运行时才动态选择,因此又叫短暂端口号(也称临      时端口)。通信结束后,刚才使用过的客户端口号就不复存在了,这个端口号可以供其他程序使用。

    3.套接字

      在网络中通过IP地址来标识不同的主机,通过端口号来标识不同应用进程。在网络中采用发送方和接收方的套接字组合来识别      端点,所谓的套接字实际上是一个通信端点,即:

          套接字 = (主机IP地址,端口号)

      他唯一的标识了网络中一个主机上的一个进程。

 

  5.2 UDP协议

    5.2.1 UDP数据报

      1.UDP概述

      UDP是一个无连接的非可靠的传输层协议。他在IP之上只提供两个附加服务:多路复用和对数据的错误检查。UDP在传输前不需      要建立连接,远程主机传输层收到UDP报文后不用给出确认。

      UDP的优点:

      1)无需建立连接,所以没有建立连接时的时延。

      2)无状态连接,TCP需要在端系统中维护连接状态,而UDP不需要,因此,某些专用服务器采用UDP时,一般能支持更多的活动      客户机。

      3)分组首部开销小,TCP首部有20字节的开销,UDP只有8个字节。

      4)应用层能更好的控制要发送的数据和发送时间。UDP没有拥塞控制,因此网络中的拥塞不会影响其发送效率。

      UDP提供尽最大努力的交付,即不保证可靠交付,,但并不意味着应用对数据的要求是不可靠的,因此维护可靠性的工作在应用      层完成。

      UDP是面向报文的。发送方UDP对应应用层交下来的报文,再添加首部后交付给IP层,既不合并也不拆分,而是保留这些报文的      边界;接收方UDP对IP层上交的用户数据报,去除首部后原封不动的交付给应用层,一次交付一个完整的报文。所以报文不可分割,      是UDP的最小单位。

      2.UDP的首部格式

      UDP数据报包含两部分:UDP首部和用户数据。整个UDP数据报作为数据部分封装在IP数据报中。UDP首部有8个字节,由4个字段      组成,每个字段长度都是两个字节。各字段意义如下:

      1)源端口 源端口号,需要对方回信时选用,不需要时可置零。

      2)目的端口 目的端口号,这个在终点交付报文时必须使用到。

      3)长度 UDP数据报的长度(包括首部和数据),最小值为8,即仅包含首部。

      4)校验和 检测UDP数据报在传输中是否有错,有错就丢弃。该字段可选,当源主机不想计算校验和,则令该字段全为0。

 

      如果接收方UDP发现收到的报文中的目的端口号不正确时,就丢去该报文,并由ICMP发送“端口不可达”差错报文给发送方。

 

    5.2.2 UDP校验

      在计算校验和时,要在UDP数据报前加上12个字节的伪首部,伪首部并不是UDP真正的首部,只是在计算校验和时,临时添加在      UDP数据报前面,得到一个临时数据报,校验和是根据这个临时数据报计算的。伪首部不向下传递也不向上递交,仅仅是为了计算校      验和。

      UDP校验和的计算方法和IP数据报首部校验和的计算方法类似,都使用二进制反码运算求和再取反。不同的是,IP数据报的校验      和只校验首部,而UDP的校验是把首部和数据放一块校验的。

      在发送方,首先把全零放入校验和字段,并添加伪首部。然后,把UDP数据报看成是由许多16位字串连接起来。若UDP数据报的      数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节。接下来就按二进制反码计算出这些16位字的和。将此和的二进      制反码写入校验和字段。在接收方,把收到UDP数据报加上伪首部后,按二进制反码计算出这些16位字的和。当无差错时,结果应该      为1。否则就表明有差错,接收方应该丢弃这个数据报。

 

  5.3 TCP协议

    5.3.1 TCP协议的特点

      TCP是在不可靠的IP层之上实现的可靠数据传输协议,主要解决传输的可靠、有序、无丢失、不重复的问题。

      TCP的特点:

      1)TCP是面向连接的传输层协议。

      2)每条TCP连接只能是点对点的。

      3)TCP提供可靠的交付服务,保证双方传输的数据无差错、不丢失、有序、不重复。

      4)TCP提供全双工通信,TCP允许双方应用进程在任何时候都能收发数据,因此在两端都设有接收缓存跟发送缓存。

        发送缓存用来存储以下数据:(1)准备发送的数据 (2)TCP已发出但尚未收到确认的数据。

        接收缓存用来存储以下数据:(1)按序到达但尚未被接收应用程序接收的数据 (2)不按序到达的数据。

      5)TCP是面向字节流的,虽然应用程序和TCP交互的是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串无结         构的字节流。

    

    5.3.2 TCP报文段

      TCP传输的数据单位称为报文段,一个TCP报文段分为首部和数据部分,整个TCP报文段作为数据部分封装在IP数据报中。首部的      前20个字节是固定的,后面有4N个字节是根据需要而增加的选项。TCP报文段既可以用来传输数据,也可以用来建立连接,释放连接      和应答。

      各字段意义如下:

      1)源端口和目的端口  各占两个字节,端口是运输层与应用层的服务接口,复用很分用功能都要通过端口实现。  

      2)序号字段  占四个字节,TCP是面向字节流的,因此TCP连接中传输的数据流中的每个字节都会编上一个序号。序号字段指         的是本报文段发送数据的第一个字节的序号。 

      3)确认号字段  占4个字节,是期望收到对方下一个报文段的数据的第一个字节的序号,若确认号为N,说明序号为N-1之前的         数据都已收到。

      4)数据偏移(即首部长度)  占4位,表示首部长度,单位为4字节,当此字段数值为15时,达到TCP首部最大长度60字节。

      5)保留字段  占6位,置零,可忽略不计。

      6)紧急位URG  当URG=1时,表名紧急指针有效。他告诉系统此报文段中有紧急数据,应尽快传送。单URG应与紧急指针配合使         用,也就是说数据从第一个字节到紧急指针所指的字节就是紧急数据。

      7)确认位ACK  只有当ACK=1时,确认号字段才生效。TCP规定,在连接后建立的所有传送报文都必须把ACK置1。

      8)推送位PSH  接收TCP收到PSH=1的报文时,就应该尽快交付给应用进程,而不是等到整个缓存都填满了才上交。

      9)复位位RST  当RST=1时,表明TCP连接中出现严重差错,必须释放链接,然后再重新建立连接。

      10)同步位SYN  同步SYN=1表示这是个连接请求或连接接收报文。

      11)终止位FIN  用来释放一个连接,FIN=1表示此报文段的发送方数据已发送完毕,并要求释放传输连接。

      12)窗口字段  占2个字节,指出允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送         方设置发送窗口的依据,单位为字节。

      13)检验和  占2个字节,检验的范围包括首部和数据,在计算检验和时,跟UDP一样,在TCP报文段前加上12字节的伪首部           (只需要将UDP伪首部的第四个字段,即协议字段的17改为6,其他跟UDP一样)。

      14)紧急指针字段  占16位,指出在报文段中紧急数据一共多少个字节。

      15)选项字段  长度可变,TCP最初只规定了一种选项,即最大报文长度(MSS),MSS是报文段中数据字段的最大长度。

      16)填充字段  为了使整个首部长度试4的整数倍。

 

    5.3.3  TCP连接管理

      TCP是面向连接的协议,因此每个TCP都有三个阶段:建立连接、数据传输、释放连接。

      TCP建立过程中要解决以下问题:

      1)要使每一方都确知另一方的存在。

      2)允许双方协商一些参数。

      3)能对运输实体资源进行分配。

      TCP把连接作为最基本的对象,每条TCP连接有两个端点。TCP连接的端口叫套接字或插口,端口拼接到IP地址构成了套接字。

      1.TCP连接的建立

      连接的建立经历三个步骤,通常称为“三次握手”:

      第一步,客户机的TCP首先向服务器的TCP发送一个连接请求报文段,这个报文段不含应用层数据,SYN=1,另外,客户机会随机      选择一个起始序号seq=x。

      第二步,服务器的TCP收到请求报文后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报      文段中,SYN=1,ACK=1,确认号字段的值为x+1,并且服务器随机产生一个随机起始号seq=y,确认报文同样不包含数据。

      第三步,当客户机收到确认报文段后,还要向服务器给出确认,并且也要给连接分配缓存和变量。这个报文段ACK=1,序号为      x+1,确认号字段为ack=y+1。该报文段可携带数据,若不携带就不消耗序号。

 

      2. TCP连接的释放

      TCP连接释放的过程通常称为“四次挥手”

      第一步,客户机打算关闭连接,就向TCP发送一个释放连接的报文,并停止再发送数据,主动关闭TCP连接,该报文段的FIN=1,      seq=u,它等于前面已传输的字节数加一。当发送FIN报文时,发送FIN的一方就不能再发送数据,也就是关闭了其中一条数据通路,      但对方还能继续发送数据。

      第二步,服务器收到释放连接报文段后即发出确认,确认号为ack=u+1,这个报文段自己的序号为v,等于他之前传送过的数据      的最后一个字节加一。这时,从客户机到服务器的连接就释放了,TCP处于半关闭状态。但服务器继续发送数据,客户机仍要接收,      因为服务器到客户机方向的连接并未关闭。

      第三步,若服务器已经没有要发送的数据,就通知TCP释放链接,发送FIN=1的连接释放报文。

      第四步,客户机收到连接释放报文后必须发出确认,在确认报文中,ACK=1,确认号为ack=w+1,序号为seq=u+1。此时TCP连接      还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,客户机才进入连接关闭状态。

      对上述TCP连接的建立和释放总结:

      (1)建立连接

        三步:(1)SYN=1,seq=x。

            (2)ACK=1,SYN=1,seq=y,ack=x+1。

            (3)ACK=1,seq=x+1,ack=y+1

      (2)释放连接

        四步:(1)FIN=1,seq=u。

            (2)ACK=1,seq=v,ack=u+1。

            (3)FIN=1,ACK=1,seq=w,ack=u+1。

            (4)ACK=1,seq=u+1,ack=w+1。

 

    5.3.4 TCP可靠传输

      TCP提供的可靠数据传输服务就是要保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的。

      TCP使用了校验、序号、确认和重传机制,其中校验机制与UDP相同。

      1.序号

      TCP首部序号字段用来保证数据能有序提交给应用层,TCP把数据看成是一个无结构但有序的字节流,序号是建立在传送的字节      流之上而不是报文段上。

      TCP连接中传输的数据流中的每个字节都编上一个序号,序号的值是指本报文段数据部分第一个字节的序号。

      2.确认

      TCP首部的确认号是期望收到对方下一个报文数据部分的第一个字节的序号,发送方缓冲区会继续存储那些已发送但尚未收到确      认的报文段,以便在需要时重传。

      TCP默认使用累计确认,即TCP只确认数据流中第一个丢失字节为止的字节,例如,接收方收到0~2和5~7的报文,并没有收到3~4      的报文段,于是接收方发送的确认号应为3。

      3.重传

      两种事件会导致TCP对报文段进行重传:超时和冗余ACK。

      (1)超时

      TCP每发送一个报文段,就对这个报文段设置一次计时器,只要计时器设置的重传时间到期但还并未收到确认信息,就要重传报      文段。

      由于TCP下层是一个互联网环境,IP数据报所选择的路由变化很大,因此传输层的往返时延的方差也很大。因此TCP采用一种自      适应算法,它记录一个报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间RTTs,当第一次测试RTT样本时,RTTs就是RTT      的值,但以后每次测量新的RTT样本时,RTTs就按以下公式重新计算:

新的RTTs = (1-α)*(旧的RTTs)+α(新的RTT样本)

      上式中0≤α<1,若α很接近0,说明新的RTTs与旧值变化不大,受RTT样本的影响不大,若α接近1则反之。【FRC 2988】推荐      α的值为0.125。

      显然超时重传计时器的超时重传时间应大于RTTs。使用一下公式:

RTO = RTTs + 4*RTTd

      RTTd是RTT偏差的加权平均值,第一次测量时,RTTd取RTT样本值的一半,以后的测量就使用下式:

新的RTTd = (1-β)*(旧的RTTd) + β*|RTTs-新的RTT样本|

      β是个小于1的系数,推荐值为0.25。

  

      (2)冗余ACK(冗余确认)

      发送方可在超时事件发生前通过注意所谓的冗余ACK来较好的检测丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方      之前收到过该报文段的确认。TCP规定每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。      TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为这个被确认报文段后面的报文段已丢失,这种技术称为快速重      传技术。

 

      5.3.5 TCP流量控制

      TCP提供一种基于滑动窗口协议的流量控制机制,在通信过程中接收方根据自己接收缓存的大小,动态地调整发送方的发送        窗口大小,这就是接收窗口rwnd,即调整TCP报文首部的“窗口”字段,来限制发送方向网络注入报文的速率。同时发送方根据网络      拥塞程序所确定的窗口值,称为拥塞窗口cwnd,其大小与网络带宽和时延紧密相连。发送窗口的实际大小是取rwnd和cwnd中的最小      值。

      传输层和数据链路层的流量控制的区别在于:传输层定义了端到端用户之间的流量控制,数据链路层定义了两个中间相邻结点      间的流量控制。另外数据链路层的滑动窗口大小不能动态变化,传输层则可以。

 

      5.3.6 TCP拥塞控制

      拥塞控制就是防止过多的数据注入网络中,拥塞往往表现为通信时延的增加。拥塞控制与流量控制有相似之处,都是控制发送      方的发送数据的速率来达到效果。

      拥塞控制和流量控制的区别:拥塞控制是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有主机、路由器,以      及降低网络传输性能的一切额外因素。相反,流量控制往往是对点对点的通信量的控制,即接收端控制发送端,它所要的做的就是      抑制发送端的速率,使得接收端来得及接收。

      为了更好地对传输层进行拥塞控制,因特网建议定义了一下四种算法:慢开始、拥塞避免、快重传、快恢复。

      TCP协议要求发送方维护一下两个窗口:

      1)接收窗口rwnd,接收方根据目前接收缓存大小所许诺的最新窗口值,反应了接收方的容量。接收方根据TCP报文首部的窗口      字段来通知发送方。

      2)拥塞窗口cwnd,发送方根据自己估算的网络拥塞程度而设置的窗口值,反应当前网络的容量。只要网络没有出现拥塞,拥塞      窗口就再增大,以便发送更多数据。但只要网络出现拥塞,拥塞窗口就减小,减少注入网络的分组数。

发送窗口的上限 = Min[rwnd,cwnd]

      1.慢开始和拥塞避免

      (1)慢开始算法

      在TCP刚刚连接好,开始发送TCP报文时,先令拥塞窗口为cwnd=1,即一个最大报文长度MSS。而在每收到一个对新报文的确认      后,将cwnd加一,即增大一个MSS,这样的方法逐步增大拥塞窗口,使得注入到网络的数据速率更加合理。

      使用慢开始算法后,每经过一个RTT,拥塞窗口cwnd就会加倍,即cwnd的大小呈指数式增长。这样慢开始一直打拥塞窗口增大到      一个规定的慢开始门限ssthresh,然后改用拥塞避免算法。

      (2)拥塞避免算法

      发送端的拥塞窗口cwnd每经过一个RTT就增加一个MSS的大小,而不是加倍,使cwnd按线性规律缓慢增长,而当出现一次超时        时,则令慢开始门限等于当前cwnd的一半。

      根据cwnd的大小执行不同的算法,可归纳如下:

      ·当cwnd<ssthresh时,使用慢开始算法。

      ·当cwnd>ssthresh时,停止使用慢开始算法改用拥塞避免算法。

      ·当cwnd=ssthresh时,既可使用慢开始算法,也可使用拥塞避免算法(通常做法)。

      (3)网络拥塞的处理

      当网络出现拥塞时,无论在慢开始阶段还是拥塞避免阶段,只要发送方检测到超时事件的发生,就要把慢开始门限设置为当前      发送方ssh的一半,但不小于2。然后把拥塞窗口重新设为1,执行慢开始算法。

      2.快重传和快恢复

      快重传和快恢复算法是对慢开始和拥塞避免算法的改进。

      (1)快重传

      在TCP可靠传输机制中,快速重传使用了冗余ACK来检测丢包的发生。同样,冗余ACK也可用于网络拥塞的检测。快重传并不是取      消了重传计时器,而是在某些情况下更早地重传丢失的报文。

      当发送方收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,不必等待超时计时器超时。

      (2)快恢复

      快恢复算法原理:当发送端收到三个连续的冗余ACK时,就执行乘法减小算法,把慢开始门限设为出现拥塞时cwnd的一半。与慢      开始的不同之处是它把cwnd的值设置为慢开始门限改变后的数值,然后开始执行拥塞避免算法,使得拥塞窗口缓慢线性增大。

      由于跳过了cwnd从1开始的慢开始过程,所以被称为快恢复。

      在流量控制中,发送方发送的数据量由接收方控制,而在拥塞控制中,由发送方自己通过检测网络状况而决定。实际上,慢开      始、拥塞避免算法、快重传、快恢复算法应该是同时应用在拥塞控制机制中,当发送方检测到超时就采用慢开始和拥塞避免,当发      送方收到三个冗余ACK时就采用快重传和快恢复。

      

 

      

 

      

posted @ 2018-07-31 13:25  Ragd0ll  阅读(771)  评论(0编辑  收藏  举报