【计算机网络】第3章 运输层(下)

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: 【计算机网络】第3章 运输层

流水线协议

发送方允许发送多个、“传输中的”,还没有应答的报文段

它比较停等协议能增加利用率

滑动窗口协议

发送方和接收方都具有一定容量的缓冲区(即窗口),允许发送站连续发送多个分组而不需要等待应答


发送窗口:发送端允许连续发送的分组的序号表


接收窗口:接收方允许接收的分组的序号表


Go-Back_N

发送窗口尺寸为N;接收窗口尺寸为1;位于发送窗口内的分组才允许被发送,位于接收窗口内的分组才能被接收,关键是窗口如何滑动

重要特征:累计ACK(对正确接收的分组总是发送具有最高按序序号的ACK),全部重传

发送方FSM:

  • 发送窗口滑动的条件:收到1个确认分组
  • 超时重传时,重传所有未被确认的分组


接收端FSM:

  • 接收窗口滑动的条件:收到期望序号的分组
  • 累计ACK(n):表明已经正确收到序号n(包括n)以前的分组
  • 对失序分组的处理:丢弃,重发(已按序接收分组的)ACK

例子:

缺点:有不必要的重传问题

选择重传

发送窗口尺寸为N;接收窗口尺寸为N;


特征:独立ACK,重传单个分组

  • 独立ACK: 对每个分组使用单独的确认
  • 需N个定时器,若某个分组超时,则重传该分组
  • 接收窗口为N,对非按序到达的分组进行缓存

发送方:

  • 发送窗口滑动的条件:收到最低位置分组的确认
  • 超时重传时,仅重传超时的单个分组

接收方:

  • 接收窗口滑动的条件:收到最低位置的分组
  • 单独ACK
  • 对失序分组的处理:接收窗口内缓存,发对应ACK;接收窗口外丢弃

例子:




问题:当接受窗口太大,难以区分新分组和重传分组,因此窗口长度需要小于等于序号空间的一半


可靠传输的机制:

机制

用途和说明

检验和

用于检测在一个传输分组中的比特错误

定时器


用于检测超时/重传一个分组,可能因为该分组(或其ACK)在信道中丢失了。由于当一个分组被时延但未丢失(过早超时),或当一个分组已被接收方收到但从接收方到发送方的ACK丢失时,可能产生超时事件,所以接收方可能会收到一个分组的多个冗余拷贝

序号

用于为从发送方流向接收方的数据分组按顺序编号。所接收分组的序号间的空隙可使该接收方检测出丢失的分组。具有相同序号的分组可使接收方检测出一个分组的冗余拷贝

确认

接收方用于告诉发送方一个分组或一组分组已被正确地接收到了。确认报文通常携带着被确认的分组或多个分组的序号。确认可以是逐个的或累积的,这取决于协议

否定确认

接收方用于告诉发送方一个分组或一组分组已被正确地接收到了。确认报文通常携带着被确认的分组或多个分组的序号。确认可以是逐个的或累积的,这取决于协议

窗口、流水线

发送方也许被限制仅发送那些序号落在一个指定范围内的分组。通过允许一次发送多个分组但未被确认,发送方的利用率可在停等操作模式的基础上得到增加。我们很快将会看到,窗口长度可根据接收方接收和缓存报文的能力或网络中的拥塞程度,或两者情况来进行设置

3.5 面向连接的传输: TCP

  • 端到端:连接状态不为路由器所知,从发送方到接收方
  • 可靠有序,具有缓冲区
  • 面向连接,双向数据流
  • 能够流量和拥塞控制

报文段结构


TCP序号就是已经发送第一个字节序号,确认号就是期待对方发送的下一个字节序号


为什么不从0开始编号呢?


1.为了防止预测攻击

2.尽可能的避免数据混淆(如果cs断开后,会有可能某些数据仍然滞留在网络中。当cs再次连接,这些延迟数据在建立新连接之后才到达Server,如果都是从0开始会使得新连接与旧连接数据包重叠几率大大增加,造成数据混淆)


如何设置超时的时间?


理论上,超时的时间最好是一个RTT的值,但是取每次的RTT值是非常不好的,变化大,为了”较平滑“,取m平均最近的测量值,并不仅仅是当前SampleRTT

EstimatedRTT = (1- α )*EstimatedRTT + α*SampleRTT

α通常为1/8这样,RTT的预计值就出来了,但是超时的时间,最好有个容量,不能太大也不能太小,叫它安全余量

DevRTT = (1-β)*DevRTT + β|SampleRTT-EstimatedRTT|*

β通常为1/4,然后超时值就为

TimeoutInterval = EstimatedRTT + 4*DevRTT

###可靠数据传输

TCP在IP不可靠服务的基础上创建可靠数据传输服务


1.从应用层接收数据

创建报文段

启动计时器

2.超时

重传

重启计时器

3.收到确认(累计确认)

更新SendBase

如果还有没有传递的报文段,重新启动计时

NextSeqNum = InitialSeqNum
       SendBase = InitialSeqNum
        loop (forever) { 
           switch(event) 
           event: data received from application above 
                 create TCP segment with sequence number NextSeqNum 
                 if (timer currently not running)
                       start timer
                 pass segment to IP 
                 NextSeqNum = NextSeqNum + length(data) 
            event: timer timeout
                 retransmit not-yet-acknowledged segment with 
                         smallest sequence number  
                 start timer
            event: ACK received, with ACK field value of y 
                 if (y > SendBase) { /* 累计确认到y */
                      SendBase = y
                      if (there are currently not-yet-acknowledged segments)
                          start timer 
                      } 
         }  /* end of loop forever */ 

由于重传的情况很多,重传的话时间间隔长,所以出现了快速重传(在定时器超时之前重传)的算法,这也是TCP实现可靠数据传输有特点的地方

通过冗余ACK,检测丢失的报文段,然后重传

//事件: 收到ACK, ACK 域的值为 y 
    if (y > SendBase) { 
        SendBase = y
            if (当前还有没有确认的报文段)
                启动定时器 
            } 
  else { 
    值为 y的重复确认的次数加1
        if (值为 y的重复确认的计数= 3) {
            重传序号位y的报文段 
        }

###流量控制


流量控制:发送方不能发送太多、太快的数据让接收方缓冲区溢出


工作原理:


接收方在报文段接收窗口字段中通告其接收缓冲区的剩余空间,发送方要限制未确认的数据不超过RcvWindow

发送方:LastByteSent-LastByteAcked <或= RcvWindow

接收方:RcvWindow = RcvBuffer-[LastByteRcvd - LastByteRead]

LastByteSent:最后一个发送的字节编号;LastByteAcked:最后一个被确认的字节编号,它们相减就是已经发送还未被确认的数据量


###连接管理


TCP是面向连接的协议,TCP连接的建立和释放是每次TCP传输中必不可少的过程,三个过程


连接建立(三次握手)


SYN :同步序列编号(Synchronize Sequence Numbers)

SEQ : 序列号(Sequence Number)

ACK :确认编号(Acknowledgement Number)

过程:


1.客户机向服务器发送 TCP SYN报文段


指定初始序号


没有数据


2.服务器收到SYN报文段, 用SYNACK报文段回复


服务器为该连接分配缓冲区和变量

指定服务器初始序号

3.: 客户机接收到 SYN,ACK, 用ACK报文段回复,可能包含数据

数据传输

没啥好讲的,建立连接后就是数据传输

连接释放(四次挥手)

  1. 1.户机向服务器发送TCP FIN控制报文段
  2. 2.服务器收到FIN,用ACK回答。关闭连接,发送FIN
  3. 3.客户机收到FIN, 用ACK答 ,进入 “超时等待” – 将对接收到的FIN进行确认
  4. 4,服务器接收ACK,连接关闭


  1. 总结:TCP连接的客户端生命周期


TCP连接服务器生命周期:


3.6 拥塞控制的原理

当大量的分组进入网络,超出了网络的处理能力时,会引起网络局部或整体性能下降,这种现象称为拥塞。不加控制的拥塞甚至导致整个网络瘫痪


不同于流量控制


流量控制是端到端,接收方控制发送方的传输速率,如下图a

拥塞控制是发送方通过发送和响应的情况,获取网络链路的拥塞状况,来调整自身的发送速率,如下图b

拥塞的原因与开销

更实际的情况,当分组丢失时, 任何用于传输该分组的上游传输能力都被浪费!



两类拥塞控制方法


端到端的拥塞控制

不能从网络得到明确的反馈

从端系统根据观察到的时延和丢失现象推断出拥塞

这是TCP所采用的方法

网络辅助的拥塞控制

路由器为端系统提供显示反馈(一个bit指示一条链路出现拥塞,指示发送方按照一定速率发送)

3.7 TCP拥塞控制

发送方根据所“感知”到的网络拥塞程度来“限制”发送速率


发送方传递的速率是根据这个公式来的

LastByteSent-LastByteAcked≤min{cwnd,rwnd}

TCP拥塞控制算法

慢启动

当连接开始,以指数增加速率,直到第一个丢失事件发生,将拥塞窗口设为1


拥塞避免

为了防止过快增长,更加准确达到拥塞值,拥塞窗口转为线性增长,一个RTT只增加一个MSS


问题: 什么时候从指数增长转变为线性增长?


回答: cwnd达到它超时以前1/2的时候.

阈值:ssthresh,阈值ssthresh设置为发生丢失以前的cwnd的一半


快速恢复


分为两种情况,一个是TCP收到3个冗余确认后,进行快速恢复;另一个是超时事件后重传

超时重传:Cwnd值设置为1 MSS,进入慢启动



快速重传:Cwnd减半



3个冗余ACK指示网络还具有某些传送报文段的能力

“超时” 则拥塞更为 “严重”

TCP拥塞控制FSM描述


总结:


当cwnd < ssthresh时,发送者处于慢启动阶段, cwnd指数增长

当cwnd > ssthresh时,发送者处于拥塞避免阶段, cwnd线性增长

当出现3个冗余确认时, 阈值ssthresh设置为cwnd/2,且cwnd设置为ssthresh

当超时发生时,阈值ssthresh设置为cwnd/2,并且cwnd设置为1 MSS.


###TCP吞吐量


作为窗口长度和RTT的函数,TCP的平均吞吐量是什么?(忽略慢启动)


如果窗口为 W,吞吐量是 W/RTT

当丢包发生后,窗口降为 W/2,吞吐量为 W/2RTT.

一个连接的平均吞吐量为0 .75 W/RTT



###TCP公平性

如果K个 TCP 会话 共享带宽为 R的链路瓶颈, 每个会话应有R/K的平均链路速率


破坏公平的方式有两种:

  • 使用UDP
  • 多个并行TCP连接
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
网络协议 网络性能优化
【计算机网络】第3章 运输层(上)
【计算机网络】第3章 运输层
|
5月前
|
缓存 网络协议 算法
计算机网络 | 运输层知识点汇总-2
计算机网络 | 运输层知识点汇总
44 0
|
5月前
|
缓存 网络协议 算法
计算机网络 | 运输层知识点汇总-1
计算机网络 | 运输层知识点汇总
52 0
|
7月前
|
存储 缓存 网络协议
计算机网络-运输层
运输层概述 这里我们对运输层进行概述,之前文章所介绍的计算机网络体系结构中的物理层,数据链路层以及网络层,他们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信, 如图所示,局域网1上的主机与局域网2上的主机,通过互联的广域网进行通信,网络层的作用范围是主机到主机,但实际上在计算机网络中进行通信的真正实体是位于通信两端主机中的进程。 Ap是应用进程的英文缩写词,如何为运行在不同主机上的应用进程提供直接的通信服务,是运输层的任务,运输层协议又称为端到端协议,如图所示运输层的作用范围是应用进程到应用进程,也称为端到端。 接下来我们从计算机网络体系结构的角度来看运输层。
23 0
|
8月前
|
缓存 网络协议 算法
【计算机网络】应用层和运输层网络协议分析
【计算机网络】应用层和运输层网络协议分析
|
9月前
|
网络协议 网络性能优化
第五章 运输层【计算机网络】4
第五章 运输层【计算机网络】4
36 0
|
9月前
|
网络协议 网络性能优化
第五章 运输层【计算机网络】3
第五章 运输层【计算机网络】3
39 0
|
9月前
|
网络协议 网络性能优化
第五章 运输层【计算机网络】2
第五章 运输层【计算机网络】2
28 0
|
11月前
|
存储 网络协议 算法
【计算机网络基础 五】运输层(下)
【计算机网络基础 五】运输层(下)
111 0
|
11月前
|
缓存 网络协议 算法
【计算机网络基础 五】运输层(中)
【计算机网络基础 五】运输层(中)
125 0
【计算机网络基础 五】运输层(中)