赞
踩
传输服务和协议
网络层服务:主机之间的逻辑通信
传输层服务:进程间的逻辑通信
有些服务是可以加强的:不可靠 -> 可靠;安全
但有些服务是不可以被加强的:带宽,延迟
可靠的、保序的传输: TCP(字节流的服务)
不可靠、不保序的传输:UDP(数据包的服务)
都不提供的服务: 延时保证 带宽保证
多路复用/解复用(一个TCP/UDP实体上有很多应用进程借助其发送)
在发送方主机多路复用
从多个套接字接收来自多个进程的报文,根据套接字对应的IP地址和端口号等信息对报文段用头部加以封装 (该头部信息用于以后的解复用)
在接收方主机多路解复用
根据报文段的头部信息中的IP地址和端口号将接收到的报文段发给正确的套接字(和对应的应用进程)
多路解复用工作原理
无连接(UDP)多路解复用
当创建UDP段采用端口号,可以指定: • 目标IP地址 • 目标端口号
当主机接收到UDP段时: • 检查UDP段中的目标端 口号 • 将UDP段交给具备那个端口号的套接字
目标IP地址,目标端口号一样发送给同一个进程
面向连接(TCP)的多路复用
TCP套接字:四元组本 地标识: 源IP地址 源端口号 目的IP地址 目的端口号
解复用:接收主机用 这四个值来将数据报 定位到合适的套接字
socket 和message
UDP: User Datagram Protocol 用户数据包协议
在IP(主机到主机)所提供的基础上增加了一个多路复用/解复用(进程到进程)的服务
“尽力而为”的服务,报文 段可能
无连接:
UDP 被用于:
在UDP上可行可靠传输:
不建立连接 (会增加延时)
简单:在发送端和接收端没有连接状态
报文段的头部很小(开销小)
无拥塞控制和流量控制:UDP可以尽可能快的发送报文段
应用->传输的速率 = 主机->网络的速率 (忽略头部时)
UDP校验和
目标: 检测在被传输报文段中的差错 (如比特反转)
发送方:
将报文段的内容视为16 比特的整数
校验和:报文段的加法和(1的补运算)
发送方将校验和放在 UDP的校验和字段
接收方:
计算接收到的报文段的校验和
检查计算出的校验和与校验和字段的内容是否相等:
不相等––检测到差错
相等––没有检测到差错 ,但也许还是有差错 (残存错误,为检测出来)
注意:当数字相加时,在最高位的进位要回卷(加到最低位上),再加到结果上
目标端:校验范围+校验和=1111111111111111 通过校验
否则没有通过校验
注:求和时,必须将进位回卷到结果上
可靠数据传输(rdt)的原理 rdt(Reliable Data Transfer)
rdt在应用层、传输层和数据链路层都很重要
是网络Top 10问题之一
信道的不可靠特点决定了可靠数据传输协议( rdt )的复杂性
渐增式地开发可靠数据传输协议( rdt )的发送方和接收方
只考虑单向数据传输
但控制信息是双向流动的!
双向的数据传输问题实际上是2个单向数据传输问题的综合
使用有限状态机 (FSM) 来描述发送方和接收方
下层的信道是完全可靠的
发送方和接收方的FSM
发送方:接收–封装–打走 接收方:解封装–交付 什么都不用干
下层信道可能会出错:将分组中的比特翻转
用校验和来检测比特差错
问题:怎样从差错中恢复:
确认(ACK):接收方显式地告诉发送方分组已被正确接收
否定确认( NAK): 接收方显式地告诉发送方分组发生了差错
• 发送方收到NAK后,发送方重传分组
rdt2.0中的新机制:采用差错控制编码进行差错检测
发送方差错控制编码、缓存
接收方使用编码检错
接收方的反馈:控制报文(ACK,NAK):接收方->发送方
发送方收到反馈相应的动作
发送方接收nak (接收方检测出错) ,将之前封装的package重传,直到收到ack才开始下一轮的发送
如果ACK/NAK出错?
发送方不知道接收方发生了什么事情!
发送方如何做?
重传?可能重复
不重传?可能死锁(或出 错)
需要引入新的机制
序号
处理重复:
发送方在每个分组中加 入序号
如果ACK/NAK出错,发送方重传当前分组
接收方丢弃(不发给上层)重复分组
接收方通过序号判断,是否重复接收同样的包,在进行下一次流程/发送ack
停等协议: 发送方发送一个分组, 然后等待接收方的应答
发送方:
接收方:
注意:接收方并不知道 发送方是否正确收到了 其ACK/NAK
rdt2.1的运行
接收方不知道它最后发送的ACK/NAK是否被正确地收到
发送方不对收到的ack/nak给确认,没有所谓的确认的确认;
接收方发送ack,如果后面接收方收到的是:
老分组p0?则ack 错误
下一个分组?P1,ack正确
NAK free
rdt2.2的运行
1、No error 2、packet error 3、ack error
新的假设:下层信道可 能会丢失分组(数据或ACK)
会死锁
机制还不够处理这种 状况:
• 检验和
• 序列号
• ACK
• 重传
链路层的timeout时间确定的 (比较集中)
传输层timeout时间是适应式的 (不太集中)
1、no loss 2、packet loss 3、ACK loss 4、premature timeout/ delayed ACK
过早超时(延迟的ACK)也能够正常工作;但是效率较低,一半的分组和确认是重复的;
设置一个合理的超时时间也是比较重要的;
rdt3.0可以工作,但链路容量比较大的情况下,性能很差
一次收发一个
pipeline
增加n,能提高链路利用率
但当达到某个n,其u=100%时,无法再通过增加n,提高利用率
瓶颈转移了->链路带宽
流水线:允许发送方在未得到对方确认的情况下一次发送多个 分组
必须增加序号的范围:用多个bit表示分组的序号
在发送方/接收方要有缓冲区
• 发送方缓冲:未得到确认,可能需要重传;
• 接收方缓存:上层用户取用数据的速率≠接收到的数据速率;接收到的数据可 能乱序,排序交付(可靠)
slide window | sw(sending window) | rw(receiving window) | |
---|---|---|---|
=1 | =1 | stop-wait | |
流水线协议 | >1 | =1 | GBN |
流水线协议 | >1 | >1 | SR |
两种通用的流水线协议:回退N步(GBN)和选择重传(SR)
发送缓冲区的大小:一次最多可以发送多少个未经确认的分组
发送缓冲区中的分组
采用相对移动方式表示,分组不动
可缓冲范围移动,代表一段可以发送的权力
发送窗口:发送缓冲区内容的一个范围
发送窗口的最大值<=发送缓冲区的值
一开始:没有发送任何一个分组
每发送一个分组,前沿前移一个单位
发送窗口前沿移动的极限:不能够超过发送缓冲区的大小
发送窗口后沿移动
条件:收到老分组的确认
结果:发送缓冲区罩住新的分组,来了分组可以发送
移动的极限:不能够超过前沿
slide window | sw (sending window) | rw (receiving window) | |
---|---|---|---|
=1 | =1 | stop-wait | |
流水线协议 | >1 | =1 | GBN |
流水线协议 | >1 | >1 | SR |
两种通用的流水线协议:回退N步(GBN)和选择重传(SR)
接收窗口 (receiving window)=接收缓冲区
例子:Wr=1,在0的位置;只有0号分组可以接收;向前滑动一个,罩在1的位置,如果来了第2号分组,则丢 弃。
接收窗口的滑动和发送确认
发送窗口
新分组落入发送缓冲区范围,发送->前沿滑动
超时重发机制让发送端将发送窗口中的所有分组发送出去
来了老分组的重复确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围团(此时如果发送缓冲区有新的分组可以发送)
接收窗口
发送窗口
接收窗口
相同之处 发送窗口>1 一次能够可发送多个 未经确认的分组
不同之处
GBN :接收窗口尺寸=1
SR: 接收窗口尺寸>1
Go-back-N:
发送端最多在流水线中有N个未确认的分组
接收端只是发送累计型确认(cumulative ack)
接收端如果发现gap,不确认新到来的分组
发送端拥有对最老的 未确认分组的定时器
只需设置一个定时器
当定时器到时时,重传所有未确认分组
Selective Repeat:
发送端最多在流水线中有N个未确认的分组
接收方对每个到来的分组单独确认individual ack (非累计确认)
发送方为每个未确认的分组保持一个定时器
当超时定时器到时,只是重发到时的未确认分组
发送窗口的最大值(发送缓冲区)限制发送未确认分组的个数
发送方
从上层接收数据:
如果下一个可用于该分组的序 号可在发送窗口中,则发送
timeout(n):
重新发送分组n,重新设定定时器
ACK(n) in [sendbase,sendbase+N]:
将分组n标记为已接收
如n为最小未确认的分组序号, 将base移到下一个未确认序号
接收方
分组n [rcvbase, rcvbase+N-1]
发送ACK(n)
乱序:缓存
有序:该分组及以前缓存的 序号连续的分组交付给上层 ,然后将窗口移到下一个仍 未被接收的分组
分组n [rcvbase-N, rcvbase-1]
ACK(n) 其它:
忽略该分组
GBN | SR | |
---|---|---|
优点 | 简单,所需资源少(接收方一个 缓存单元) | 出错时,重传一个代价小 |
缺点 | 一旦出错,回退N步代价大 | 复杂,所需要资源多(接收方多个 缓存单元) |
适用范围
窗口的最大尺寸
GBN: 2^n -1
SR:2^(n-1) 例
如:n=2; 序列号:0, 1, 2, 3
GBN =3
SR=2
SR的例子: 接收方看不到二者的区别! 将重复数据误认为新数据 (a)
Q: 序号大小与窗口大小 之间的关系?
点对点:一个发送方,一个接收方
可靠的、按顺序的字节流:没有报文边界
管道化(流水线):TCP拥塞控制和流量控制设置窗口大小
发送和接收缓存
全双工数据:
面向连接:在数据交换之前,通过握 手(交换控制报文) 初始 化发送方、接收方的状态 变量
有流量控制:发送方不会淹没接收方
序号:报文段首字节的在字节流的编号
确认号:1、期望从另一方收到的下一个字节的序号 2、累积确认
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPifywE9-1627286415551)(C:\Users\20662\AppData\Roaming\Typora\typora-user-images\image-20210726075010148.png)]
怎样设置TCP 超时?
比RTT要长 ,但RTT是变化的
太短:太早超时 ,不必要的重传
太长:对报文段丢失反应太慢,消极
怎样估计RTT?
SampleRTT:测量从报文段发出到 收到确认的时间 如果有重传,忽略此次测量
SampleRTT会变化,因此估计的 RTT应该比较平滑 对几个最近的测量值求平均,而 不是仅用当前的SampleRTT
EstimatedRTT = (1- a)*EstimatedRTT + a*SampleRTT
指数加权移动平均
过去样本的影响呈指数衰减
推荐值:a = 0.125
TCP在IP不可靠服务的基础上 建立了rdt
管道化的报文段 • GBN or SR
累积确认(像GBN)
单个重传定时器(像GBN)
是否可以接受乱序的,没有规范
通过以下事件触发重传
超时(只重发那个最早的未确认段:SR)
重复的确认
• 例子:收到了ACK50,之后又收到3 个ACK50
首先考虑简化的TCP发送方: 忽略重复的确认 忽略流量控制和拥塞控 制
从应用层接收数据:
用nextseq创建报文段
序号nextseq为报文段首字节的字节流编号
如果还没有运行,启动定时器
超时:
重传后沿最老的报文段
重新启动定时器
收到确认:
如果是对尚未确认的报文段确认
更新已被确认的报文序号
如果当前还有未被确认的报文段,重新启动定时器 (发完,就关掉定时器)
TCP重传
ACK丢失 过早超时 对顺序收到的最高字节确认
产生TCP ACK的建议
接收方的事件 | TCP接收方动作 |
---|---|
所期望序号的报文段按序到达。 所有在期望序号之前的数据都已经被确认 | 延迟的ACK(提高效率,少发一个ACK)。对另一个按序报文段的到达最多等待500ms。如果下一个报文段在这个时间间隔内没有到达,则发送一个ACK。 |
有期望序号的报文段到达。 另一个按序报文段等待发送ACK | 立即发送单个累积ACK,以确认两个按序报文段。 |
比期望序号大的报文段乱序到达。 检测出数据流中的间隔 | 立即发送重复的ACK,指明下一个期待字节的序号 |
能部分或完全填充接收数据间隔 的报文段到达 | 若该报文段起始于间隔(gap)的低端, 则立即发送ACK(给确认。反映下一段的需求)。 |
超时周期往往太长:
在重传丢失报文段之前的延时太长
通过重复的ACK来检测 报文段丢失
发送方通常连续发送大量 报文段
如果报文段丢失,通常会引起多个重复的ACK
如果发送方收到同一数据 的3个冗余ACK,重传最 小序号的段:
快速重传:在定时器过时之前重发报文段
它假设跟在被确认的数据 后面的数据丢失了
• 第一个ACK是正常的;
• 收到第二个该段的ACK,表 示接收方收到一个该段后的乱序段;
• 收到第3,4个该段的ack,表 示接收方收到该段之后的2个 ,3个乱序段,可能性非常大段丢失了
三重ACK接收后的快速重传
流量控制
接收方控制发送方,不让发送方发送的太多、太快以至于让 接收方的缓冲区溢出
接收方在其向发送方的TCP段 头部的rwnd字段“通告”其空闲buffer大小
发送方限制未确认(“inflight”)字节的个数≤接收 方发送过来的 rwnd 值
保证接收方不会被淹没
RcvWindow = 缓冲区空间 - 已经接收到未读取的空间
在正式交换数据之前,发送方和接收方握手建立通 信关系:
同意建立连接(每一方都知道对方愿意建立连接)
同意连接参数
在网络中,2次握手建 立连接总是可行吗?
变化的延迟(连接请求的段没有丢,但可能超时)
由于丢失造成的重传 (e.g. req_conn(x))
报文乱序
相互看不到对方
2次握手的失败场景:
1、可能发送半连接(只在服务器维护了连接)
2、老的数据被当成新的数据接收了 seq x 和 x + 1
TCP 3次握手
解决方案:变化的初始序号+双方确认对方的序号 (3次握手)
第一次:seq 第二次:ACK + seq 第三次:ACK
二次握手:可能发送半连接(只在服务器维护了连接)
三次握手:客户端在第三次握手拒绝连接请求 服务器二次握手后的连接请求
二次握手:老的数据被当成新的数据接收了
三次握手:未建立连接(无半连接),故将发来的数据丢掉
扔掉:连接不存在, 没建立起来;连接的 序号不在当前连接的 范围之内
若一个数据滞留时间足够长导致
在TCP第二次连接(两个三次握手后)到来,这个数据包大概率也会被丢弃,因为seq不一样,而seq又与时间有关
拥塞:
非正式的定义: “太多的数据需要网络传输,超过了网络的处理能力”
与流量控制不同
拥塞的表现:
分组丢失 (路由器缓冲区溢出)
分组经历比较长的延迟(在路由器的队列中排队)
网络中前10位的问题!
一个路由器,有限的缓冲
分组丢失时,发送端重传
应用层的输入=应用层输出: λ(in) = λ(out)
传输层的输入包括重传: λ(in‘) >= λ(in)
理想化: 发送端有完美的信息
发送端知道什么时候路由器的缓冲是可用的
只在缓冲可用时发送
不会丢失: λ(in‘’) = λ(in)
理想化: 掌握丢失信息 分组可以丢失,在路由器由 于缓冲器满而被丢弃 如果知道分组丢失了,发 送方重传分组
现实情况: 重复 分组可能丢失,由于缓冲器 满而被丢弃 发送端最终超时,发送第2 个拷贝,2个分组都被传出
现实情况: 重复 分组可能丢失,由于缓冲器 满而被丢弃 发送端最终超时,发送第2 个拷贝,2个分组都传到
拥塞的“代价”:
为了达到一个有效输出,网络需要做更多的工作(重传)
没有必要的重传,链路中包括了多个分组的拷贝
是那些没有丢失,经历的时间比较长(拥塞状态)但是 超时的分组
降低了的“goodput”
输出比输入少原因:1)重传的丢失分组;2) 没有必要重传的重复分组
1、4个发送端 2、多重路径 3、超时/重传
又一个拥塞的代价:
当分组丢失时,任何“关于这个分组的上游传输能力” 都被浪费了
2种常用的拥塞控制方法:
端到端拥塞控制:
没有来自网络的显式反馈
端系统根据延迟和丢失事件推断是否有拥塞
TCP采用的方法
网络辅助的拥塞控制:
路由器提供给端系统以反馈信息
单个bit置位,显示有拥塞 (SNA, DECbit, TCP/IP ECN, ATM)
显式提供发送端可以采用的速率
ABR: available bit rate:
“弹性服务”
如果发送端的路径“轻载 ” 发送方使用可用带宽
如果发送方的路径拥塞了 发送方限制其发送的速度到一个 最小保障速率 上
RM (资源管理) 信元:
由发送端发送,在数据信元中间隔插入
RM信元中的比特被交换机设置 (“网络辅助”) 有无拥塞
NI bit: no increase in rate (轻微拥塞)速率不要增加了
CI bit: congestion indication 拥塞指示
发送端发送的RM 信元被接收端返回, 接收端不做任何 改变
在RM信元中的2个字节 ER (explicit rate)字段 多大带宽
拥塞的交换机可能会降低信元中ER的值
发送端发送速度因此是 最低的可支持速率(交换机)
数据信元中的EFCI bit: 被拥塞的交换机设置成1
如果在管理信元RM前面的数据信元EFCI被设置成了1, 接收端在 返回的RM信元中设置CI bit
总结:网络提供一些信息,包括一些标志位的置位以及字段 (为两主机间的通信提供多大的带宽)
端到端的拥塞控制机制
路由器不向主机有关拥塞的反馈信息
• 路由器的负担较轻
• 符合网络核心简单的 TCP/IP架构原则
端系统根据自身得到的信息 ,判断是否发生拥塞,从而 采取动作
拥塞控制的几个问题
如何检测拥塞
轻微拥塞
拥塞
控制策略
在拥塞发送时如何动 作,降低速率
• 轻微拥塞,如何降低
• 拥塞时,如何降低
在拥塞缓解时如何动 作,增加速率
发送端如何探测到拥塞?
某个段超时了(丢失事件 ):拥塞
超时时间到,某个段的确认没有来
原因1:网络拥塞(某个路由器缓冲区没空间了,被丢弃)概率大
原因2:出错被丢弃了(各级错误,没有通过校验,被丢弃)概率小
一旦超时,就认为拥塞了,有一定误判,但是总体控制方向是对的
有关某个段的3次重复ACK:轻微拥塞
段的第1个ack,正常,确认绿段,期待红段
段的第2个重复ack,意味着红段的后一段收到了,蓝段乱序到达
段的第2、3、4个ack重复,意味着红段的后第2、3、4个段收到了 ,橙段乱序到达,同时红段丢失的可能性很大(后面3个段都到了, 红段都没到)
网络这时还能够进行一定程度的传输,拥塞但情况要比第一种好
如何控制发送端发送的速率
维持一个拥塞窗口的值:CongWin (主要手段)
发送端限制 已发送但是未确认 的数据量**(的上限): LastByteSent-LastByteAcked <= CongWin
从而粗略地控制**发送方的往网络中注入的速率
RTT 往返延时
如何控制发送端发送的速率
CongWin是动态的,是感知到的网络拥塞程度的函数
超时或者3个重复ack,CongWin↓(下降)
• 超时时:CongWin降为1MSS,进入SS阶段然后再倍增到 CongWin(原) / 2(每个RTT),从而进入CA阶段
• 3个重复ack :CongWin降为CongWin/2,CA阶段
否则(正常收到Ack,没有发送以上情况):CongWin跃跃欲试↑ (上升)
• SS阶段:加倍增加(每个RTT)
• CA阶段:线性增加(每个RTT)
联合控制的方法:
发送端控制发送但是未确认的量同时也不能够超过接收 窗口,满足流量控制要求
SendWin=min{CongWin, RecvWin}
同时满足 拥塞控制和流量控制要求
慢启动
AIMD:线性增、乘性减少
超时事件后的保守策略
连接刚建立, CongWin = 1 MSS
可用带宽可能>> MSS/RTT
当连接开始时,指数性增加发送速率,直到发生丢失的事件
当连接开始时,指数性增 加(每个RTT)发送速率 直到发生丢失事件
每一个RTT, CongWin加倍
每收到一个ACK时, CongWin加1(why)
慢启动阶段:只要不超时或 3个重复ack,一个RTT, CongWin加倍
总结: 初始速率很慢,但是加速却是指数性的 指数增加,SS时间很短,长期来看可以忽略
乘性减: 丢失事件后将CongWin降为1(ss阶段通常可忽略,故相当于直接减少到 CongWin/2 ),将CongWin/2作为阈值,进入慢启动阶段(倍增直到 CongWin/2)
加性增: 当 CongWin >阈值时,一个 RTT 如没有发生丢失事件,将 CongWin 加1MSS : 探 测
当收到3个重复的ACKs:
当超时事件发生时:
出现丢失,Threshold设置成 CongWin的1/2
当CongWin<Threshold, 发送端处于慢启动阶段( slow-start), 窗口指数性增长.
当CongWin > Threshold, 发送端处于拥塞避免阶段 (congestion-avoidance), 窗口线性增长.
当收到三个重复的ACKs (triple duplicate ACK), Threshold设置成 CongWin/2, CongWin=Threshold+3.
当超时事件发生时timeout, Threshold=CongWin/2 CongWin=1 MSS,进入SS阶段
状态转换
TCP的平均吞吐量是多少,使用窗口window尺寸W和RTT来 描述?
忽略慢启动阶段,假设发送端总有数据传输
W:发生丢失事件时的窗口尺寸(单位:字节)
平均窗口尺寸(#in-flight字节):3/4W
平均吞吐量:一个RTT时间吞吐3/4W, avg TCP thruput = 3/4 * (W/RTT) bytes/sec
公平性目标: 如果 K个TCP会话分享一个链路带宽为R的 瓶颈,每一个会话的有效带宽为 R/K
2个竞争的TCP会话:
加性增加,斜率为1, 吞吐量增加
乘性减,吞吐量比例减少
往返延迟相同时,TCP会话竞争的最终,双方的 有效的带宽 将收敛到 链路带宽 的一半。
所以相互竞争时 应用建立的TCP会话越多,占有带宽一般越大。
公平性和 UDP
多媒体应用通常不是用 TCP
应用发送的数据速率希望 不受拥塞控制的节制
使用UDP: 音视频应用泵出数据的速率是恒定的, 忽略数据的丢失 研究领域: TCP 友好性
公平性和并行TCP连接
2个主机间可以打开多个并行的TCP连接
Web浏览器
传输层提供的服务
多路复用和解复用
实例1:无连接传输层协议 UDP
可靠数据传输原理
实例2:面向连接的 传输层协议-TCP
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。