我是一只欧祖宇|

yuzujr

园龄:7个月粉丝:0关注:1

《计算机网络》笔记——第五章 运输层

第5章 运输层

概述

为什么需要运输层?

  1. 两台主机进行通信就是两台主机中的应用进程互相通信.
  2. 通信的真正端点并不是主机而是主机中的进程.
  3. 端到端的通信是应用进程之间的通信.

运输层的两个主要协议

  1. 用户数据报协议UDP(User Datagram Protocol)
  2. 传输控制协议TCP(Transmission Control Protocol)

UDP不需要先建立连接.

TCP则提供面向连接的服务.

端口

协议端口号(protocol port number),简称端口(port).

  • 服务器端使用的端口号

    • 熟知端口号(well-known port number)系统端口号,数值为0~1023.用于最重要的一些应用程序.
    • 登记端口号,数值为1024~49151.
  • 客户端使用的端口号,数值为49152~65535.动态选择,又称为短暂端口号

用户数据报协议UDP

  1. 无连接的
  2. 尽最大努力交付
  3. 面向报文的.UDP对应用层交下来的报文,既不合并,也不拆分
  4. 没有堵塞控制.网络出现的堵塞不会使源主机的发送速率降低.
  5. 支持一对一、一对多、多对一和多对多的交互通信.
  6. 首部开销小.仅有8字节.

UDP的首部格式

如果接收方发现收到的报文中的目的端口号不正确,就丢弃该报文,并由网际控制报文协议ICMP发送"端口不可达"差错报文给发送方.

上一章中介绍的traceroute工具就是利用非法的UDP端口使接收方返回一个差错报文,从而达到测试的目的.

图中的伪首部是用来计算检验和的.

加上伪首部的目的是,检查IP数据报的源IP地址和目的地址.

UDP的检验和是把首部和数据部分一起检验,而IP数据报只检验它的首部.

若数据部分不是偶数个字节,要填充一个全零字节(不发送).

传输控制协议TCP

  1. TCP是面向连接的运输层协议.
  2. 每一条TCP连接只能有两个端点(endpoint)
  3. TCP提供可靠交付的服务.通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达.
  4. TCP提供全双工通信.TCP连接的两端都设有发送缓存和接收缓存.
  5. 面向字节流.TCP不关心数据的实际意义,也就是说接收者收到的数据块可能与发送时的大小并不相同(但总体大小不会变).

TCP的连接

TCP连接的端点叫作套接字(socket)插口.

定义:端口号拼接到(concatenated with)IP地址即构成了套接字.

$套接字socket=(IP:port)$

原来这就是套接字😧

每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定.

$TCP连接::={socket_1,socket_2}={(IP_1:port_1),(IP_2:port_2)}$

可靠传输的工作原理

停止等待协议

上述的这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest).

信道利用率

$信道利用率U=\frac{T_D}{T_D+RTT+T_A}$

停止等待协议的信道利用率是极低的.

要实现这种流水线传输,就要使用连续ARQ协议滑动窗口协议.

连续ARQ协议

接收方一般采用累积确认,收到几个分组后,对按序到达的最后一个分组发送确认.

优点:容易实现,即使确认丢失也不必重传.

缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息.

TCP报文段的首部格式

  • 序号:字节流中的每一个字节都按顺序编号,此字段值为本报文段所发送的数据的第一个字节的序号.也叫作"报文段序号".
  • 确认号:期望收到对方下一个报文段的第一个数据字节的序号.
  • 数据偏移:TCP报文段的数据起始处距离TCP报文段的起始处有多远.实际就是TCP报文段的首部长度."数据偏移"的单位是4字节,所以TCP首部的最大长度是60字节.
  • 保留:保留为今后使用,置0.
  • 6个控制位.
    • 紧急URG(URGent) 表明紧急指针字段有效.插队到本报文段数据的最前面.
    • 确认ACK(ACKnowledgment) 表明确认号字段有效.TCP规定连接建立后所有传送的报文段都必须把ACK置1.
    • 推送PSH(PuSH) 表明发送方希望尽快得到响应.接收方TCP不再等到缓存填满再向上交付.
    • 复位RST(ReSeT) 表明TCP连接中出现严重差错,必须释放连接,再重新建立运输连接.
    • 同步SYN(SYNchronization) 在连接建立时用来同步序号.SYN=1且ACK为0时,说明这是一个连接请求报文段.对方若同意连接,则响应的连接接受报文中SYN=1且ACK=1.
    • 终止FIN(FINis) 用来释放一个连接.
  • 窗口:窗口值作为接收方让发送方设置其发送窗口的依据.明确指出了现在允许对方发送的数据量.窗口值经常在动态变化着.
  • 检验和:和UDP的检验和类似,也要加上12字节的伪首部一起计算.
  • 紧急指针:指出本报文段中的紧急数据的字节数,即使窗口为0时也可发送紧急数据.
  • 选项:长度可变,最长40字节.
    • 最大报文段长度MSS(Maximum Segment Size).是每一个TCP报文段中的数据字段的最大长度.默认值为536字节长.
    • 窗口扩大.用于传播时延大,带宽大的信道.
    • 时间戳.
      • 计算往返时间RTT
      • 防止序号绕回PAWS(Protect Against Wrapped Sequence numbers).处理TCP序号超过$2^{32}$的情况.

TCP可靠传输的实现

滑动窗口

超时重传时间(RTO)的选择

超时重传时间RTO(RetransmissionTime-Out).

修正的Karn算法:

  1. 若报文段没有重传:

    计算平滑往返时间$RTT_S$公式:

    $新RTT_S=(1-\alpha)\times(旧RTT_S)+\alpha\times(新RTT样本)$

    $\alpha$推荐值为1/8,即0.125.

    计算RTT的偏差的加权平均值$RTT_D$公式:

    $新RTT_D=(1-\beta)\times(旧RTT_D)+\beta\times\vert RTT_S-新RTT样本\vert$

    $\beta$的推荐值为1/4,即0.25.

    计算超时重传时间RTO公式:

    $RTO=RTT_S+4\times RTT_D$

  2. 若报文段重传了:

    报文段每重传一次,就把RTO增大一些.典型的做法是取2倍.当不再发生报文段重传时,才根据上面给出的公式计算RTO.

选择确认SACK

选择确认(Selective ACK)

一种只传送缺少的数据而不重传已经正确到达接收方的数据的方法.

建立TCP连接时需要启用SACK选项.

因为选项长度最大为40字节,所以最多指明4个字节块的边界信息.

4个字节块有8个边界,占用32字节,还需要两个字节,一个用来指明是SACK选项,另一个指明这个选项占用多少字节.

TCP的流量控制

利用滑动窗口实现流量控制

如果接收方发送零窗口报文段后,又发送了非零窗口报文段,但是这个报文段丢失了,发送方将继续等待非零窗口报文段,接收方也会等待发送方的数据报文段.导致死锁.

解决方法:

在每个连接设置一个持续计时器(persistence timer),只要一方收到零窗口通知,就启动计时器.到时后就发送一个"零窗口探测报文段",对方必须回应,直到窗口不再为0为止.

[!NOTE]

TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段.

TCP的传输效率

发送方逐字节发送问题:

每发送一个字节,就要为首部的大小付出很大的代价.

所以经尝使用Nagle算法:

发送第一个字节,然后缓存之后的字节,等收到第一个字节的确认后,再把缓存中的所有数据组装为一个报文段发送出去,然后继续等待前一个报文段的确认,如此往复.

适用于数据到达较快而网络速率较慢的情况.

糊涂窗口综合征(silly window syndrome):

假设TCP接收方的缓存已满,但是接收方进程每次只读取一个字节,这样只能腾出一个字节的空间,发送方也只能发送一个字节,如此循环会降低网络效率.

解决方法是:让接收方等待一段时间,等接收缓存已有一半空闲的空间再发送确认报文.

其实这两个问题是相似的.

一个是发送进程发送太慢,缓存区每次只能发送很少的字节.

另一个则是接收进程接收太慢,缓冲区空闲空间不足.

一旦理解了问题的关键,解决办法也就不难了.

TCP的拥塞控制

拥塞(congestion).

TCP的拥塞控制方法

发送方维持一个叫作拥塞窗口cwnd(congestion window)的状态变量.

发送方让自己的发送窗口等于拥塞窗口.

判断网络拥塞的依据就是出现了超时.

算法有四种:

  • 慢开始(slow-start).
  • 拥塞避免(congestion avoidance).
  • 快重传(fast retransmit).
  • 快恢复(fast recovery).

慢开始算法的思路:

由小到大逐渐增大发送窗口.

一般把初始阻塞窗口cwnd设置为不超过2至4个发送方的最大报文段SMSS(Sender Maximum Segment Size)的数值.

每收到一个对新的报文段的确认后,可以把阻塞窗口增加最多一个SMSS的数值.

$阻塞窗口cwnd每次的增加量=\min(N,SMSS)$

其中N是新确认的字节数.

慢开始算法会使cwnd加倍增长.

为了防止cwnd增长过大引起网络阻塞,还需要依据慢开始门限ssthresh状态变量.

  • cwnd < ssthresh时,使用慢开始
  • cwnd > ssthresh时,使用拥塞避免算法.
  • cwnd = ssthresh时,都可以使用

拥塞避免的思路:

每经过一个往返时间RTT就把cwnd加1.

拥塞避免算法会让cwnd线性增长.

快重传算法:

接收方必须立即发送确认,当发送方收到3个重复的确认时,就认为下一个报文段已经丢失,就立即进行重传.

快恢复算法:

调整门限值ssthresh=cwnd/2

cwnd=ssthresh.

开始执行拥塞避免算法.

对点4的解释可以参考下图.

点4中发送方接收到了3个重复的确认,因此根据快重传算法,发送方将立即重传丢失的报文段.

因为只是丢失了部分报文段,不使用慢开始而是使用快恢复算法.

如果将本节讨论的拥塞控制流量控制一起考虑,那么

$发送方窗口的上限值=\min(rwnd,cwnd)$

其中rwnd是接收方窗口,由流量控制决定.

cwnd是拥塞窗口,由拥塞控制决定.

主动队列管理AQM

AQM(Active Queue Management).

没有AQM的路由器在队列满时会不得不丢弃后来的所有报文.

这样会同时影响很多条TCP连接,使许多TCP连接在同一时间进入慢开始状态,这称为全局同步(global syncronization).

AQM就是提前主动丢弃到达的分组,提醒发送方放慢速率.

一种流行的实现是随机早期检测RED(Random Early Detection).

但因为现在已经不再使用,这里就不记了.

TCP的运输连接管理

所谓运输连接的管理就是使运输连接的建立和释放都能正常地进行.

TCP连接的建立采用客户服务器方式.

主动发起连接建立的应用进程叫作客户(client).

被动等待连接建立的应用进程叫作服务器(server).

TCP的连接建立

三报文握手:

TCP的连接释放

四报文握手:

TCP还设有一个保活计时器(keepalive timer).

若两小时没有收到客户的数据,就每隔75秒发送一个探测报文段.若发送10个后仍未收到客户的响应,服务器就认为客户端出现故障,关闭连接.

TCP的有限状态机

本文作者:yuzujr

本文链接:https://www.cnblogs.com/yuzujr/p/18697009

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   yuzujr  阅读(12)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起