第三章 传输层

45 篇文章 12 订阅
5 篇文章 0 订阅

第一节 传输层的基本服务

一,传输层功能

  • 传输层的核心任务是为应用进程之间提供端到端的逻辑通信服务。主要功能如下:
    1. 传输层寻址。
    2. 对应用层报文进行分段和重组。
    3. 对报文进行差错检测。
    4. 实现进程间的端到端可靠数据传输控制。
    5. 面向应用层实现复用与分解(multiplexing/demultiplexing)
    6. 实现端到端的流量控制。
    7. 拥塞控制等。
  • 当网络边缘中的两台主机通过网络核心进行端到端的通信时,只有主机的协议栈中才有传输层协议,而网络核心部分中的路由器在转发分组时都只用到下三层的功能,即不需使用传输层协议。
  • 在发送端,传输层将从发送应用程序进程接收到的报文切分并封装成传输层数据包,在Internet中称为传输层报文段(segment),然后,在发送端系统中,传输层将这些报文段传递给网络层,网络层将其封装成网络层分组(即数据报)并向目的地发送。

二,无连接服务与面向连接服务

  • 无连接服务是指数据传输之前无需与对端进行任何信息交换,直接构造传输层报文段并向接收端发送。
  • 面向连接服务是指在数据传输之前,需要双方交换一些控制信息,建立逻辑连接,然后再传输数据,数据传输结束后还需要再拆除连接。

第二节 传输层的复用与分解

  • 支持众多应用进程共用同一个传输层协议,并能够将接收到的数据准确交付给不同的应用进程,称为传输层的多路复用与多路分解,简称复用与分解,或复用与分用
    • 多路复用:在源主机,传输层协议从不同套接字收集应用进程(可能是不同的网络应用)发送的数据块,并为每个数据块封装上首部信息(包括用于分解的信息)构成报文段,然后将报文段传递给网络层,这一过程就是多路复用
    • 多路分解:在接收端,传输层协议读取报文段中的这些字段,标识出接收套接字,进而通过该套接字,将传输层报文段中的数据交付给正确的套接字,这一过程就是多路分解
    • 实现复用与分解的关键是传输层协议能够唯一标识一个套接字。
  • 一个网络应用进程通过一个或多个套接字,实现与传输层之间的数据传输,即发送数据和接收数据。
    • 在接收主机中的传输层实际上并没有直接将数据交付给进程,而是将数据交付给了与接收进程相关联的一个中间套接字,在任一时刻,接收主机上都可能有不止一个套接字,每个套接字都必须有唯一的标识符,传输层协议才能基于这个唯一标识将数据交付给正确的套接字,进而交付给正确的进程,实现分解。

一,无连接的多路复用与多路分解

  • Internet传输层提供无连接服务的传输层协议是UDP。为UDP套接字分配端口号有两种方法。
    • 创建UDP套接字时,传输层自动地为该套接字分配一个端口号(通常从1024~65535分配一个端口号)。
    • 在创建一个UDP套接字后,通过**bind()**函数为该套接字绑定一个特定的端口号。
  • UDP套接字的端口号是UDP实现复用与分解的重要依据。
  • 使用无连接UDP服务的应用进程,可以接收到来自任何一个主机,使用任何一个端口号的应用进程发送的具有相同目的IP地址和目的端口号的UDP报文段。
  • UDP实现分解的依据是目的IP地址和目的端口号。

二,面向连接的多路复用与多路分解

  • Internet传输层提供面向连接服务的是TCP
  • TCP套接字是由一个四元组:<源IP地址源端口号目的IP地址目的端口号>来唯一标识的。
  • TCP服务器可以同时支持多个TCP套接字,每个套接字与一个进程(或线程)相关联,并由一个四元组来标识每个套接字。

三,总结

  • Internet中,唯一标识套接字的基本信息是IP地址端口号
  • UDP基于目的IP地址目的端口号二元组唯一标识一个UDP套接字,从而可以实现精确分解。
  • TCP需要基于源IP地址目的IP地址源端口号目的端口号四元组唯一标识一个TCP套接字(即一个TCP连接),从而实现精确分解。

第三节 停-等协议与滑动窗口协议

一,可靠数据传输基本原理

  • 理想传输信道是不产生差错(即比特跳变)并提供按序交付服务的物理或逻辑信道。
  • 不可靠传输信道的不可靠性主要表现在以下方面:
    1. 比特差错
      • 即0错成1或1错成0的现象。
    2. 数据乱序
      • 即先发送的数据包后到达,后发的数据包先到达。
    3. 数据丢失
      • 即部分数据会在中途丢失,不能到达目的地。
  • 实现可靠数据传输的措施主要包括以下方面:
    1. 差错检测:利用差错编码实现数据包传输过程中的比特差错检测(甚至纠正)。差错编码就是在数据上附加冗余信息(通常在数据后),这些冗余信息建立了数据(位)之间的某种逻辑关联。
    2. 确认:接收方向发送方反馈接收状态。基于差错编码的差错检测结果,如果接收方接收到的数据未发生差错,并且是接收方期望接收的数据,则接收方向发送方发送ACK数据包,称为肯定确认Positive Acknowledgment),表示已正确接收数据;否则发送NAK数据包,称为否定确认Negative Acknowledgment),表示没有正确接收数据。
    3. 重传:发送方重新发送接收方没有正确接收的数据。发送方如果收到接收方返回的ACK数据包,则可以确认接收方已正确接收数据,可以继续发送新的数据;如果收到NAK,表明接收方没有正确接收数据,则将出错的数据重新向接收方发送,纠正出错的数据传输。
    4. 序号:确保数据按序提交。由于底层信道不可靠,可能出现数据乱序到达,因此对数据包进行编号,这样,即便数据包不是按序到达的,接收方也可以根据数据包的序号纠正数据顺序,实现向上层按序提交数据。
    5. 计时器:解决数据丢失问题。发送方在发送了数据包后就启动计时器,在计时器发生超时时还没有收到接收方的确认,就主动重发数据包,从而可以纠正数据丢失问题。

二,停-等协议

  • 实现可靠数据传输的最基本策略就是综合利用各种实现可靠数据传输的措施,当发送方向接收方发送一个报文段后,就停下来等待接收方的确认,如果收到ACK,则可以发送新的报文段;如果收到NAK或者超时,则重发刚发送的报文段,直到收到ACK为止。
  • 基于这种重传机制的可靠数据传输协议称为自动重传请求Automatic RepeatreQuestARQ),协议,最简单的ARQ协议就是停-等协议
  • 停-等协议的主要特点就是每发送一个报文段后就停下来等待接收方的确认。
  • 停-等协议的基本工作过程是:
    • 发送方发送经过差错编码和编号的报文段,等待接收方的确认。
    • 接收方如果正确接收报文段,即差错检测无误且序号正确,则接收报文段,并向发送方发送ACK,否则丢弃报文段,并向发送方发送NAK
    • 发送方如果收到ACK,则继续发送后续报文段,否则重发刚刚发送的报文段。

三,滑动窗口协议

  • 停-等协议的主要性能问题在于它的停止-等待机制降低了信道利用率。

  • 信道利用率可以定义为发送方实际利用信道发送数据的时间与总时间之比。

  • 停-等协议的信道利用率

    • U S e n d e r = L / R R T T + L / R U_{Sender}=\frac{L/R}{RTT+L/R} USender=RTT+L/RL/R
  • 停-等协议存在的问题:信道利用率很低。解决方案:不使用停-等协议的停止-等待运行方式,允许发送方在没有收到确认前连续发送多个分组。这种协议称为流水线协议管道协议

  • 典型的流水线可靠传输协议是滑动窗口协议。

    • 滑动窗口协议对分组连续编号,发送方按流水线方式依次发送分组。
    • 接收方接收分组,按分组序号向上有序提交,并通过确认向发送方通告正确接收的分组序号。
    • 发送方根据收到ACK的序号以及计时器等,或者向接收方继续发送新的分组,或者重发已发送的某个分组。
  • 在滑动窗口协议中:

    • 发送方对于已经发送但还没有收到确认的分组,必须缓存,以便必要时提取缓存中的分组重发,纠正出错或丢失的分组。
    • 接收方则要确保按序向上层提交正确的分组,对于按序到达的无差错分组进行接收确认,并向上层提交。
    • 对于未按序到达的无差错分组,或者缓存或者丢弃,并确认。
    • 对于收到差错分组进行合理的确认(可以采用肯定确认,也可以采用否定确认)。
    • 发送方可以连续发送多少个未被确认的分组,主要取决于发送方缓存,接收方缓存,网络的带宽时延积等因素。
    • 接收方可以缓存多少个未按序正确到达的分组,主要取决于接收方的接收缓存大小等因素。
  • 滑动窗口协议实质上就是将可靠数据传输的工作过程,抽象到分组序号空间,即发送方确保分组按序发送,接收方确保分组按序提交。滑动窗口协议的发送方和接收方各维护一个窗口,分别称为发送窗口 W s W_s Ws和接收窗口 W r W_r Wr

  • 典型的滑动窗口协议

    • GBN协议
      • GBN(Go-Back-N)协议的发送端缓存能力较高,可以在未得到确认前连续发送多个分组,因此,GBN协议的发送窗口 W s > = 1 W_s>=1 Ws>=1GBN接收端缓存能力很低,只能接收1个按序到达的分组,不能缓存未按序到达的分组,通常称GBN协议的接收端无缓存能力。因此,GBN协议的接收窗口 W r = 1 W_r=1 Wr=1
    • SR协议
      • 选择重传(SR)协议是通过让发送方仅重传那些未被接收方确认(出错或丢失)的分组,而避免了不必要的重传。为此,SR协议的接收方是对每个正确接收的分组进行逐个确认。
      • SR协议的发送窗口和接收窗口都大于1,虽然理论上发送窗口和接收窗口大小可以不相等,但很多SR协议设计取相同的发送窗口和接收窗口大小。
  • 滑动窗口协议的信道利用率

    • U S e n d e r = W s ∗ t S e g t S e g + R T T + t A C K U_{Sender}=\frac{W_s*t_{Seg}}{t_{Seg}+RTT+t_{ACK}} USender=tSeg+RTT+tACKWstSeg
    • 对于滑动窗口协议,信道利用率与发送窗口的大小有关,当 W s W_s Ws足够大时,可以使 W s ∗ t S e g ≥ ( t S e g + R T T + t A C K ) W_s*t_{Seg}\geq(t_{Seg}+RTT+t_{ACK}) WstSeg(tSeg+RTT+tACK)成立,此时信道利用率为100%。

第四节 用户数据报协议(UDP)

  • 用户数据报协议UDPInternet传输层协议,提供无连接不可靠数据报尽力传输服务。
  • UDP是一种轻量级传输层协议,只提供最基本的传输层服务。
  • UDP是无连接的,因此,在支持两个进程间通信时,没有握手过程。
  • UDP提供一种不可靠数据传送服务。
  • UDP没有拥塞控制机制,所以UDP发送端可以用任何速率向其下层(网络层)注入数据。
  • UDP就是只做了传输层协议需要完成的最少功能的协议,除了复用/分解功能以及简单的差错检测外,几乎没有对网络层的IP增加任何功能。
  • 使用UDP时,在发送报文段之前,发送方和接收方的传输层实体之间没有握手,正因为如此,UDP被称为是无连接的传输层协议。
  • UDP优势
    1. 应用程序更容易控制发送什么数据以及何时发送:
      1. 采用UDP时,只要应用进程将数据传递给UDPUDP就会将此数据打包进UDP报文段并立即将其传递给网络层。
    2. 无需建立连接。
      1. UDP不需要任何准备即可进行数据传输。因此,UDP不会引入建立连接(根本就无连接)的时延。这也是DNS通常建立在UDP上的主要原因之一。
    3. 无连接状态。
      1. UDP是无连接的,因此也无需维护连接状态.
      2. UDP系统开销小,通常情况下,某些服务器当运行在UDP之上而不是TCP上时,一般都能支持更多的活跃用户。
    4. 首部开销小。
      1. 每个TCP报文段都至少有20字节的首部开销,而UDP仅有8字节的开销。

一,UDP数据报结构

在这里插入图片描述

  • UDP首部只有4个字段,每个字段由两个字节组成。
    • 源和目的端口号用于UDP实现复用与分解。
    • 长度字段指示了在UDP报文段中的字节数(首部和数据的总和)。
    • 接收方使用校验和来检测该报文段是否出现了差错。实际上,计算检验和时,除了UDP报文段以外还包含了IP首部的一些字段。

二,UDP校验和

  • UDP校验和提供了差错检测功能。即,UDP的校验和用于检测UDP报文段从源到目的地传送过程中,其中的数据是否发生了改变。
  • UDP在计算校验和时,对所有参与运算的内容按16位求和,求和过程中遇到的任何溢出都被回卷最后得到的和取反码,就是UDP的校验和,填入UDP数据报的校验和字段。
  • UDP在生成校验和时,校验和字段取全0。参与UDP校验和计算的内容包括3部分:UDP伪首部UDP首部应用层数据

在这里插入图片描述

  • 其中,填充部分为8位全0,可能有也可能没有,目的是确保16位对齐。UDP伪首部结构如下。
  • 其中,源IP地址,目的IP地址和协议号均是封装对应UDP数据报的IP分组的对应字段;UDP长度字段是该UDP数据报的字段,也就是说该字段会参与计算两次。对于UDP,协议号的值为17。

在这里插入图片描述

  • UDP计算校验和示例。
    • 假设下面3个16位的字:
      • 0110011001100000
      • 0101010101010101
      • 1000111100001100
    • 前两个16位字的和是:
      • 0110011001100000
      • 0101010101010101
      • 1011101110110101
    • 再将上面的和与第三个字相加,得出:
      • 1011101110110101
      • 1000111100001100
      • 10100101011000001
    • 最后一次加法有溢出,需要将最高位进位1加到和的最低位,于是得到0100101011000010。取其反码,得到最后的校验和结果是1011010100111101。
  • 为什么UDP提供校验和?
    • 因为不能保证源和目的之间的所在链路都提供差错检测,也就是说,这些链路中也许某条可能使用没有差错检测的数据链路层协议。
    • 即使报文段经过链路正确地传输,当报文段存储在某路由器的内存中时,也可能引入比特差错。
    • 在既无法确保链路的可靠性,又无法确保内存中的差错检测的情况下,如果端到端数据传输服务需要提供差错检测,那么UDP就必须提供端到端的差错检测服务。
    • 虽然UDP提供差错检测,但是它没有差错恢复能力,只是简单地丢弃差错报文段,或者将受损的报文段交给应用程序并给出警告,由应用程序决策如何处理差错报文段。

第五节 传输控制协议(TCP)

  • 传输控制协议TCP)是Internet一个重要的传输层协议。
  • TCP提供面向连接可靠有序字节流传输服务。
  • TCP是面向连接的传输层协议,应用程序在使用TCP之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。
  • TCP不保证接收方应用程序每次收到的数据块和发送方应用程序每次所发出的数据块具有对应大小的关系。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
  • TCP提供全双工通信服务,即TCP允许通信双方的应用进程在任何时候都能发送数据和接收数据。
  • TCP连接的两端都设有发送缓存接收缓存,用来临时存放双向通信的数据。
    • 发送缓存是在三次握手初期设置的缓存之一,TCP可从缓存中取出并放入报文段中的数据,数量受限于最大报文段长度Maximum Segment Size,MSS)。MSS通常根据最初确定的由本地主机发送的最大链路层帧长度来设置,设置该MSS要保证一个TCP报文段(封装在一个IP数据报中)加上TCPIP首部长度(通常40字节)将适合单个链路层帧。
    • 在接收时,TCP把收到的数据放入接收缓存,上层应用进程在合适的时候读取接收缓存中的数据。
  • TCP为每块客户数据配上一个TCP首部,从而形成多个TCP报文段。这些报文段被交付给网络层,网络层将其分别封装在网络层IP数据报中。然后这些IP数据报被发送到网络中,最终送达目的主机。

一,TCP报文段结构

在这里插入图片描述

  • TCP报文段由首部字段和一个数据字段组成。
    • 源端口号与目的端口号字段分别占16位,标识发送该报文段的源端口和目的端口,用于多路复用/分解来自或送到上层应用的数据。
    • 序号字段与确认序列字段分别占32位。
      • TCP的序号是对应用层数据的每个字节进行编号,因此每个TCP报文段的序号是该段所封装的应用层数据的第一个字节的序号。
      • 确认序号是期望从对方接收数据的字节序号,即该序号对应的字节尚未收到,该序号之前的字节已全部正确接收,就是说,TCP采用累计确认机制。
    • 首部长度字段占4位,指出TCP段的首部长度,以4字节为计算单位。由于TCP选项字段的原因,TCP首部的长度是可变的。当该字段取最大值15时,表示TCP段的最大首部长度,即60字节。
    • 保留字段占6位,保留为今后使用,目前值为0。
    • URG,ACK,PSH,RST,SYN和FIN字段各占1位,共占6位,为6位标志位(字段)。
      • URG=1时,表明紧急指针字段有效,通知系统此报文段中有紧急数据,应尽快传送。
      • ACK=1时,标识确认序号字段有效,当ACK=0时,确认序号字段无效。
      • TCP收到PSH=1的报文段时,就尽快将报文段中的数据交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
      • 当RST=1时,表明TCP连接中出现严重差错(由于主机崩溃或其他原因),必须释放连接,然后再重新建立TCP连接。
      • SYN=1时,表示该TCP报文段是一个建立新连接请求控制段或者是同意建立新连接的确认段(此时ACK=1)。
      • FIN用来释放一个TCP连接,当FIN=1时,表明该TCP报文段的发送端数据已发送完毕,并请求释放TCP连接。
    • 接收窗口字段占16位,用于向对方通告接收窗口大小(单位为字节),表示接收方愿意(或还可以)接收的应用层数据字节数量,其值是本端接收对方数据的缓存剩余空间,用于实现TCP的流量控制。
    • 校验和字段占16位,校验和字段检验的范围类似于UDP,包括TCP伪首部,TCP首部和应用层数据3部分,计算方法与UDP校验和的计算方法相同。
    • 紧急指针字段占16位,该字段只有URG=1时才有效。紧急指针字段指出在本TCP报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面),即指出紧急数据最后一个字节在数据中的位置。即使接收窗口大小为零时,也可以发送紧急数据。
    • 选项字段的长度可变。TCP最初只规定了一种选项,即最大段长度MSS,用于对方TCP通告其缓存能够接收的数据段的最大长度是MSS个字节。
    • 填充字段,长度为0~3字节,取值全0,目的是为了整个首部长度是4字节的整数倍。

二,TCP连接管理

  • TCP的连接管理包括连接建立连接拆除

    • TCP连接建立通过“三次握手”过程。

      1. 客户端作为连接建立发起端,选择客户端初始序列号 x x x,向服务器发送(SYN=1,seq= x x x)的SYN段。客户状态由LISTEN进入SYN_SEND状态,等待服务器确认。
      2. 服务器收到客户发送的SYN段后,选择服务器初始序列号 y y y,向客户发送(SYN=1,ACK=1,seq= y y y,ack_seq= x x x+1)的SYNACK段。同时,服务器状态由LISTEN进入SYN_RCVD状态。
      3. 客户端收到服务器的SYNACK段后,向服务器发送(ACK=1,seq=x+1,ack_seq=y+1)的ACK段,同时,客户端进入ESTABLISHED状态,客户端确认连接已建立;当服务器收到ACK段后,也进入ESTABLISHED状态,也确认连接已建立。
      • 建立连接过程中客户端状态名称与含义:
        • 关闭状态CLOSED,处于初始状态。
        • 同步已发送状态SYN_SENT
        • 已建立状态ESTABLISHED,表示可以传送数据。
      • 建立连接过程中服务器端状态名称与含义:
        • 关闭状态CLOSED,处于初始状态。
        • 监听状态LISTEN
        • 同步收到状态SYN_RCVD
        • 已建立状态ESTABLISHED,表示可以传送数据。

    在这里插入图片描述

    • TCP连接的“四次挥手“过程

      1. 当客户端向服务器发送完最后一个数据段后,可以发送一个FIN段(FIN=1,seq= u u u),请求断开客户到服务器的连接,其状态由ESTABLISHED进入FIN_WAIT_1,在这一状态下,只能接收服务器发送过来的数据,而不再发送数据。FIN段不封装应用层数据,但是也要消耗掉1个序列号。
      2. 服务器收到客户的FIN段后,向客户发送一个ACK段(ACK=1,seq= v v v,ack_seq= u u u+1),ACK段可以封装应用层数据(如果有)。服务器状态由ESTABLISHED进入CLOSE_WAIT,在此状态下,服务器仍然可以发送数据,但不再接收数据。当客户收到ACK段后,其状态由FIN_WAIT_1进入FIN_WAIT_2,仍然可以接收来自服务器的数据。此时的TCP连接已经关闭了客户向服务器方向的数据传输,也称为半关闭
      3. 当服务器向客户发送完最后一个数据后,服务器向客户发送FIN段(FIN=1,ACK=1,seq= w w w,ack_seq= u u u+1),同样,该FIN段也不携带应用层数据。服务器状态由CLOSE_WAIT进入LAST_ACK,此时服务器也不再发送数据。
      4. 当客户收到服务器发送的FIN段后,向服务器发送ACK段(ACK=1,seq= u u u+1,ack_seq= w w w+1),其状态由FIN_WAIT_2进入TIME_WAIT,等待2MSL(Maximum Segment Lifetime)时间,然后进入CLOSED状态,最终释放连接;服务器在收到最后一次ACK段后,状态由LAST_ACK进入CLOSED,最终释放连接。
      • 断开连接过程中,客户端状态名称与含义:
        • ESTABLISHED状态,表示可以传递数据。
        • FIN_WAIT_1终止等待1状态,等待服务器端的确认。
        • FIN_WAIT_2终止等待2状态,等待服务器端发出的连接释放报文段。
        • TIME_WAIT时间等待状态,表示等待2倍MSL时间后进入关闭状态CLOSED
      • 断开连接过程中,服务器端状态名称与含义:
        • ESTABLISHED状态,表示可以传递数据。
        • CLOSED_WAIT关闭等待状态。
        • LAST_ACK最后确认状态。
        • CLOSED关闭状态。

      在这里插入图片描述

    • TCP采用四次挥手进行断开连接的主要原因是为了确保断开连接过程的可靠,不会由于不可靠断开连接而破坏TCP的可靠数据传输;TCP的四次挥手断开连接是对称断开连接,要求两端都主动提出断开连接请求(发送FIN段),这样可以确保双方均能确认是否已全部收到双方的数据,达到可靠数据传输的目的。

三,TCP可靠数据传输

  • TCP的可靠数据传输服务确保了一个进程从其接收缓存中读出的数据流是无差错无缺失无冗余以及无乱序的字节流,该字节流与连接的另一方端系统发送出的字节流是完全相同的。
  • TCP的可靠数据传输实现机制包括差错编码确认序号重传计时器等。
    • 序列号是每个字节编号。
    • 确认序号为期望接收字节序号,TCP通常采用累积确认。
    • 通常采用单一的重传计时器,计时器超时时间采用自适应算法设置超时时间。
    • 重传数据段主要针对两类事件,计时器超时和三次重复确认。
  • TCP的可靠数据传输是基于滑动窗口协议,但是发送窗口大小动态变化。
    • TCP的发送窗口取决于流量控制的接收端通告的窗口大小和实现拥塞控制的拥塞窗口大小,任一时刻TCP发送窗口都取这两个窗口的最小值,这两个窗口在TCP连接建立后的整个通信过程中一直动态变化。
    • 假设某时刻流量控制(接收端通告的接收窗口)大小为RcvWin,拥塞控制窗口为CongWin,则此刻TCP的发送窗口 W s = m i n ( R c v W i n , C o n g W i n ) W_s=min(RcvWin,CongWin) Ws=min(RcvWin,CongWin)
  • TCP可靠数据传输服务工作机制
    1. 应用数据被分割成TCP认为最适合发送的数据块(通常是MSS),封装成TCP段,传递给IP。
    2. 当TCP发出一个段后,启动一个计时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,则认为该报文段丢失,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,将发送一个确认段。
    3. TCP首部中设有校验和字段,用于检测数据在传输过程中是否发生差错。如果收到的报文段通过校验和检测,发现有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发送端超时并重发),而将已连续接收到的应用层数据的最后一个字节的序号加1,作为确认序号,向发送方发送确认段。
    4. 由于TCP报文段封装到IP数据报中传输,而IP数据报的到达可能会经过不同的路径而造成顺序的错乱,因此TCP报文段的到达也可能会失序。如果必要,TCP将根据序号对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
    5. 由于存在网络延迟和重传机制,TCP的接收端有可能会收到多个重复的报文段,这时接收端需要根据序号把重复的报文段丢弃。
    6. TCP能够提供流量控制。TCP连接的每一方都在建立连接时分配一定大小的接收缓冲空间。TCP的接收端只允许另一端发送接收端缓存区所能接纳的数据。这可以防止较快主机发送数据太快,致使较慢的缓冲区溢出。

四,TCP流量控制

  • 流量控制flow control)的目的是协调协议发送方与接收方的数据发送与接收能力,避免因发送方发送数据太快,超出接收方的数据接收和处理能力,导致接收方被数据“淹没”,即数据到达速度超出接收方的接收,缓存或处理能力,致使数据在接收方被丢弃。
  • 流量控制存在于端到端的传输层,也存在于数据链路层。
  • 基于滑动窗口协议实现流量控制时,发送窗口的大小反映了接收方接收和处理数据的能力,反之,限制发送方以较低速率发送数据。
  • TCP连接建立时,双方都为之分配了固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP首部的接收窗口字段占16位,用于向对方通告接收窗口大小(单位为字节),其值是本端接收双方数据的缓存剩余空间,防止本端的缓冲区溢出。接收端在给发送端发送数据段(ACK=1)或单独确认段时,通告剩余接收缓存空间作为接收窗口,发送端在接下来发送数据段时,控制未确认段的应用层数据总量不超过最近一次接收端通告的接收窗口大小,从而确保接收端不会发生缓存溢出。
  • 当该TCP连接收到正确,按序的字节流后,它就将数据放入接收缓存。相关联的应用进程会从该缓存中读取数据,但未必是数据刚一到达就立即读取。事实上,接收方应用也许正忙于其他任务,甚至要过很长时间才去读取该数据。如果某应用程序读取数据时相对缓慢,而发送方发送得太多,太快,发送的数据就会很容易地使该连接的接收缓存溢出。

五,TCP拥塞控制

  • 拥塞是指太多主机以太快的速度向网络中发送太多的数据,超出了网络处理能力,导致大量数据分组“拥挤”在网络中间设备(如路由器)队列中等待转发,网络性能显著下降的现象。
  • 拥塞的后果
    • 数据分组通过网络的时延显著增加。
    • 队列满导致大量分组被丢弃。
  • 拥塞控制congestion control)就是通过合理调度,规范,调整向网络中发送数据的主机数量,发送速率或数据量,以避免拥塞或尽快消除已发生的拥塞。
  • 拥塞控制实现位置比较典型的是在网络层传输层进行拥塞控制。
    • ATM网络是在网络层进行拥塞控制。
    • Internet是在传输层进行拥塞控制(通过TCP实现)。
  • 拥塞控制策略分为拥塞预防拥塞消除两大类。
    • 拥塞预防是通过采取一些技术预防拥塞的发生。
      • 可以采用诸如流量整形技术等,规范主机向网络中发送数据的流量,预防或避免拥塞的发生。
    • 拥塞消除是利用拥塞检测机制检测网络中是否发生拥塞,然后通过某种方法消除已发生的拥塞。
      • 基于某种拥塞检测机制,然后再调整主机向网络中发送数据的速率和数量,从而逐渐消除拥塞。
  • 根据拥塞检测机制的不同,拥塞控制又可以分为基于拥塞状态反馈的拥塞控制方法无需拥塞状态反馈的拥塞控制方法
    • 网络层的拥塞控制大多采用基于拥塞状态反馈的拥塞控制方法,此方法适用于虚电路网络。
      • ATM网络实现拥塞状态反馈方法包括警告位,丢弃分组等。
    • 无需拥塞状态反馈的拥塞控制方法是在主机(即端系统)推测网络是否发生拥塞,如果推断网络已发生拥塞,则主动调整向网络中发送数据的速率和数据量,以便消除拥塞。
      • TCP的拥塞控制,通常采用这类拥塞控制方法,通过是否发生报文段的超时(或3次重复确认)来推断网络是否发生拥塞。
  • TCP的拥塞控制是从端到端的角度,推测网络是否发生拥塞,如果推测网络发生拥塞,则立即将数据发送速率降下来,以便缓解网络拥塞。TCP的拥塞采用的是窗口机制,通过调节窗口的大小实现对发送数据速率的调整。
    • 窗口调整的基本策略是网络未发生拥塞时,逐渐“加性”增大窗口大小,当网络拥塞时“乘性“快速减小窗口大小,即AIMDAdditive IncreaseMultiplicative Decrease)。
    • TCP拥塞控制窗口的调节,分为慢启动slow start)阶段和拥塞避免congestion avoidance)阶段。
      • 慢启动阶段窗口从一个MSS快速增长,达到某个阈值后转为拥塞避免阶段。
      • 拥塞避免阶段的窗口增长放慢。
  • TCP的发送端维持一个称为拥塞窗口CongWin的变量,单位为字节,用于表示在未收到接收端确认的情况下,可以连续发送的数据字节数。
  • 发送端推断网络发生拥塞的依据是发生计数器超时或对某个报文段的3次重复确认。
  • TCP的拥塞控制算法分为慢启动拥塞避免快速重传fast retransmit)和快速恢复fast recovery)4种。
    • 慢启动:当TCP开始发送数据时,因为不知道网络中的负载情况,如果立即发送大量的数据,有可能会引起网络的拥塞。因此,TCP采用试探的方法,逐渐增大拥塞窗口。通常在刚开始发送数据报文段的确认后,CongWin就增加一个MSS的数据。这样就可以逐渐增大发送端的拥塞窗口,使数据注入网络的速率逐渐加快。如果定义从发送端发出一个报文段到收到对这个报文段的确认的时间间隔为往返时间RTT,并且在1个RTT时间内,CongWin中的所有报文段都可以发送出去,则在慢启动阶段,每经过1个RTTCongWin的值就加倍。
    • 拥塞避免TCP设置一个拥塞窗口阈值Threshold,”分割“慢启动阶段和拥塞避免阶段。当拥塞窗口小于Threshold时,拥塞窗口按慢启动方式增长,当拥塞窗口大于等于Threshold时,拥塞窗口切换为按拥塞避免方式增长,即减缓拥塞窗口的增长速度。具体是每经过一个RTT,拥塞窗口CongWin的值加1(单位为MSS),即当前拥塞窗口中的所有报文段全部发送并且都被成功确认,则CongWin的值加1。就可以使CongWin按线性规律缓慢增长,即”加性增长“,这个阶段为拥塞避免阶段。拥塞窗口CongWin的初值为1,阈值Threshold的初值为16。当拥塞避免算法执行到某个时刻,发送端发生了计时器超时,则意味着网络发生了拥塞。此时,发送端首先将新的阈值设置为 T h r e s h o l d = C o n g W i n / 2 Threshold=CongWin/2 Threshold=CongWin/2,同时,将新的拥塞窗口设置为 C o n g W i n = 1 CongWin=1 CongWin=1,即重新执行慢启动算法。
    • 快速重传:基本思想是接收端收到3次重复确认时,则推断被重复确认的报文段已经丢失,于是立即发送被重复确认的报文段。
      MSS),即当前拥塞窗口中的所有报文段全部发送并且都被成功确认,则CongWin的值加1。就可以使CongWin按线性规律缓慢增长,即”加性增长“,这个阶段为拥塞避免阶段。拥塞窗口CongWin的初值为1,阈值Threshold的初值为16。当拥塞避免算法执行到某个时刻,发送端发生了计时器超时,则意味着网络发生了拥塞。此时,发送端首先将新的阈值设置为 T h r e s h o l d = C o n g W i n / 2 Threshold=CongWin/2 Threshold=CongWin/2,同时,将新的拥塞窗口设置为 C o n g W i n = 1 CongWin=1 CongWin=1,即重新执行慢启动算法。
    • 快速重传:基本思想是接收端收到3次重复确认时,则推断被重复确认的报文段已经丢失,于是立即发送被重复确认的报文段。
    • 快速恢复:当发送端连续收到3次重复确认时,将阈值Threshold减半,并且将拥塞窗口CongWin的值置为减半后的Threshold,然后开始执行拥塞避免算法,使CongWin缓慢地加性增长。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值