计算机网络之传输层

前言

传输层是面向通信部分的最顶层,是面向应用的最底层。面向通信部分,距离传输层最近的网络层,因此本文会将传输层与网络层在必要时候进行对比。

 

传输层作用:

网络层提供的是主机之间的逻辑通信,而传输层提供的是通信双方的进程之间的逻辑通信。传输层为应用屏蔽了底层复杂的网络通信逻辑,简单易用。

计算机网络之传输层

如上图所示,网络层提供主机之间的通信,传输层提供进程间的通信,有端口标志通信的目标进行。

差错检测:

网络层的检错检测只是对网络层的首部进行检验是否出差错,不检验数据部分。运输层需要对报文进行差错检测。

传输层主要协议:

传输层主要的协议分别:1、UDP协议;2、TCP协议。两个通信端之间传输数据的单位叫做:传输协议数据单元。在UDP中为:UDP用户数据包、在TCP中为TCP报文段。

1:UDP是无连接的通信协议,因此没有连接管理,在一些场景下非常高效,实时性要求高的场景下使用UDP协议,并且可以自行实现一些可靠传输逻辑实现可靠传输。UDP支持广播与多播。UDP特点如下:面向无连接的,尽最大努力交付,面向报文的,UDP没有拥塞控制,UDP支持一对一,一对多以及多多对的交互通信,UDP首部开销很小。虽然UDP没有拥塞控制,但是当很多主机向网络发送高速率的视频流时,网络就可能发送拥塞,导致大家都无法正常接收,因此不适用拥塞控制的UDP可能会发生严重的拥塞问题。UDP首部结构图:

计算机网络之传输层

 

2:TCP是面向连接的服务,在传输数据之前必须建立连接,通信完毕释放连接,TCP不提供广播与多播服务;由于TCP提供可靠的,面向连接的传输服务,因此需要增加许多开销,例如:确认、流量控制、计时器以及连接管理等。使用确认与重传机制就可以在不可靠的网络通道实现可靠传输。

备注:

当运输层采用的是TCP协议时候,尽管下面的网络是不可靠的,但是会尽最大努力交付,这种逻辑通信信道就是一条全双工的可靠信道。当传输层使用UDP时候,下面是一条不可靠的信道。

 

TCP可靠传输原理

TCP下面的网络所提供的传输是不可靠的,因此为了提供可靠传输就需要采取措施保证可靠传输。理想的传输条件两个:

1、传输信道不会产生差错;

2、不管发送方以多快的速度发送数据,接收方总是来得及接受并处理数据。

但是实际上,网络无法满足理想的传输条件,因此就需要使用可靠传输协议:当接收方遇见差错数据时,让发送方重新发送这些出错的数据;同时当接收方无法及时处理发送方发送数据时候,及时告诉发送方降低发送数据的速度。这样不可靠的信道就可以实现可靠传输了。

 

停止等待协议:

停止等待协议就是每发送一个分组就停止发送,等待对方确认。在等待收到对方的确认之后再发下一个数据包。

 

TCP传输数据时,无差错情况下存在如下两种情况,分别是确认正常收到与确认丢失,如下所示:

计算机网络之传输层

当接收到端发出去的确认丢失时候,发送端的计时器会启动超时重传,再一次发送该数据包。

 

TCP传输数据时,发送数据包出差错情况下存在如下两种情况,分别是接收到收到一个损坏的数据包,另一种是数据包丢失。两种处理情况分别如下:

当收到一个损坏的数据包时候,接收方会丢弃什么也不做,等待发送端超时重传。另一种情况就是数据包丢失,此时也是触发超时重传。

 

TCP传输数据时,确认数据包的迟到丢失,发送方的处理如下两种。

计算机网络之传输层

如果接收方的确认数据包丢失的话,客户端会触发超时重传机制,发送方再次发送该数据包,接收到重复接收到该数据包直接丢弃,并再次发送该数据包的确认。如果接收到接收到数据之后发送的确认迟到了,此时客户端会触发超时重传,并且接收方再次发送报文,接收方发现重复丢失,直接丢失并且向发送方发送确认。当发送端接收到迟到的确认之后,会直接丢失什么也不做。过程如上图所示。

 

停止等待协议需要注意如下三点:

a:发送方发送一个分组之后必须保留已经发送的分组,在超时重传时候使用,当收到确认时候可以丢失该数据包。

b:分组与确认分组进行编号,这样才能明确发送的数据包与确认数据包的对应关系。

c:发送端超时重传的时间设置,通常应该比分组传输的平均往返时间设置更长一些。设置的时间过长的话,通信的效率就会很低,但是如果设置的时间过短的话,就会导致大量的不必要的重传。超时重传的时间设置还需要结合当时网络的拥塞程度设置。

 

但是停止等待协议也存在缺点:就是信道利用率太低,如下图所示:

计算机网络之传输层

为了提高信道利用率,发送方可以不适用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方连续发送多个分组,不必没法玩一个分组就停止等待确认。这样就可以保证信道上一直有数据在传送。显然这种方式可以提高信道的利用率。

计算机网络之传输层

当使用流水线传输时,就需要使用下面的连续ARQ协议与滑动窗口协议。

连续ARQ(Automatic Repeat reQuest)协议:指发送方维持着一个一定大小的发送窗口,位于发送窗口内的所有分组都可连续发送出去,而中途不需要等待对方的确认。这样信道的利用率就提高了。而发送方每收到一个确认就把发送窗口向前滑动一个分组的位置。

计算机网络之传输层

连续ARQ协议规定,发送方没接受到一个确认,就会把发送窗口向前滑动一个分组的位置。接收方一般采用积累确认的方式,也就是说接收方不必对接收到的分组逐个发送确认,对于按序到达的最后一个分组发送确认即可(注意:按序到达的分组的最后一个)。这就表示之前的所有的分组都已经正确收到。这样也存在问题:例如发送方报送的数据包序号分别是:1,2,3,4,5;但是接收到接收到了:1,2,4,5;此时接收端只能对1,2发送确认(实际是对2发送确认,表示2之前的数据包都已经正确接收到),这个就叫做:Go-Back-N问题。表示需要回退重发已经发过的N个分组,可见,当网络环境比较差的时候,自动ARQ会带来负面影响。

而滑动窗口协议比较复杂,是TCP协议精髓所在。

 

超时重传时间的选择

上面已经提过,当在指定的时间没有收到数据包的确认时候就需要触发超时重传以达到可靠传输,但是超时重传的时间选择是一个复杂的问题。TCP采用一种自适应算法,它记录一个报文段的发出时间,以及收到的确认时间,这两个时间差则是报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间RTTs(又叫做平滑的往返时间)。

 

TCP的流量控制

一般来说,我们都希望数据传输的快一些,但是如果发送方发送的过快,接收方就可能来不及接收,这就造成数据的丢失。所谓的流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。

当发送方向接收方发送数据时候,在建立连接时候接收方会告诉发送方:“接收方当前的接收窗口大小,即rwnd大小”,因此发送方的发送窗口就不能超过接收方的rwnd大小。此处注意:TCP的窗口单位是字节,不是报文段。在协商rwnd时候容易发送死锁,因此需要考虑处理情况,具体如下:发送方项接收方发送报文一段时间之后,接受方回馈的rwnd大小为0,此时发送方的发送窗口大小则需要调整为0;随着接收方数据的处理,有了接受的空间,接收方调整rwnd不为0之后,此时接收方需要通知发送方调整发送窗口并且发送数据,但是由于通知rwnd不为0的数据包丢失了,此时就会陷入死锁,即:接收方等待发送方的rwnd不为0的数据包,而接收方等待发送方发送数据。为了解决这个问题需要如下方案:

为了解决rwnd=0选入死锁问题,TCP为发送方设置一个持续计时器,只要发送方接收到rwnd=0时候,就启动该计时器,每当计时器超时的时候便会发送一个探测报文段,而接收方接收到这个探测报文段时候就会将自己当前的rwnd发送给发送方,这样就可以打破死锁的僵局了。

 

如何提高TCP的传输效率

如何控制TCP发送报文段的时机决定了TCP的传输效率问题,其实就是TCP何时将缓存区的数据发送出去,TCP传输效率解决方案:

1、最大报文段长度;

2、应用进程指明发送,即TCP支持推送的方式,PUSH方式;

3、设置一个计时器,当计时器到期则发送出去。

在TCP实现中广泛使用的算法是Nagle,算法过程如下:

发送方把应用进程发送的数据逐个字节地发送到TCP缓冲区,则发送方先将第一个字节发送出去,然后把后面到达的字节缓存起来。当发送方收到对一个数据包的确认之后,再将缓冲区中的所有数据组装成一个报文段发送出去,同事继续缓存进程传来的数据。这种情况只有收到前一个报文段的确认才发送下一个报文段,这对于网络比较慢时,明显可以减少网络带宽的使用,因此Nagle算法还规定:当到达的数据到达发送窗口的一半或者达到报文段的最大长度时,就立即报送出去,这样可以提高网络的吞吐率。

 

TCP拥塞控制(注意与流量控制的区别:流量控制是接收方来不及处理发送方的数据,流量控制是端与端的通信量控制;而拥塞控制是避免大量报文段涌入网络中,导致网络中的路由器或者链路过载)。

如何判断出现了网络拥塞:

随着网络负载的增大,网络的吞吐率越来越低,这就是出现了网络拥塞。

计算机网络之传输层

TCP拥塞控制的一般原理:

在计算机网络中的链路容量(即带宽)、交换节点中的缓存以及处理机等都是网络的资源。在某段时间,若对网络中某一资源的需要超过该资源所能提供的可用部分,网络的性能就要变坏。这种情况就是拥塞;网络拥塞的条件关系如下:

计算机网络之传输层

网络中许多资源同时呈现不足的时候,网络的性能会明显变坏,整个网络的性能会随着输入符合增大而下降。而所谓的网络拥塞控制就是防止过多的数据注入到网络中,这样可以避免网络中的路由器或者链路不至于过载。

TCP拥塞控制方法:1、慢开始;2、拥塞避免;3、快重传;4、快恢复。

 

(1)慢开始

下面讨论的拥塞控制也是基于窗口的拥塞控制,为此,发送方位置一个叫做拥塞窗口cwnd(congestion window)。拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化,发送方让自己的发送窗口等于拥塞窗口。

发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便让更多分组发送出去,这样可以提高网络的利用率。但是网络出现拥塞的时候,就要将拥塞窗口减小一些,以减少数据注入网络中,减缓网络拥塞。

慢开始思路如下:

当主机发送数据时候,由于不知道网络的拥塞情况,如果立即将大量数据注入网络可能会引起网络拥塞;经验证明,最好的办法是先探测一下网络情况,即由小到到大逐渐增大发送窗口,也就是说由小到大逐渐增大拥塞窗口数值。

计算机网络之传输层

慢开始所谓的慢并不是增长速度慢,而是起步慢,最开始cwnd=1,然后逐渐增长。

 

拥塞避免算法思路:让拥塞窗口cwnd缓慢增大,之前慢开始是2倍增长,此时是每一次进行+1,按照加法增大。

开重传思路:让发送方尽可能早的知道个别报文的丢失;快重传思路主要是让接收方不要等待自己发送数据时候进行捎带确认,而是立即发送确认。例如对于报文段m2收到三次重复确认,则发送方可以确认接收方没有收到m3,则立即重传m3,这样不用等待超时重传了;这样可以提高网络吞吐率。

 

快恢复:当知道只是丢失个别报文,于是不启动慢开始,而是执行快恢复方法,此时发送方调整门限值为拥塞窗口值的一半。如下图4的位置就是丢失个别报文(因为受到3次确认)。

计算机网络之传输层

 

TCP的连接管理

TCP是面向连接的通信,因此通信之前需要进行连接的建立,通信完成之后释放连接。

TCP建立连接:

计算机网络之传输层

为什么连接需要三次握手,而不是两次呢?如果两次的话可能存在服务器占用大量连接资源无法得以释放。具体如下:

例如稀有两次连接的话,会发生如下情景:

A发起连接,B接收连接,向A发送一个确认,但是此时,确认丢失,A误以为连接失败。但是实际上此时A与B已经成功建立连接。此时由于A没有感知到连接建立成功,A会继续发起连接建立的请求,直至连接建立成功。如上过程中,那些没有收到建立连接的ACK的连接都无法得以释放,一直占用服务器资源。

 

连接的释放:

计算机网络之传输层

 

Http权威指南中TCP学习笔记:

https://github.com/javartisan/javartisan-resources/blob/master/ht.pptx

 

参考:计算机网络(第七版)谢希仁、 Http权威指南  David Gourley