(5.1.5)计算机网络基础之运输层

根据TCP/IP协议的分层结构,网络层之上是传输层,从层次结构上来看,传输层位于网络的最高层和应用的最底层。传输层的主要作用有两个:一个是居于网络层与应用层之间提供 复用和分用 的服务;另一个则是需要的时候为应用层提供 可靠的传输服务 。复用和分用指的是传输层负责实现端到端的传输,即计算机进程之间的通信;而网络层则负责点到点的传输,最重要的功能是路由寻址。

     网络通信的“用户”准确地说是位于网络节点计算机中的应用进程,我们使用端口号来区分不同的进程。传输层协议提供了一个16位的端口号,范围最大到65535。这些端口号一共分为两类:

FTPTElNetSMTPDNSHTTPSNMP  
2123255380161  

-1. 服务器端使用的端口号,最重要的一种约定俗成的端口号不允许私自使用或改变用途,数值为0-1023;另一类叫登记端口号,数值为1024-49151,这类端口号是为没有熟知端口号的应用程序使用的,使用前必须到IANA进行登记。总之0-49151不是我们可以随便使用的。

-2. 客户端使用的端口号:数值为49152-65535,这类端口由客户端进程运行时动态选择,通信结束后释放该端口号,因此称之为短暂端口号,这部分是我们自己编写APP时可以使用的。


一、用户数据报协议UDP

     传输层一种只有两个重要的协议:TCP与UDP,其中TCP是面向连接的、可靠的数据流服务,机制相对负责,里面涉及可靠传输、流量控制和拥塞控制等,我们稍后再讨论,这里我们先来看看“轻量级”的UDP协议。
     UDP协议,即用户数据报协议是在IP的数据报服务之上增加了很少的一点功能,这就是复用/分用和简单的差错控制。UDP的主要特点是:
-1. 无连接:发送数据之前不需要建立连接,因此减少了开销和发送数据的延迟;
-2. 尽最大努力交付:不保证可靠交付,因此数据传输过程中不需要维护复杂的连接状态;
-3. 面向报文的:发送方的UDP对应用层传递下的数据直接封装成UDP报文后交给IP层,既不合并,也不拆分,而是原样保留后交给IP层。UDP一次交付一个完整的报文,不会考虑数据的大小,但是为了避免在IP层出现分片,应用层必须考虑合适的数据大小。

-4. UDP可以实现N:M的通信(因为无连接);
-6. UDP没有拥塞控制;
     尽管UDP是不可靠的连接,现实中也有一些服务会需要UDP,比如IP电话、视频网站等要求速度而不太注重数据完整性的服务,对于实时性要求很高,却允许丢失少量的分组,特别适合UDP的低开销的服务。一般的TCP/UDP应用服务如下:

     UDP的头部只有8个字节,首先有2个字节的源端口和2个字节的目的端口,然后是2个字节的UDP长度,最后是2个字节的校验和:

二、TCP概述

     TCP作为一个可靠的连接协议最大的特点就是面向连接的,即在发送数据之间要建立连接,数据传输过程中要维护连接,数据发送完毕之后要释放连接。在此基础上TCP提供可靠的传输:
-1. 可靠交付:TCP传递的数据无差错、无丢失、无重复、且按序到达;
-2. 全双工通信:TCP通信的每一段都维护着一个发送缓存和接收缓存;
-3. 面向字节流:TCP协议把上层交付的应用层数据单纯地看成是一系列无结构的字节流;
     TCP连接的端点不是主机中的应用进程,而是应用进程维护的套接字接口(socket),其基本的结构包含【IP:Port】;



三、TCP可靠传输的工作原理

     TCP实现可靠传输的工作原理主要有两个,我们分别来看:
-1. 停止等待协议
     这个协议说白了就是对于收到数据包后的确认机制,基本过程如下:
*1. 发送方A向接收方B发送数据分组M1;
*2. 接收方B收到分组M1后想A发送M1的确认;
*3. A接收到B发送的对于M1后的确认之后再发送分组M2;
*4. 若中间的某一个分组丢失或是延迟,则A就会使用超时计时器进行超时重传,每个分组发送时都会保留其副本并且设置超时计时器;
     这里对于超时重传机制需要三点说明:
**1. A发送自己的每个分组,必须暂时保存已发送分组的一个副本,直到收到该副本的确认;
**2. 分组和确认分组都必须编号,这样才能对分组进行区分;
**3. 超时计时器设置的时间应当比数据在分组传输的平均往返时间更长一些;
     上面的机制保证了在不可靠的信道上时间可靠的传输,这种机制称为自动重传请求(ARQ),即重传的请求是自动的,不需要接收方向发送方请求重传某个分组。下面的几个图来说明超时重传的机制:


-2. 连续ARQ协议
     停止等待协议的优点是简单,缺点是信道利用率太低。为此我们引入了连续ARQ协议和滑动窗口协议。滑动窗口协议是TCP协议的精髓所在,这里先来介绍基本的连续ARQ协议。
*1. 发送方维持的发送窗口中可以连续发送多个分组;
*2. 接收方采用累积确认的方式,即确认N则表示N之前的包都已经正确收到;
*3. 每成功确认M个分组,发送窗口便“滑动”M个分组;


四、TCP报文段的首部格式

     TCP的功能都在其首部的定义中得到体现:

TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。

五、滑动窗口协议

     关于这部分自己不晓得怎么叙述才好,因为理解的部分更多,下面就用自己的理解来介绍下TCP的精髓:滑动窗口协议。
     所谓滑动窗口协议,自己理解有两点:1. “窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围称之为“窗口”;2. “滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,方式就是按顺序“滑动”。在引入一个例子来说这个协议之前,我觉得很有必要先了解以下前提:
-1. TCP协议的两端分别为发送者A和接收者B,由于是全双工协议,因此A和B应该分别维护着一个独立的发送缓冲区和接收缓冲区,由于对等性(A发B收和B发A收),我们以A发送B接收的情况作为例子;
-2. 发送窗口是发送缓存中的一部分,是可以被TCP协议发送的那部分,其实应用层需要发送的所有数据都被放进了发送者的发送缓冲区;
-3. 发送窗口中相关的有四个概念:已发送并收到确认的数据(不再发送窗口和发送缓冲区之内)、已发送但未收到确认的数据(位于发送窗口之中)、允许发送但尚未发送的数据以及发送窗口外发送缓冲区内暂时不允许发送的数据;
-4. 每次成功发送数据之后,发送窗口就会在发送缓冲区中按顺序移动,将新的数据包含到窗口中准备发送;
     TCP建立连接的初始,B会告诉A自己的接收窗口大小,比如为‘20’:
     字节31-50为发送窗口

     A发送11个字节后,发送窗口位置不变,B接收到了乱序的数据分组:

     只有当A成功发送了数据,即发送的数据得到了B的确认之后,才会移动滑动窗口离开已发送的数据;同时B则确认连续的数据分组,对于乱序的分组则先接收下来,避免网络重复传递:


六、流量控制

     流量控制方面主要有两个要点需要掌握。一是TCP利用滑动窗口实现流量控制的机制;二是如何考虑流量控制中的传输效率。
1. 流量控制
     所谓流量控制,主要是接收方传递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要的方式就是返回的ACK中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送:

     这里面涉及到一种情况,如果B已经告诉A自己的缓冲区已满,于是A停止发送数据;等待一段时间后,B的缓冲区出现了富余,于是给A发送报文告诉A我的rwnd大小为400,但是这个报文不幸丢失了,于是就出现A等待B的通知||B等待A发送数据的死锁状态。为了处理这种问题,TCP引入了持续计时器(Persistence timer),当A收到对方的零窗口通知时,就启用该计时器,时间到则发送一个1字节的探测报文,对方会在此时回应自身的接收窗口大小,如果结果仍未0,则重设持续计时器,继续等待。
2. 传递效率
     一个显而易见的问题是:单个发送字节单个确认,和窗口有一个空余即通知发送方发送一个字节,无疑增加了网络中的许多不必要的报文(请想想为了一个字节数据而添加的40字节头部吧!),所以我们的原则是尽可能一次多发送几个字节,或者窗口空余较多的时候通知发送方一次发送多个字节。对于前者我们广泛使用Nagle算法,即:
*1. 若发送应用进程要把发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面的字节先缓存起来;
*2. 当发送方收到第一个字节的确认后(也得到了网络情况和对方的接收窗口大小),再把缓冲区的剩余字节组成合适大小的报文发送出去;
*3. 当到达的数据已达到发送窗口大小的一半或以达到报文段的最大长度时,就立即发送一个报文段;
     对于后者我们往往的做法是让接收方等待一段时间,或者接收方获得足够的空间容纳一个报文段或者等到接受缓存有一半空闲的时候,再通知发送方发送数据。

七、拥塞控制

     网络中的链路容量和交换结点中的缓存和处理机都有着工作的极限,当网络的需求超过它们的工作极限时,就出现了拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。常用的方法就是:
1. 慢开始、拥塞控制
2. 快重传、快恢复
     一切的基础还是慢开始,这种方法的思路是这样的:
-1. 发送方维持一个叫做“拥塞窗口”的变量,该变量和接收端口共同决定了发送者的发送窗口;
-2. 当主机开始发送数据时,避免一下子将大量字节注入到网络,造成或者增加拥塞,选择发送一个1字节的试探报文;
-3. 当收到第一个字节的数据的确认后,就发送2个字节的报文;
-4. 若再次收到2个字节的确认,则发送4个字节,依次递增2的指数级;
-5. 最后会达到一个提前预设的“慢开始门限”,比如24,即一次发送了24个分组,此时遵循下面的条件判定:
*1. cwnd < ssthresh, 继续使用慢开始算法;
*2. cwnd > ssthresh,停止使用慢开始算法,改用拥塞避免算法;
*3. cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法;
-6. 所谓拥塞避免算法就是:每经过一个往返时间RTT就把发送方的拥塞窗口+1,即让拥塞窗口缓慢地增大,按照线性规律增长;
-7. 当出现网络拥塞,比如丢包时,将慢开始门限设为原先的一半,然后将cwnd设为1,执行慢开始算法(较低的起点,指数级增长);

     上述方法的目的是在拥塞发生时循序减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。慢开始和拥塞控制算法常常作为一个整体使用,而快重传和快恢复则是为了减少因为拥塞导致的数据包丢失带来的重传时间,从而避免传递无用的数据到网络。快重传的机制是:
-1. 接收方建立这样的机制,如果一个包丢失,则对后续的包继续发送针对该包的重传请求;
-2. 一旦发送方接收到三个一样的确认,就知道该包之后出现了错误,立刻重传该包;
-3. 此时发送方开始执行“快恢复”算法:
*1. 慢开始门限减半;
*2. cwnd设为慢开始门限减半后的数值;
*3. 执行拥塞避免算法(高起点,线性增长);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值