计算机网络(谢希仁版)--运输层

运输层概述:

  网络层是为主机之间提供逻辑通信,而运输层是为应用进程之间提供端到端的逻辑通信。

  网络层只对IP数据报的首部进行检验,而运输层对协议的首部和数据部分都进行检验。

  运输层有两种不同的运输协议:一对一的可靠的面向连接的TCP和不可靠的无连接的UDP,两者对应的数据单元分别是TCP报文段和UDP用户数据报。

  运输层是通过端口号,复用和分用网络层(IP层)的,该端口不是操作系统的进程标识符,而是应用层的各种协议进程与运输实体进行层间交互的一种地址。

  运输层的端口号是16位的,分为服务器端使用的端口号和客户端使用的端口号;

  服务器端使用的端口号又分为熟知端口号(所有用户都知道),比如HTTP的端口号为80,还有一种叫登记端口号(顾名思义);

  客户端使用的端口号又称短暂端口号,只在客户进程运行时才动态选择,用于服务器端回发数据给客户端,通信结束就不复存在。

 

用户数据报协议UDP:

  UDP是无连接的,使用尽最大努力交付,以及面向报文的;应用层交给UDP多长的报文,UDP就照样发送,同时加上UDP首部,因此,应用层交付的报文长度要控制好,不能太长也不能太短,否则都会降低IP层的效率。

  UDP的首部由源端口、目的端口、长度、检验和组成;UDP检验和计算的时候要加上伪首部,伪首部由源IP地址、目的IP地址、运输层协议号(17、6)和UDP长度组成。

 

传输控制协议TCP:

  TCP是面向连接的,一对一的,可靠交付的,提供全双工通信,面向字节流的;同时应用层无需关注交付的报文长度,因为,报文长度由窗口值、拥塞程度等决定。

  TCP连接的端点叫做套接字,即IP地址:端口号。

  

  可靠传输的工作原理:

    停止等待协议、超时重传(超时计时器)、确认丢失操作和确认迟到操作,这些合起来叫做自动重传请求ARQ,使得在不可靠的传输网络上实现可靠的通信。

    但是这样会导致信道利用率很低,于是产生了连续ARQ协议和滑动窗口协议,发送方是无需确认的连续发送窗口中的所有字节,接收方采用累积确认,即对按序到达的最后一个分组发送确认(注意确认分组之后的分组的接收情况,发送方无从得知,只能一律重发,这叫Go-back-N,但也有一定的方法解决)。

  

  TCP报文段的首部格式(前20个字节是固定的,后面都是可选的,总长最多60个字节):

    固定部分包括:

      源端口、目的端口、

      序号(32位):TCP传送的字节流中的每一个字节都按顺序编号,序号字段是指本报文段所发送数据的第一个字节的序号

      确认号(32位):接收方发送的期望收到对方下一个报文段的第一个数据字节的序号,若确认号为N,则到序号N-1为止的所有数据都已正确收到

      数据偏移:即首部总长度

      紧急URG:置1即放到本报文段数据的最前面

      确认ACK:仅当ACK=1时,确认号字段才有效,连接建立之后所有的报文的ACK必须为1

      推送PSH、复位RST、同步SYN、终止FIN

      窗口(2字节):指的是发送本报文段的一方的接收窗口,窗口值作为接收方让发送方设置其发送窗口的依据 

      检验和、紧急指针、以及拓展选项:

        其中较重要的是最大报文长度MSS,指的是数据字段的最大长度,在建立连接的过程中,双方就将把自己支持的MSS写入这一字段,双方值可以不一样,如果没有填写,则默认为536字节长

        窗口扩大(顾名思义)

        时间戳:计算报文段的往返时间RTT和防止序号绕回

        选择确认:用来报告收到的不连续的字节块的边界,最多报告4个字节块,一定程度上解决Go-back-N问题

 

  TCP可靠传输的实现:

    核心:以字节为单位的滑动窗口

    注意:发送缓存包含发送窗口,发送窗口不仅取决于对方的接收窗口,还会根据拥塞程度适当减小发送窗口,接收窗口由接收缓存的大小决定。

       接收方必须有累计确认的功能,同时确认推迟的时间不应超过0.5s

    超时重传时间选择:Karn算法:在计算加权平均RTT时,只要报文重传了,就不采用其时间样本。实际上,报文重传一次,超时重传时间就增大一倍,较为合理。

 

  TCP的流量控制:

    利用滑动窗口机制中的序号、确认号、窗口号实现流量控制;

    必须考虑传输效率:

      可以用不同的机制来控制TCP报文段的发送时机

        1. TCP维持一个变量,等于MSS,只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去;

        2. 由发送方的应用进程指明要求发送报文段,即TCP支持的推送(PSH)操作;

        3. 发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过MSS),发送出去。

      在TCP中广泛使用的是Nagle算法:即边缓存边发送报文段,即第一次发送一个字节,之后每次收到接收方的确认后,就组装所有的缓存数据成报文段(但长度不能超过MSS)并发送出去;同时该算法还规定,当缓存中的数据已到达发送窗口大小的一半或已到达MSS时,就立即发送一个报文段。

      遇到糊涂窗口综合症(即应用程序每次只从接收缓存中读取1个字节)时,可以让接收方等到接收缓存中有MSS长度或一半空闲空间后再发送确认信息。总之,发送方和接收方都不要太急,有一点点数据就发送数据报文或一点点空间就发送确认报文。

 

  TCP的拥塞控制:

    拥塞控制和流量控制的区别:

      拥塞控制是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载;拥塞控制都有一个前提,网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器以及与降低网络传输性能有关的所有参数。

      流量控制是指点对点通信流量的控制,是个端到端的问题(接收端控制发送端),流量控制是抑制发送端发送数据的速率,以便接收端来得及接收。

    拥塞控制的两个概念:输入负载(网络负载)即单位时间内输入给网络的分组数目,吞吐量即单位时间内从网络中输出的分组数目。所谓拥塞,就是在吞吐量达到饱和之前,就出现输入负载小于吞吐量的情况,此时就需要拥塞控制。

    常见的拥塞控制方法:

      拥塞控制中发送方维持一个拥塞窗口(cwnd),和之前由接收窗口(rwnd)决定的窗口无关,两者取较小者作为最后的发送方窗口大小

      1. 慢开始算法(指数增长):从初始cnwd(一个MSS)开始,每经过一个传输轮次(发送窗口中的数据都发送出去,并且接收到最后数据的确认),拥塞窗口cnwd就加倍。(本质是每收到对一个对新报文的确认后(重传的不算在内),就把拥塞窗口增加一个MSS长度)

      2. 拥塞避免算法(线性增长):当慢开始算法运行到,cwnd等于白慢开始门限后,开始运行拥塞避免算法,即每经过一个传输轮次,拥塞窗口只增加一个MSS长度。(本质是每收到对一个对新报文的长度的确认后,就把拥塞窗口增加一个(MSS * MSS / cwnd)长度)

      如果出现网络拥塞,则将慢开始门限的大小减半,并重新开始运行慢开始算法。

      3. 快重传算法:收到失序的报文段后立即发出重复确认(之前最后一次有序报文段的确认),快重传规定发送方只要一连收到三个重复确认,就立即重传对方尚未收到的报文段。

      4. 快恢复算法:发送方只要一连收到三个重复确认,就将慢开始门限的大小减半,由于发送方认为网络可能没有发生拥塞(一连收到三个重复确认就说明了这点),就把cwnd设值为新的慢开始门限,并继续执行拥塞避免算法。

      在采用快恢复算法时,慢开始算法只在TCP连接时或网络超时时才使用。

      5. 随机早期检测RED:路由器机制,防止出现全局同步,许多TCP连接在同一时间突然都进入到慢开始状态。

 

  TCP的运输连接管理:

    运输连接有三个阶段:连接建立、数据传送和连接释放。

    连接建立是三次握手:

      接收方的TCP服务器进程先创建传输控制块TCB,准备接收客户进程的连接请求;

      发送方的TCP客户进程创建传输控制块TCB,然后向接收方发出连接请求报文段;

      接收方收到连接请求报文段后,如同意建立连接,则向发送方发出确认报文段;

      发送方收到确认报文段后,还要向接收方发出确认报文段,此时发送方已进入已连接状态;

      接收方收到后确认报文段后,也进入到已连接状态。

    出现第三次握手,是为了防止已失效的连接请求报文段滞留在网络的某处,在上一次TCP连接释放之后,接收方又接收到了该请求报文段,从而产生错误。

    连接释放是四次握手:

      发送方先发出连接释放报文段;

      接收方接收到连接释放报文段后,就向发送方发出确认报文段,这时接收方TCP服务器进程通知高层应用进程,发送方到接收方这个方向的连接就释放了,即发送方已不能传输数据到接收方了;

      发送方收到确认报文段后,就等待接收方发出连接释放报文段;

      接收方如没有数据传送,就发出连接释放报文段;

      发送方接收到连接释放报文段后,就向接收方发出确认报文段;

      此时,TCP连接还没有释放掉,发送方必须经过时间等待计时器设置的时间2MSL后,才进入结束状态,而接收方稍早一点,在接收到确认之后,就进入结束状态。

    发送方必须经过时间等待计时器设置的时间2MSL,是因为接收方最后一次可能没有接收到确认信号,则接收方会重传请求,而发送方接收到连接释放报文段后就结束,就会接收不到新的连接请求,接收方也就不能进入结束状态。

 

posted @ 2017-03-13 20:16  拉夫德尔  阅读(682)  评论(0编辑  收藏  举报