You are on page 1of 36

2021中科大网络 2021中科大网络

第 3章 第三章:传输层
传输层 目标:
 理解传输层的工作  学习Internet的传输层协
原理 议
 多路复用/解复用  UDP:无连接传输
 可靠数据传输  TCP:面向连接的可靠传

 流量控制
 TCP的拥塞控制
 拥塞控制
Computer
中国科学技术大学 Networking: A Top
自动化系 郑烇 Down Approach
改编自Jim kurose, Keith Ross 7th edition
Jim Kurose, Keith Ross
Addison-Wesley
April 2016
Transport Layer 3-2

2021中科大网络 2021中科大网络

第三章:提纲 传输服务和协议
application
transport
 为运行在不同主机上的应
3.1 概述和传输层服务 3.5 面向连接的传输: 用进程提供逻辑通信
network
data link
physical

3.2 多路复用与解复用 TCP


 传输协议运行在端系统
3.3 无连接传输:UDP 段结构
 发送方:将应用层的报
可靠数据传输
3.4 可靠数据传输的原理 文分成报文段,然后传
流量控制 递给网络层
连接管理  接收方:将报文段重组

3.6 拥塞控制原理 成报文,然后传递给应 application

用层 transport

3.7 TCP 拥塞控制


network
data link

 有多个传输层协议可供应 physical

用选择
 Internet: TCP和UDP

Transport Layer 3-3 Transport Layer 3-4


2021中科大网络 2021中科大网络

传输层 vs. 网络层 Internet传输层协议


 可靠的、保序的传输: TCP
类比:东西2个家庭的通信
application

 网络层服务:主机之间  多路复用、解复用
transport
network
data link
的逻辑通信 Ann家的12个小孩给另Bill家的  拥塞控制
physical
network

12个小孩发信 network
data link
data link
physical
 传输层服务:进程间的  流量控制 physical
 主机 = 家庭  建立连接
network

逻辑通信 data link


physical

 进程 = 小孩 network
 依赖于网络层的服务 data link
 应用层报文= 信封中的信件  不可靠、不保序的传输: UDP
physical
• 延时、带宽 network

 传输协议= Ann 和 Bill


data link
 多路复用、解复用 physical
 并对网络层的服务进行 network
data link application
增强  为家庭小孩提供复用解复用服  没有为尽力而为的IP服务添加更 physical
network transport
network
务 多的其它额外服务 data link
data link
• 数据丢失、顺序混乱、 physical
physical

加密  网络层协议 = 邮政服务
 家庭-家庭的邮包传输服务
 都不提供的服务:
有些服务是可以加强的:不可靠 -> 可靠;安全  延时保证
但有些服务是不可以被加强的:带宽,延迟 Transport Layer 3-5  带宽保证 Transport Layer 3-6

2021中科大网络 2021中科大网络

第三章:提纲 多路复用/解复用
在发送方主机
在接收方主机多路
从多个套接字接收来自多个进程的
3.1 概述和传输层服务 3.5 面向连接的传输: 报文,根据套接字对应的IP 根据报文段的头部信息中的IP
等信息对报文段用头部加以 将接收到的报文段发给
3.2 多路复用与解复用 TCP 封装 (该头部信息用于以后的解复用) 正确的套接字 (和对应的应用进程)
3.3 无连接传输:UDP 段结构
可靠数据传输
3.4 可靠数据传输的原理 application
流量控制 application P1 P2 application socket
连接管理 P3 transport P4
process
3.6 拥塞控制原理 transport network transport
network link network
3.7 TCP 拥塞控制 link physical link
physical physical

Transport Layer 3-7 Transport Layer 3-8


2021中科大网络 2021中科大网络

多路解复用工作原理 UDP和TCP不同 无连接(UDP)多路解复用


 解复用作用: TCP或UDP实体采用  创建套接字:  在接收端,UDP套接字用二元
哪些信息,将段的数据部分交给正 32比特 组标识 (目标IP地址、目标端
确的socket,从而交给正确的进程 serverSocket=socket(PF_INET, 口号)
源端口 # 目标端口 #
SOCK_DGRAM,0);
 主机收到IP数据报  当主机收到UDP报文段:
bind(serverSocket, &sad, sizeof(sad));
 检查报文段的目标端口号
 每IP数据报有源IP地址和目标IP 其他头部字段 serverSocket和Sad指定的端口号捆绑  用该端口号将报文段定位给
地址 UDP和TCP不同 套接字
 IP数据报承载一个传输层报文 ClientSocket=socket(PF_INET,  如果两个不同源 IP地址/源端
段,每个段有一个
应用层数据 SOCK_DGRAM,0); 口号的数据报,但是有相同的
(报文) 没有Bind,ClientSocket和OS为之分 目标IP地址和端口号,则被定
配的某个端口号捆绑(客户端使用什 位到相同的套接字
 主机联合使用IP 和 么端口号无所谓,客户端主动找服务
器) PID Socket Des IP Des Port
将报文段发送给合适的套接字 TCP/UDP报文段格式 12345 77888 202.38.64.1 80
,交给相应的进程(线程)
12346 77999 202.38.64.1 11010
 TCP使用4元组
 UDP使用2元组(目标IP,目标Port)
Transport Layer 3-9 …… Transport Layer 3-10

2021中科大网络 2021中科大网络

无连接的多路解复用 无连接多路复用:例子
DatagramSocket
 回顾: 创建拥有本地端口号的套  回顾:当创建UDP段采用端口 DatagramSocket
serverSocket = new
DatagramSocket
接字 号,可以指定: mySocket2 = new DatagramSocket mySocket1 = new
• 目标IP地址 DatagramSocket (6428); DatagramSocket
DatagramSocket mySocket1
(9157); (5775);
= new DatagramSocket(12534); • 目标端口号 application
application application
P1
P3 P4
transport
transport transport
network

 当主机接收到 UDP段时: 具备相同目标IP地址和目 network link network

标端口号,即使是源IP地 link physical link


• 检查UDP段中的目标端 址 或/且源端口号的不同 physical physical

口号 IP数据报,将会被传到相
• 将UDP段交给具备那个 同的目标UDP套接字上 source port: 6428
dest port: 9157
source port: ?
dest port: ?

端口号的套接字
source port: 9157 source port: ?
dest port: 6428 dest port: ?
Transport Layer 3-11 Transport Layer 3-12
2021中科大网络 2021中科大网络

无连接多路解复用(续) 面向连接(TCP)的多路复用
serverSocket = serverSocket=socket(PF_INET,SOCK_DGRAM,0);
bind(serverSocket, sad, sizeof(sad));
 TCP套接字:四元组本  服务器能够在一个 TCP
P2 P1
P3 P1 地标识: 端口上同时支持多个
 源IP地址 TCP套接字:
 源端口号  每个套接字由其四元组标
SP: 6428 SP: 6428
DP: 19157 DP: 5775  目的IP地址 识(有不同的源IP和源
PORT)
 目的端口号
SP: 19157 SP: 5775
 Web服务器对每个连接
客户端 DP: 46428
服务器 DP: 46428 客户端  解复用:接收主机用
IP: A IP: B 客户端有不同的套接字
IP: C 这四个值来将数据报
在每个接收到的报文段中都提供了“返回地址” 定位到合适的套接字  非持久对每个请求有不同
Socket PID Des IP Des Port 的套接字
77888 P3 C 6428
…… Transport Layer 3-13 Transport Layer 3-14

2021中科大网络 2021中科大网络

面向连接的解复用:例子 面向连接的解复用:例子
threaded server
application application
application P4 P5 P6 application application application
P4
P3 P2 P3 P3 P2 P3
transport transport
transport transport transport transport
network network
network link network network link network
link physical link link physical link
physical server: IP physical physical server: IP physical
address B address B

host: IP source IP,port: B,80 host: IP host: IP source IP,port: B,80 host: IP
address A dest IP,port: A,9157 source IP,port: C,5775 address C address A dest IP,port: A,9157 source IP,port: C,5775 address C
dest IP,port: B,80 dest IP,port: B,80
source IP,port: A,9157 source IP,port: A,9157
dest IP, port: B,80 dest IP, port: B,80
source IP,port: C,9157 source IP,port: C,9157
dest IP,port: B,80 dest IP,port: B,80
three segments, all destined to IP address: B,
dest port: 80 are demultiplexed to different sockets Transport Layer 3-15 Transport Layer 3-16
2021中科大网络 2021中科大网络
Socket PID SIP SPort DIP DPort
面向连接的多路复用
90000 P0 (续)C 80 面向连接的多路复用:多线程Web Server
90004 P4 A 9157 C 80
90005 P5 B 9157 C 80 P4
P1 T0 T1 T2 P2 P1P3
90006 P6 B 5775 C 80 T3

SP: 5775
P1 P0 P4 P5 P6 P2 P1P3
DP: 80
SP: 5775 S-IP: B
DP: 80 D-IP: C
S-IP: B
D-IP: C SP: 9157 SP: 9157
客户端 DP: 80 DP: 80 客户端
服务器
SP: 9157 SP: 9157 IP: A S-IP: A IP: C S-IP: B IP: B
DP: 80 DP: 80 D-IP: C D-IP: C
客户端 服务器 客户端
IP: A S-IP: A IP: C S-IP: B IP: B
D-IP: C D-IP: C  一个进程下面可能有多个线程:由多个线程分别为客户提供服务
 在这个场景下,还是根据4元组决定将报文段内容同一个进程下的不
Socke PID SIP SPort DIP DPort 同线程
80011 P1 C 80 A 9157  解复用到不同线程
Transport Layer 3-17 Transport Layer 3-18

2021中科大网络 2021中科大网络

第三章:提纲 UDP: User Datagram Protocol [RFC 768]


 “no frills,” “bare  UDP 被用于:
3.1 概述和传输层服务 3.5 面向连接的传输: bones”Internet传输协议  流媒体(丢失不敏感,
3.2 多路复用与解复用 TCP  “尽力而为”的服务,报文
速率敏感、应用可控制
传输速率)
3.3 无连接传输:UDP 段结构 段可能
 DNS
可靠数据传输  丢失
3.4 可靠数据传输的原理  SNMP
流量控制 送到应用进程的报文  在UDP上可行可靠传输:
连接管理 段乱序  在应用层增加可靠性
3.6 拥塞控制原理  无连接:  应用特定的差错恢复
 UDP发送端和接收端
3.7 TCP 拥塞控制 之间没有握手
 每个UDP报文段都被
独立地处理
Transport Layer 3-19 Transport Layer 3-20
2021中科大网络 2021中科大网络

UDP:用户数据报协议 UDP校验和
UDP报文段的 目标: 检测在被传输报文段中的差错 (如比特反转)
字节数,
包括头部 为什么要有UDP?
发送方: 接收方:
32比特  不建立连接 (会增加延时
)  将报文段的内容视为 16  计算接收到的报文段的校验
源端口号# 目的端口号# 比特的整数 和
校验和  简单:在发送端和接收端没
长度  校验和:报文段的加法  检查计算出的校验和与校验
有连接状态 和 (1的补运算) 和字段的内容是否相等:
 报文段的头部很小 (开销小)  发送方将校验和放在  不相等–--检测到差错
 无拥塞控制和流量控制: UDP的校验和字段  相等–--没有检测到差错
应用程序数据 UDP可以尽可能快的发送报 ,但也许还是有差错
(报文) 文段 • 残存错误
 应用->传输的速率= 主机->网
络的速率
UDP报文段格式 Transport Layer 3-21 Transport Layer 3-22

2021中科大网络 2021中科大网络
Internet校验和的例子 第三章:提纲
 注意:当数字相加时,在最高位的进位要回卷,再加
到结果上
3.1 概述和传输层服务 3.5 面向连接的传输:
例子:两个16比特的整数相加 TCP
3.2 多路复用与解复用
1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 段结构
1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
3.3 无连接传输:UDP
可靠数据传输
3.4 可靠数据传输的原理
回卷 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 流量控制
连接管理
和 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0
校验和 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 3.6 拥塞控制原理
3.7 TCP 拥塞控制
 目标端:校验范围 +校验和=1111111111111111 通过校验
 否则没有通过校验

 注:求和时,必须将进位回卷到结果上 Transport Layer 3-23 Transport Layer 3-24


2021中科大网络 2021中科大网络

可靠数据传输(rdt)的原理 可靠数据传输:问题描述
rdt_send(): 被上层(如应用层) deliver_data(): 被rdt调
 rdt在应用层、传输层和数据链路层都很重要 调用,以将数据交付给下方的发送实 用,将数据交付给上层
 是网络Top 10问题之一 体

发送方 接收方

udt_send(): 被rdt调用,用 udt_rcv(): 当分组通过信道到达接


以将分组放到不可靠的信道上传 收方时被调用
 信道的不可靠特点决定了可靠数据传输协议( rdt )的复杂性 输到接收方

Transport Layer 3-25 Transport Layer 3-26

2021中科大网络 2021中科大网络

可靠数据传输:问题描述(续) Rdt1.0: 在可靠信道上的可靠数据传输


我们将:
 下层的信道是完全可靠的
 渐增式地开发可靠数据传输协议( rdt )的发送方和接
 没有比特出错
收方
 没有分组丢失
 只考虑单向数据传输
 发送方和接收方的 FSM
 但控制信息是双向流动的!
 发送方将数据发送到下层信道
 双向的数据传输问题实际上是 2个单向数据传输问题的综
 接收方从下层信道接收数据

 使用有限状态机 (FSM) 来描述发送方和接收方
等待来自 rdt_send(data) 等待来自 rdt_rcv(packet)
引起状态变迁的事件
上层的调 下层的调 extract (packet,data)
状态变迁时采取的动作 packet = make_pkt(data)
用 用 deliver_data(data)
状态:在该状态时,下一 udt_send(packet)
状态 状态
个状态只由下一个事
1 事件
2 发送方
件唯一确定
动作
接收方

Transport Layer 3-27 Transport Layer 3-28


2021中科大网络 2021中科大网络

Rdt2.0:具有比特差错的信道 rdt2.0:FSM描述
rdt_send(data)
 下层信道可能会出错:将分组中的比特翻转 snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
接收方
 用校验和来检测比特差错 rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
 问题:怎样从差错中恢复: 等待来自上 等待 ACK rdt_rcv(rcvpkt) &&
层的调用 或 NAK udt_send(sndpkt) corrupt(rcvpkt)
 确认(ACK):接收方显式地告诉发送方分组已被正确接收
 否定确认( NAK): 接收方显式地告诉发送方分组发生了差错 udt_send(NAK)
• 发送方收到NAK后,发送方重传分组
rdt_rcv(rcvpkt) && isACK(rcvpkt)
等待来自下
 rdt2.0中的新机制: 采用差错控制编码进行差错检测 L
层的调用
 发送方差错控制编码、缓存 发送方
 接收方使用编码检错
 接收方的反馈:控制报文(ACK,NAK):接收方发送方
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
 发送方收到反馈相应的动作 extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)

Transport Layer 3-29 Transport Layer 3-30

2021中科大网络 2021中科大网络

rdt2.0:没有差错时的操作 rdt2.0:有差错时
rdt_send(data) rdt_send(data)
snkpkt = make_pkt(data, checksum) snkpkt = make_pkt(data, checksum)
udt_send(sndpkt) udt_send(sndpkt)
rdt_rcv(rcvpkt) && rdt_rcv(rcvpkt) &&
isNAK(rcvpkt) isNAK(rcvpkt)
等待来自上 Wait for rdt_rcv(rcvpkt) && 等待来自上 Wait for rdt_rcv(rcvpkt) &&
层的调用 ACK or udt_send(sndpkt) corrupt(rcvpkt) 层的调用 ACK or udt_send(sndpkt) corrupt(rcvpkt)
NAK NAK
udt_send(NAK) udt_send(NAK)

rdt_rcv(rcvpkt) && isACK(rcvpkt) rdt_rcv(rcvpkt) && isACK(rcvpkt)


等待来自下 等待来自下
L 层的调用 L 层的调用

rdt_rcv(rcvpkt) && rdt_rcv(rcvpkt) &&


notcorrupt(rcvpkt) notcorrupt(rcvpkt)
extract(rcvpkt,data) extract(rcvpkt,data)
deliver_data(data) deliver_data(data)
udt_send(ACK) udt_send(ACK)

Transport Layer 3-31 Transport Layer 3-32


2021中科大网络 2021中科大网络

rdt2.0的致命缺陷! -> rdt2.1 rdt2.1:发送方处理出错的 ACK/NAK


rdt_send(data)

如果ACK/NAK出错? 处理重复: sndpkt = make_pkt(0, data, checksum)


udt_send(sndpkt) rdt_rcv(rcvpkt) &&
 发送方不知道接收方发  发送方在每个分组中加 等待ACK或
( corrupt(rcvpkt) ||
等待来自 isNAK(rcvpkt) )
生了什么事情! 入序号 上层的调
NAK 0
udt_send(sndpkt)
用0
 发送方如何做?  如果ACK/NAK出错,发 rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt) rdt_rcv(rcvpkt)
 重传?可能重复 送方重传当前分组 && isACK(rcvpkt) && notcorrupt(rcvpkt)
不重传?可能死锁(或出 && isACK(rcvpkt)
  接收方丢弃(不发给上 L
错) 层)重复分组
L
等待ACK
等待来自
 需要引入新的机制 或NAK 1
上层的调
rdt_rcv(rcvpkt) &&
停等协议 ( corrupt(rcvpkt) || 用1
 序号 rdt_send(data)
发送方发送一个分组, isNAK(rcvpkt) )
然后等待接收方的应答 udt_send(sndpkt) sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)

Transport Layer 3-33 Transport Layer 3-34

2021中科大网络 2021中科大网络

rdt2.1:接收方处理出错的ACK/NAK rdt2.1:讨论
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
extract(rcvpkt,data) 发送方: 接收方:
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)  在分组中加入序列号  必须检测接收到的分组
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)  两个序列号(0,1)就 是否是重复的
sndpkt = make_pkt(NAK, chksum) sndpkt = make_pkt(NAK, chksum) 足够了  状态会指示希望接收到的
udt_send(sndpkt) udt_send(sndpkt) 分组的序号为0还是1
等待来 等待来  一次只发送一个未经确认
rdt_rcv(rcvpkt) && 自下层 自下层 rdt_rcv(rcvpkt) && 的分组
not corrupt(rcvpkt) && 的调用 的调用1 not corrupt(rcvpkt) &&
has_seq1(rcvpkt) 0 has_seq0(rcvpkt)  必须检测ACK/NAK是否  注意:接收方并不知道
sndpkt = make_pkt(ACK, chksum) sndpkt = make_pkt(ACK, chksum) 出错(需要EDC ) 发送方是否正确收到了
udt_send(sndpkt) udt_send(sndpkt)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
 状态数变成了两倍 其ACK/NAK
&& has_seq1(rcvpkt)
 必须记住当前分组的序列  没有安排确认的确认
extract(rcvpkt,data)
deliver_data(data) 号为0还是1  具体解释见下页
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)

Transport Layer 3-35 Transport Layer 3-36


2021中科大网络 2021中科大网络

rdt2.1的运行 rdt2.2:无NAK的协议
sender receiver sender receiver
 功能同rdt2.1,但只使用ACK(ack 要编号)
send pkt0 pkt0 send pkt0 pkt0
rcv pkt0 rcv pkt0  接收方对最后正确接收的分组发ACK,以替代NAK
ack send ack ack send ack
ack error Ack ok  接收方必须显式地包含被正确接收分组的序号
send pkt0 pkt0 send pkt1 pkt1
rcv pkt0 rcv pkt1  发送方收到重复的ACK(如:再次收到 ack0)时,
ack send ack ack send ack
rcv ack
pkt1
rcv ack
pkt0
与收到NAK采取相同的动作:重传当前分组
send pkt1 send pkt0
rcv pkt1 rcv pkt0  为后面的一次发送多个数据单位做一个准备
ack send ack ack send ack
 一次能够发送多个
(a) ack error (b) ack right
 每一个的应答都有: ACK,NACK;麻烦
接收方不知道它最后发送的ACK/NAK是否被正确地收到  使用对前一个数据单位的 ACK,代替本数据单位的 nak
 发送方不对收到的ack/nak给确认,没有所谓的确认的确认;
 确认信息减少一半,协议处理简单
 接收方发送ack,如果后面接收方收到的是:
 老分组p0?则之前的ack 错误
 下一个分组?P1,之前的ack正确 Transport Layer 3-37 Transport Layer 3-38

2021中科大网络 2021中科大网络

NAK free rdt2.2的运行


sender receiver sender receiver
send pkt0 pkt0 send pkt0 pkt0
rcv pkt0 recv pkt0
…… ack0 send ack0 ack0 send ack0
ACK0 ACK1 ACK2 ACK3 Recv ack0 rcv ack0
send pkt1 pkt1 send pkt1 pkt1
rcv pkt1 rcv pkt1, error
…… ack1 send ack1 ack0 send ack0
NAK0 NAK1 NAK2 NAK3 rcv ack1 rcv ack0
不要NAK send pkt0 pkt0 send pkt1 pkt1
rcv pkt0 rcv pkt1
ack0 send ack0 ack1 send ack1

(a) No error(packet or ack error) (b) packet error

Transport Layer 3-39 Transport Layer 3-40


2021中科大网络 2021中科大网络

rdt2.2的运行 rdt2.2:发送方和接收方片断
rdt_send(data)
sender receiver sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
send pkt0 pkt0 ( corrupt(rcvpkt) ||
rcv pkt0 等待ACK
等待来自 isACK(rcvpkt,1) )
send ack0 0
ack0 上层的调
Recv ack0 error udt_send(sndpkt)
用0
send pkt0 pkt0 发送方的
rcv pkt0 FSM片断 rdt_rcv(rcvpkt)
ack0 send ack0 && notcorrupt(rcvpkt)
rcv ack0
发送方甚至 send pkt1 pkt1 rdt_rcv(rcvpkt) && && isACK(rcvpkt,0)
都不知道 rcv pkt1 (corrupt(rcvpkt) || L
这个分组 ack1 send ack1 has_seq1(rcvpkt)) 等待来 接收方的
是ack0
udt_send(sndpkt)
自下层 FSM片断
的调用0
(c) ack error
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
Transport Layer 3-41 udt_send(sndpkt) Transport Layer 3-42

2021中科大网络 2021中科大网络

rdt3.0:具有比特差错和分组丢失的信道 rdt3.0 发送方


rdt_send(data)
rdt_rcv(rcvpkt) &&
sndpkt = make_pkt(0, data, checksum) ( corrupt(rcvpkt) ||
udt_send(sndpkt) isACK(rcvpkt,1) )
新的假设:下层信道可 方法:发送方等待ACK一段 start_timer
rdt_rcv(rcvpkt) L
能会丢失分组(数据 合理的时间 L 等待来自 等待
timeout
 发送端超时重传:如果到时没有 ACK0
或ACK) 收到ACK->重传
上层的调
用0
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
 会死锁  问题:如果分组(或 ACK )只 && notcorrupt(rcvpkt) rdt_rcv(rcvpkt)
&& isACK(rcvpkt,1) && notcorrupt(rcvpkt)
 机制还不够处理这种 是被延迟了: && isACK(rcvpkt,0)
stop_timer
状况:  重传将会导致数据重复,但 stop_timer
利用序列号已经可以处理这 等待 等待来自
• 检验和 timeout
ACK1 上层的调
个问题 udt_send(sndpkt)
• 序列号 start_timer
用1 rdt_rcv(rcvpkt)
 接收方必须指明被正确接收 L
• ACK 的序列号 rdt_rcv(rcvpkt) &&
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
• 重传  需要一个倒计数定时器
( corrupt(rcvpkt) ||
udt_send(sndpkt)
isACK(rcvpkt,0) )
start_timer
L
链路层的timeout时间确定的
传输层timeout时间是适应式的 Transport Layer 3-43 Transport Layer 3-44
2021中科大网络 2021中科大网络
rdt3.0的运行
rdt3.0的运行 sender receiver
sender receiver send pkt0 pkt0
sender receiver sender receiver
send pkt0 pkt0 rcv pkt0
send pkt0 send pkt0 ack0 send ack0
pkt0 pkt0 rcv pkt0
rcv pkt0 rcv pkt0 send ack0 rcv ack0
ack0 send pkt1 pkt1
ack0 send ack0 ack0 send ack0 rcv ack0
pkt1 rcv pkt1
rcv ack0 rcv ack0 send pkt1 send ack1
send pkt1 pkt1 send pkt1 pkt1 rcv pkt1
X ack1 ack1
rcv pkt1 send ack1
loss X
ack1 send ack1 loss timeout
rcv ack1 resend pkt1 pkt1
send pkt0 pkt0 timeout rcv pkt1
rcv pkt0 timeout resend pkt1 pkt1 rcv ack1 pkt0 (detect duplicate)
rcv pkt1 send pkt0 send ack1
ack0 send ack0 resend pkt1 pkt1
(detect duplicate) ack1
rcv pkt1 ack1 send ack1 rcv ack1 rcv pkt0
rcv ack1 ack0 send ack0
ack1 send ack1 send pkt0
rcv ack1 send pkt0 pkt0 pkt0
pkt0
rcv pkt0
send pkt0 rcv pkt0 ack0 (detect duplicate)
(a) no loss rcv pkt0 ack0 send ack0 send ack0
ack0 send ack0
(c) ACK loss (d) premature timeout/ delayed ACK
(b) packet loss  过早超时(延迟的 ACK )也能够正常工作;但是效率较低,一半
Transport Layer 3-45 的分组和确认是重复的; Transport Layer 3-46
 设置一个合理的超时时间也是比较重要的;

2021中科大网络 2021中科大网络

rdt3.0的性能 rdt3.0:停-等操作
 rdt3.0可以工作,但链路容量比较大的情况下,性能很差
发送方 接收方
 链路容量比较大,一次发一个 PDU 的不能够充分利用链路的传输能力
发送首个分组的第一个比特, t = 0
 例:1 Gbps的链路,15 ms端-端传播延时,分组大小为 1kB : 首个分组的最后一个比特, t = L / R

Ttransmit = L (分组长度,比特) 8kb/pkt 首个分组的第一个比特到达


= = 8s RTT 首个分组的最后一比特到达,发
R (传输速率,bps) 109 b/sec 送ACK

L/R .008
U = = = 0.00027 ACK达到,发送下一个分组,
sender 30.008 t = RTT + L / R
RTT + L / R microsec

 U sender:利用率 – 忙于发送的时间比例
每30ms发送1KB的分组 270kbps=33.75kB/s 的吞吐量(在 1 L/R .008

U = = = 0.00027
Gbps 链路上) sender
RTT + L / R 30.008 microsec
 瓶颈在于:网络协议限制了物理资源的利用!
Transport Layer 3-47 Transport Layer 3-48
2021中科大网络 2021中科大网络
流水线协议
流水线:提高链路利用率
流水线:允许发送方在未得到对方确认的情况下一次发送多个
sender receiver
分组
发送首个分组的第一个比特, t = 0
首个分组的最后个比特, t = L / R  必须增加序号的范围 :用多个bit 表示分组的序号
 在发送方/接收方要有缓冲区
首个分组的第一个比特到达 • 发送方缓冲:未得到确认,可能需要重传;
RTT 首个分组的最后个比特达到,发送 ACK
第二个分组的最后个比特达到,发送 ACK • 接收方缓存: 上层用户取用数据的速率≠接收到的数据速率;接收到的数据可
第三个分组的最后个比特达到,发送 ACK 能乱序,排序交付(可靠)
ACK到达,发送下一个分组 ,
t = RTT + L / R
利用率增加到3倍

3*L/R .024
U = = = 0.0008
sender 30.008
RTT + L / R microsecon

 增加n,能提高链路利用率
 但当达到某个n,其u=100%时,无法再通过增加n,提高利用率
 瓶颈转移了->链路带宽  两种通用的流水线协议:回退N步(GBN)和选择重传(SR)
Transport Layer 3-49 Transport Layer 3-50

2021中科大网络 2021中科大网络
通用:滑动窗口 (slide window)协议
发送窗口滑动过程-相对表示方法
 发送缓冲区
 形式:内存中的一个区域,落入缓冲区的分组可以发送
 采用相对移动方式表示,分组不动
 功能:用于存放已发送,但是没有得到确认的分组
 可缓冲范围移动,代表一段可以发送的权力
 必要性:需要重发时可用
0 1 2 3 4 5 6 7 0 1 2 3
 发送缓冲区的大小:一次最多可以发送多少个未经确认的分组
 停止等待协议 =1
 流水线协议>1,合理的值,不能很大,链路利用率不能够超100% 0 1 2 3 4 5 6 7 0 1 2 3
 发送缓冲区中的分组
 未发送的:落入发送缓冲区的分组,可以连续发送出去;
 已经发送出去的、等待对方确认的分组:发送缓冲区的分组只有得到确认 真正滑动过程 0 1 2 3 4 5 6 7 0 1 2 3
才能删除

相对滑动表示 0 1 2 3 4 5 6 7 0 1 2 3

Transport Layer 3-51 Transport Layer 3-52


2021中科大网络 2021中科大网络
滑动窗口(slide window)协议
发送窗口的移动->前沿移动
 发送窗口:发送缓冲区内容的一个范围
 那些已发送但是未经确认分组的序号构成的空间
 发送窗口前沿移动的极限:不能够超过发送缓
 发送窗口的最大值 <=发送缓冲区的值 冲区
 一开始:没有发送任何一个分组
 后沿=前沿
 之间为发送窗口的尺寸 =0
 每发送一个分组,前沿前移一个单位 0 1 2 3 4 5 6 7 0 1 2 3

后沿 前沿
0 1 2 3 4 5 6 7 0 1 2 3

后沿 前沿

Transport Layer 53 Transport Layer 3-54

2021中科大网络 2021中科大网络

发送窗口的移动->前沿移动 发送窗口的移动->后沿移动

 发送窗口前沿移动的极限:不能够超过发送缓  发送窗口后沿移动
冲区  条件:收到老分组的确认
 结果:发送缓冲区罩住新的分组,来了分组可以发

 移动的极限:不能够超过前沿

0 1 2 3 4 5 6 7 0 1 2 3

后沿 前沿 0 1 2 3 4 5 6 7 0 1 2 3

后沿 前沿

Transport Layer 3-55 Transport Layer 3-56


2021中科大网络 2021中科大网络
3.5 滑动窗口(slide window)协议
发送窗口的移动->后沿移动  滑动窗口技术
 发送窗口 (sending window)
 发送窗口后沿移动
发送缓冲区 0 1 2 3 4 5 6 7 0 1 2 3
 条件:收到老分组 (后沿)的确认

 结果:发送缓冲区罩住新的分组,来了分组可以发
送 Sending window
0 1 2 3 4 5 6 7 0 1 2 3

 移动的极限:不能够超过前沿
收到对0-1的确认
0 1 2 3 4 5 6 7 0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3

后沿 前沿
0 1 2 3 4 5 6 7 0 1 2 3

0 1 2 3 4 5 6 7 0 1 2 3

Transport Layer 3-57 58

2021中科大网络 2021中科大网络
滑动窗口(slide window)协议-接收窗口 滑动窗口(slide window)协议-接收窗口
 接收窗口 (receiving window)=接收缓冲区  接收窗口的滑动和发送确认
 滑动:
 接收窗口用于控制哪些分组可以接收;
• 低序号的分组到来,接收窗口移动;
• 只有收到的分组序号落入接收窗口内才允许接收 • 高序号分组乱序到,缓存但不交付(因为要实现rdt,不允许失序),不滑动
• 若序号在接收窗口之外,则丢弃;  发送确认:
 接收窗口尺寸 Wr=1,则只能顺序接收; • 接收窗口尺寸 =1 ; 发送连续收到的最大的分组确认(累计确认)
• 接收窗口尺寸 >1 ; 收到分组,发送那个分组的确认(非累计确认)
 接收窗口尺寸 Wr>1 ,则可以乱序接收
• 但提交给上层的分组,要按序
 例子:Wr=1,在0的位置;只有 0号分组可以接收; 0 1 2 3 4 5 6 7 0 1 2 3
接收窗口
向前滑动一个,罩在1的位置,如果来了第 2号分组,则丢
弃; 收到0,1 0 1 2 3 4 5 6 7 0 1 2 3
接收窗口
0 1 2 3 4 5 6 7 0 1 2 3 向前滑动
接收窗口

0 1 2 3 4 5 6 7 0 1 2 3
59 60
2021中科大网络 2021中科大网络
滑动窗口(slide window)协议-接收窗口 正常情况下的 2个窗口互动
 发送窗口
 有新的分组落入发送缓冲区范围,发送->前沿滑动

接收窗口
0 1 2 3 4 5 6 7 0 1 2 3  来了老的低序号分组的确认 ->后沿向前滑动 ->新的分组可
以落入发送缓冲区的范围
收到1,2 0 1 2 3 4 5 6 7 0 1 2 3  接收窗口
接收窗口
不向前滑动
 收到分组,落入到接收窗口范围内,接收
 是低序号 ,发送确认给对方
再收到0 0 1 2 3 4 5 6 7 0 1 2 3
一起交付
 发送端上面来了分组 ->发送窗口滑动 ->接收窗口滑动 ->发确认
接收窗口
向前滑动

61 62

2021中科大网络 2021中科大网络
异常情况下GBN的2窗口互动 异常情况下SR的2窗口互动
 发送窗口  发送窗口
 新分组落入发送缓冲区范围,发送->前沿滑动  新分组落入发送缓冲区范围,发送->前沿滑动
 超时重发机制让发送端将发送窗口中的所有分组发送出去  超时重发机制让发送端将超时的分组重新发送出去
 来了老分组的重复确认 ->后沿不向前滑动 ->新的分组无法  来了乱序分组的确认 ->后沿不向前滑动 ->新的分组无法落
落入发送缓冲区的范围(此时如果发送缓冲区有新的分组 入发送缓冲区的范围(此时如果发送缓冲区有新的分组可
可以发送) 以发送)
 接收窗口  接收窗口
 收到乱序分组,没有落入到接收窗口范围内,抛弃  收到乱序分组,落入到接收窗口范围内,接收
 (重复)发送老分组的确认,累计确认;  发送该分组的确认,单独确认;

63 64
2021中科大网络 2021中科大网络

GBN协议和SR协议的异同 流水线协议:总结
Go-back-N: Selective Repeat:
 相同之处  不同之处
 发送端最多在流水线  发送端最多在流水线中
 发送窗口>1  GBN :接收窗口尺寸 =1 中有N个未确认的分 有N个未确认的分组
 一次能够可发送多个 • 接收端:只能顺序接收 组  接收方对每个到来的分
未经确认的分组 • 发送端:从表现来看,一旦一个  接收端只是发送累计 组单独确认individual ack
分组没有发成功,如: 0,1,2,3,4 型确认cumulative ack (非累计确认)
; 假如1未成功,234都发送出去
 接收端如果发现gap,
了,要返回1再发送;GB1
不确认新到来的分组
 SR: 接收窗口尺寸>1  发送方为每个未确认的
 发送端拥有对最老的
• 接收端:可以乱序接收 未确认分组的定时器 分组保持一个定时器
• 发送端:发送0,1,2,3,4,一旦1  当超时定时器到时,只是
未成功,2,3,4,已发送,无需重  只需设置 重发到时的未确认分组
发,选择性发送1  当定时器到时时,重
传所有未确认分组
Transport Layer 3-65 Transport Layer 3-66

2021中科大网络 2021中科大网络
GBN:发送方扩展的FSM GBN:接收方扩展的FSM
rdt_send(data)
default
if (nextseqnum < base+N) { udt_send(sndpkt)
sndpkt[nextseqnum] = make_pkt(nextseqnum,data,chksum) rdt_rcv(rcvpkt)
udt_send(sndpkt[nextseqnum]) && notcurrupt(rcvpkt)
if (base == nextseqnum) L && hasseqnum(rcvpkt,expectedseqnum)
start_timer 等待
extract(rcvpkt,data)
nextseqnum++ SW前沿滑动 expectedseqnum=1
sndpkt = deliver_data(data)
}
make_pkt(expectedseqnum,ACK,chksum) sndpkt = make_pkt(expectedseqnum,ACK,chksum)
L else
udt_send(sndpkt)
base=1
refuse_data(data)
expectedseqnum++ RW前沿滑动
nextseqnum=1
timeout  只发送ACK:对顺序接收的最高序号的分组
start_timer
等待 udt_send(sndpkt[base])  可能会产生重复的 ACK
rdt_rcv(rcvpkt) udt_send(sndpkt[base+1])  只需记住expectedseqnum 接收窗口=1
&& corrupt(rcvpkt) …
udt_send(sndpkt[nextseqnum-1]) •
rdt_rcv(rcvpkt) &&  对乱序的分组:
notcorrupt(rcvpkt)
 丢弃(不缓存)  在接收方不被缓存!
base = getacknum(rcvpkt)+1 SW后沿滑动
If (base == nextseqnum)  对顺序接收的最高序号的分组进行确认-累计确认
stop_timer
else 0 1 2 3 4 5 6 7 0 1 2 3
start_timer Transport Layer 3-67 Transport Layer 3-68
ack4 ack4
运行中的GBN 2021中科大网络 2021中科大网络

0 1 2 3 4 5 6 7 0 0 1 2 3 4 5 6 7 0 选择重传SR
0 1 2 3 4 5 6 7 0
0 1 2 3 4 5 6 7 0
0 1 2 3 4 5 6 7 0
 接收方对每个正确接收的分组,分别发送
0 1 2 3 4 5 6 7 0
0 1 2 3 4 5 6 7 0 ACKn(非累积确认)
 接收窗口>1
0 1 2 3 4 5 6 7 0
• 可以缓存乱序的分组
0 1 2 3 4 5 6 7 0
 最终将分组按顺序交付给上层
0 1 2 3 4 5 6 7 0

0 1 2 3 4 5 6 7 0  发送方只对那些没有收到 ACK的分组进行重
0 1 2 3 4 5 6 7 0
0 1 2 3 4 5 6 7 0
发-选择性重发
0 1 2 3 4 5 6 7 0
 发送方为每个未确认的分组设定一个定时器
0 1 2 3 4 5 6 7 0
 发送窗口的最大值(发送缓冲区)限制发送
在接收端,乱序的不缓存;
0 1 2 3 4 5 6 7 0 未确认分组的个数
因此哪个n分组丢失了
GB到那个分组n;
Transport Layer 3-69 Transport Layer 3-70
即使n以后的分组传送都是正确的

2021中科大网络 2021中科大网络

选择重传 选择重传SR的运行
发送方 接收方
从上层接收数据: 分组n [rcvbase, rcvbase+N-1]
 如果下一个可用于该分组的序  发送ACK(n)
号可在发送窗口中,则发送  乱序:缓存
timeout(n):  有序:该分组及以前缓存的
 重新发送分组n,重新设定定时 序号连续的分组交付给上层
器 ,然后将窗口移到下一个仍
未被接收的分组
ACK(n) in [sendbase,sendbase+N]:
分组n [rcvbase-N, rcvbase-1]
 将分组n标记为已接收
 ACK(n)
 如n为最小未确认的分组序号,
将base移到下一个未确认序号 其它:
 忽略该分组

Transport Layer 3-71 Transport Layer 3-72


2021中科大网络 sender window 2021
receiver 中科大网络
window
(after receipt) (after receipt)
对比GBN和SR 窗口的最大尺寸 0123012 pkt0
0123012 pkt1 0123012
0123012 pkt2 0123012
GBN SR  GBN: 2n-1 0123012
0123012 pkt3
 SR:2n-1 X
优 点 简单,所需资源少(接收方一个 出错时,重传一个代价小 0123012
pkt0 will accept packet
缓存单元) 例如:n=2; 序列号:0, 1, (a) no problem
with seq number 0
缺 点 一旦出错,回退N步代价大 复杂,所需要资源多(接收方多个 2, 3
缓存单元) receiver can’t see sender side.
 GBN =3 receiver behavior identical in both cases!
 适用范围  SR=2 something’s (very) wrong!

 出错率低:比较适合GBN,出错非常罕见,没有必 SR的例子: 0123012 pkt0

要用复杂的SR,为罕见的事件做日常的准备和复杂  接收方看不到二者的区 0123012 pkt1 0123012


0123012 pkt2 0123012
处理 别! X 0123012

 链路容量大(延迟大、带宽大):比较适合SR而不  将重复数据误认为新数
timeout
X
据 (a) retransmit pkt0 X
是GBN,一点出错代价太大 0123012 pkt0
Q: 序号大小与窗口大小 will accept packet
with seq number 0
(b) oops!
之间的关系?
Transport Layer 3-73 Transport Layer 3-74

2021中科大网络 2021中科大网络

第3章:提纲 TCP:概述 RFCs: 793, 1122, 1323, 2018, 2581

3.1 概述和传输层服务 3.5 面向连接的传输:  点对点:  全双工数据:

3.2 多路复用与解复用 TCP  一个发送方,一个接收方  在同一连接中数据流双向


 可靠的、按顺序的字节流: 流动
3.3 无连接传输:UDP 段结构  MSS:最大报文段大小
 没有报文边界
可靠数据传输
3.4 可靠数据传输的原理  管道化(流水线):  面向连接:
流量控制  在数据交换之前,通过握
 TCP拥塞控制和流量控制设置
连接管理 窗口大小 手(交换控制报文) 初始
化发送方、接收方的状态
3.6 拥塞控制原理  发送和接收缓存 变量
3.7 TCP 拥塞控制  有流量控制:
进程写数据 进程读数据  发送方不会淹没接收方
套接字 套接字
TCP TCP
发送缓存 报文段 接收缓存

Transport Layer 3-75 Transport Layer 3-76


2021中科大网络 2021中科大网络
TCP报文段结构 字节
序号
TCP 序号, 确认号
32比特 发送方发送的段

URG:紧急数据 对字节计数 序号: source port # dest port #


sequence number
(通常不用) 源端口号 目的端口号
(而不是报文段)  报文段首字节的在字节
acknowledgement number
序号 rwnd
ACK: ACK # 流的编号 checksum urg pointer

合法 确认号
首部 保留 确认号: window size
N
长度 未用 U A P R S F
PSH:马上推出数据 接收窗口
愿意接收的
(通常不用) 校验和 紧急数据指针  期望从另一方收到的
字节数量
下一个字节的序号 sender sequence number space
RST, SYN, FIN: 可选项
建立/拆除连接  累积确认
t sent, not- usable not
确认n-1 Q:接收方如何处理乱序的 ACKed yet ACKed but not usable
(“in- yet sent
应用层数据 及以前字节 报文段-没有规定 flight”)
Internet (长度可变) 发送方收到的段
source port # dest port #
校验和
sequence number
(同 UDP) acknowledgement number
A rwnd
checksum urg pointer

Transport Layer 3-77 Transport Layer 3-78

2021中科大网络 2021中科大网络

TCP序号和确认号 TCP往返延时(RTT)和超时
Host B Q: 怎样设置TCP Q:怎样估计RTT?
Host A
 SampleRTT:测量从报文段发出到
超时?
收到确认的时间
User  比RTT要长  如果有重传,忽略此次测量
types
‘C’
 但RTT是变化的  SampleRTT会变化,因此估计的
Seq=42, ACK=79, data = ‘C’
host ACKs  太短:太早超时 RTT应该比较平滑
receipt of  对几个最近的测量值求平均,而
‘C’, echoes  不必要的重传
Seq=79, ACK=43, data = ‘C’ 不是仅用当前的SampleRTT
back ‘C’
host ACKs  太长:对报文段丢失
receipt
of echoed 反应太慢,消极
‘C’ Seq=43, ACK=80

简单telne场景

Transport Layer 3-79 Transport Layer 3-80


2021中科大网络 2021中科大网络

TCP往返延时(RTT)和超时 TCP往返延时(RTT)和超时
EstimatedRTT = (1- )*EstimatedRTT + *SampleRTT 设置超时
 指数加权移动平均  EstimtedRTT + 安全边界时间
 过去样本的影响呈指数衰减  EstimatedRTT 大 (方差大) 较大的安全边界时间
 推荐值: = 0.125
RTT: gaia.cs.umass.edu to fantasia.eurecom.fr
 SampleRTT会偏离EstimatedRTT多远:
350

RTT: gaia.cs.umass.edu to fantasia.eurecom.fr


DevRTT = (1- )*DevRTT +
*|SampleRTT-EstimatedRTT|
RTT (milliseconds)

300

250
( = 0.25)
RTT (milliseconds)

200
超时时间间隔设置为:

sampleRTT
TimeoutInterval = EstimatedRTT + 4*DevRTT
150

EstimatedRTT

100
estimated RTT “safety margin”
1 8 15 22 29 36 43 50 57 64 71 78 85 92 99 106
time (seconnds)
time (seconds)
SampleRTT Estimated RTT
Transport Layer 3-81 Transport Layer 3-82

2021中科大网络 2021中科大网络

第3章:提纲 TCP:可靠数据传输
 TCP在IP不可靠服务的基础上  首先考虑简化的TCP发
3.1 概述和传输层服务 3.5 面向连接的传输: 建立了rdt
TCP 送方:
3.2 多路复用与解复用  管道化的报文段
 忽略重复的确认
3.3 无连接传输:UDP 段结构 • GBN or SR

可靠数据传输  累积确认(像GBN)  忽略流量控制和拥塞控


3.4 可靠数据传输的原理  单个重传定时器(像 GBN) 制
流量控制
 是否可以接受乱序的,没有规范
连接管理
 通过以下事件触发重传
3.6 拥塞控制原理  超时(只重发那个最早的未确认
3.7 TCP 拥塞控制 段:SR)
 重复的确认
• 例子:收到了 ACK50,之后又收到3
个ACK50

Transport Layer 3-83 Transport Layer 3-84


2021中科大网络 2021中科大网络

TCP 发送方(简化版) TCP发送方事件:


从应用层接收数据: 超时:
data received from application above
create segment, seq. #: NextSeqNum  用nextseq创建报文段  重传后沿最老的报文段
pass segment to IP (i.e., “send”)
NextSeqNum = NextSeqNum + length(data)
 序号nextseq为报文段首字  重新启动定时器
if (timer currently not running) 节的字节流编号
L start timer
NextSeqNum = InitialSeqNum wait  如果还没有运行,启动定 收到确认:
SendBase = InitialSeqNum for
时器
event timeout  如果是对尚未确认的报
 定时器与最早未确认的报文 文段确认
retransmit not-yet-acked segment
with smallest seq. # 段关联
start timer
 更新已被确认的报文序号
 过期间隔:
ACK received, with ACK field value y TimeOutInterval  如果当前还有未被确认的
if (y > SendBase) {
报文段,重新启动定时器
SendBase = y 只传送具有最小
/* SendBase–1: last cumulatively ACKed byte */ 序号的未确段 0 1 2 3 4 5 6 7 8 9 10 11
if (there are currently not-yet-acked segments) 像SR,不是将所有
start timer 未确认的都传一遍
else stop timer ACK7 对第7的期待
} Transport Layer 3-85 Transport Layer 3-86

NextSeqNum = InitialSeqNum 2021中科大网络 2021中科大网络


SendBase = InitialSeqNum
简化的 TCP:重传
loop (forever) {
switch(event)
TCP 发 主机A 主机B 主机A 主机B
event: data received from application above
create TCP segment with sequence number NextSeqNum
if (timer currently not running)
送方

Seq=92超时间隔
start timer
pass segment to IP 注释:

超时
NextSeqNum = NextSeqNum + length(data)
• SendBase-1: 最后一
个累积确认的字节 X
event: timer timeout 丢失
retransmit not-yet-acknowledged segment with
smallest sequence number 例: Sendbase
start timer • SendBase-1 = 71; = 100

Seq=92 超时间隔
y= 73, 因此接收方期 SendBase
event: ACK received, with ACK field value of y 望73+ ; = 120
if (y > SendBase) { y > SendBase,因此
SendBase = y
新的数据被确认 SendBase
if (there are currently not-yet-acknowledged segments)
= 100 SendBase
start timer
= 120 过早超时
}
时间 时间
} /* end of loop forever */ ACK丢失
Transport Layer 3-87 Transport Layer 3-88
对顺序收到的最高字节确认;
2021中科大网络 2021中科大网络

TCP :重传 产生TCP ACK的建议 [RFC 1122, RFC 2581]

主机A 主机B
接收方的事件 TCP接收方动作
所期望序号的报文段按序到达。 延迟的ACK。对另一个按序报文段的到达最
所有在期望序号之前的数据都 多等待500ms。如果下一个报文段在这个时
已经被确认 间间隔内没有到达,则发送一个 ACK。
超时

X 有期望序号的报文段到达。 立即发送单个累积 ACK,以确认两个按序报


丢失
另一个按序报文段等待发送 ACK 文段。

SendBase
= 120 比期望序号大的报文段乱序到达。 立即发送重复的ACK,指明下一个期待字节
检测出数据流中的间隔 的序号

时间 能部分或完全填充接收数据间隔 若该报文段起始于间隔(gap)的低端,
累积确认 的报文段到达。 则立即发送ACK。

Transport Layer 3-89 Transport Layer 3-90

2021中科大网络 2021中科大网络

快速重传 TCP快速重传
Host A Host B

 超时周期往往太长:  如果发送方收到同一数据
 在重传丢失报文段之前的 的3个冗余ACK,重传最
Seq=92, 8 bytes of data
延时太长 小序号的段: Seq=100, 20 bytes of data
 通过重复的ACK 来检测  快速重传:在定时器过时 X
报文段丢失 之前重发报文段
 发送方通常连续发送大量  它假设跟在被确认的数据 ACK=100

timeout
报文段 后面的数据丢失了 ACK=100
• 第一个ACK是正常的; ACK=100
 如果报文段丢失,通常会
• 收到第二个该段的 ACK,表 ACK=100
引起多个重复的ACK 示接收方收到一个该段后的 Seq=100, 20 bytes of data
乱序段;
接收方
• 收到第3,4个该段的ack,表
40-49 50-59 60-69 70-79 80-89
示接收方收到该段之后的2个
,3个乱序段,可能性非常大
段丢失了
fast retransmit after sender
Transport Layer 3-91 receipt of triple duplicate ACK Transport Layer 3-92
2021中科大网络 2021中科大网络

快速重传算法: 第3章:提纲

event: ACK received, with ACK field value of y


3.1 概述和传输层服务 3.5 面向连接的传输:
if (y > SendBase) { 3.2 多路复用与解复用 TCP
SendBase = y
if (there are currently not-yet-acknowledged segments) 3.3 无连接传输:UDP 段结构
start timer 可靠数据传输
} 3.4 可靠数据传输的原理
else { 流量控制
increment count of dup ACKs received for y
if (count of dup ACKs received for y = 3) {
连接管理
resend segment with sequence number y 3.6 拥塞控制原理
}
3.7 TCP 拥塞控制
已确认报文段的 快速重传
一个重复确认

Transport Layer 3-93 Transport Layer 3-94

2021中科大网络 2021中科大网络

TCP 流量控制 TCP流量控制


application
应用可能会从TCP process  接收方在其向发送方的 TCP段
缓冲区TCP往里面写 socket缓冲区中 application 头部的rwnd字段“通告”其空
移走数据 ….
,app从当中读取 OS 闲buffer大小
到应用进程
TCP socket
receiver buffers
… 比TCP接收方目前  大小通过socket选项
交付的速率要慢 设置 (典型默认大小为4096 字 RcvBuffer buffered data
(发送端正在发送) TCP 节)
code
 很多操作系统自动调整 rwnd free buffer space
TCP段
IP
IP分组  发送方限制未确认(“in-
流量控制 code TCP segment payloads
接收方控制发送方,不让发送 flight”)字节的个数≤接收
方发送的太多、太快以至于让 方发送过来的 值
接收方buffer大小
接收方的缓冲区溢出 来自发送方
 保证接收方不会被淹没
接收方协议栈

Transport Layer 3-95 Transport Layer 3-96


2021中科大网络 2021中科大网络

TCP流量控制 第3章:提纲
3.1 概述和传输层服务 3.5 面向连接的传输:
3.2 多路复用与解复用 TCP
3.3 无连接传输:UDP 段结构
可靠数据传输
(假设TCP接收方丢弃乱序的报文段) 3.4 可靠数据传输的原理
流量控制
 缓存中的可用的空间 连接管理
= RcvWindow
= RcvBuffer-[LastByteRcvd - LastByteRead]
3.6 拥塞控制原理
3.7 TCP 拥塞控制

Transport Layer 3-97 Transport Layer 3-98

2021中科大网络 2021中科大网络

TCP连接管理 同意建立连接
在正式交换数据之前,发送方和接收方握手建立通
2次握手
信关系: Q:在网络中,2次握手建
 同意建立连接(每一方都知道对方愿意建立连接)
立连接总是可行吗?
 同意连接参数 Let’s talk  变化的延迟(连接请求的段
ESTAB
application application OK 没有丢,但可能超时)
ESTAB
connection state: ESTAB connection state: ESTAB  由于丢失造成的重传 (e.g.
connection variables:
seq # client-to-server
connection Variables:
seq # client-to-server
req_conn(x))
server-to-client server-to-client
rcvBuffer size rcvBuffer size  报文乱序
at server,client at server,client choose x
req_conn(x)  相互看不到对方
network network ESTAB
acc_conn(x)
ESTAB
Socket clientSocket = Socket connectionSocket =
newSocket("hostname","port welcomeSocket.accept();
number");
Transport Layer 3-99 Transport Layer 3-100
2021中科大网络 2021中科大网络
同意建立连接 TCP 3次握手
2次握手的失败场景:
client state server state
choose x
req_conn(x) LISTEN LISTEN
choose x ESTAB 选择初始序号, x
req_conn(x) 发送TCP SYN报文
retransmit acc_conn(x)
ESTAB SYNSENT SYNbit=1, Seq=x
req_conn(x)
retransmit acc_conn(x) 选择初始序号,y
req_conn(x) ESTAB 发送SYNACK
data(x+1) SYN RCVD
accept 报文, 确认SYN
ESTAB retransmit data(x+1) SYNbit=1, Seq=y
req_conn(x) data(x+1) ACKbit=1; ACKnum=x+1
connection 接收SYNACK(x)
x completes server ESTAB 表明服务器是活跃的;
connection client 发送SYNACK 的ACK;
terminates forgets x
client x completes server req_conn(x) 该报文可能包含 ACKbit=1, ACKnum=y+1
terminates forgets x C-S的数据 接收ACK(y)
ESTAB 表明客户端是活跃的
data(x+1) ESTAB
accept
ESTAB data(x+1)

半连接 老的数据被当成新的数据接受了 解决方案:变化的初始序号 +双方确认对方的序号(3次握手)


(只在服务器端维护了连接!) Transport Layer 3-101 Transport Layer 3-102

2021中科大网络 2021中科大网络
3次握手解决:半连接和接收老数据问题 TCP 3次握手: FSM

choose x closed
req_conn(x)
choose x ESTAB Socket connectionSocket =
req_conn(x) welcomeSocket.accept();
retransmit acc_conn(x)
ESTAB
req_conn(x) L
retransmit acc_conn(x) Socket clientSocket =
req_conn(x) SYN(x) newSocket("hostname","port
ESTAB number");
data(x+1) accept SYNACK(seq=y,ACKnum=x+1)
ESTAB retransmit data(x+1) 创建一个新的socket用于 SYN(seq=x)
data(x+1) 和client的通信 listen
req_conn(x)
connection
x completes server
connection client
terminates forgets x SYN
client x completes server req_conn(x) SYN
terminates forgets x rcvd sent
ESTAB
data(x+1) accept SYNACK(seq=y,ACKnum=x+1)
ESTAB data(x+1) ESTAB ACK(ACKnum=y+1)
ACK(ACKnum=y+1)
扔掉:连接不存在, L
没建立起来;连接的
序号不在当前连接的
Transport Layer 3-103 Transport Layer 3-104
范围之内
2021中科大网络 2021中科大网络

TCP: 关闭连接 TCP: 关闭连接


client state server state
 客户端,服务器分别关闭它自己这一侧的连接
ESTAB ESTAB
 发送FIN bit = 1的TCP段
clientSocket.close()

 一旦接收到FIN,用ACK回应 FIN_WAIT_1 can no longer FINbit=1, seq=x


send but can
CLOSE_WAIT
 接到FIN段,ACK可以和它自己发出的FIN段一起发 receive data
ACKbit=1; ACKnum=x+1
can still
送 FIN_WAIT_2 wait for server send data
close
 可以处理同时的FIN交换 LAST_ACK
FINbit=1, seq=y
TIMED_WAIT can no longer
send data
ACKbit=1; ACKnum=y+1
timed wait
for 2*max CLOSED
segment lifetime

CLOSED

Transport Layer 3-105 Transport Layer 3-106

2021中科大网络 2021中科大网络

第3章:提纲 拥塞控制原理
3.1 概述和传输层服务 3.5 面向连接的传输: 拥塞:
3.2 多路复用与解复用 TCP  非正式的定义: “太多的数据需要网络传输,超过了网
段结构 络的处理能力”
3.3 无连接传输:UDP
可靠数据传输  与流量控制不同
3.4 可靠数据传输的原理
流量控制  拥塞的表现:
连接管理  分组丢失 (路由器缓冲区溢出 )

3.6 拥塞控制原理  分组经历比较长的延迟(在路由器的队列中排队 )


 网络中前10位的问题!
3.7 TCP 拥塞控制

Transport Layer 3-107 Transport Layer 3-108


2021中科大网络 2021中科大网络
拥塞的原因/代价: 场景1 拥塞的原因/代价: 场景2
original data: lin throughput: lout  一个路由器, 缓冲
 2个发送端,2个接
收端 Host A  分组丢失时,发送端重传

 一个路由器,具备
共享的无限大的
输出链路缓冲
 应用层的输入=应用层输出: lin = lout
无限大的缓冲 ’
 传输层的输入包括重传: l‘in lin
 输出链路带宽:R
 没有重传
Host B
lin :原始数据
lout
l'in:原始数据,加上
R/2 重传的数据

delay
Host A
lout

lin R/2 lin R/2


 每个连接的最大吞吐量  当进入的速率lin接近链路链 有限的共享
路带宽R时,延迟增大 Host B
:R/2 链路缓冲
Transport Layer 3-109 Transport Layer 3-110

2021中科大网络 2021中科大网络
拥塞的原因/代价: 场景2 拥塞的原因/代价: 场景2
理想化: 发送端有完美的信息 R/2
理想化: 掌握丢失信息
发送端知道什么时候路由器的缓冲是可用的
分组可以丢失,在路由器由
lout

 只在缓冲可用时发送
 不会丢失:l’in=lin 于缓冲器满而被丢弃
lin R/2  如果知道分组丢失了,发
送方重传分组
lin : original data lin : original data
copy lout copy lout
l'in: original data, plus l'in: original data, plus
retransmitted data retransmitted data

A free buffer space! A


no buffer space!

finite shared output


Host B Host B
link buffers
Transport Layer 3-111 Transport Layer 3-112
2021中科大网络 2021中科大网络
拥塞的原因/代价: 场景2 拥塞的原因/代价: 场景2
理想化: 掌握丢失信息 R/2
现实情况: 重复 R/2
 分组可能丢失,由于缓冲器
分组可以丢失,在路由器由 当以R/2的速度发送时
满而被丢弃 当以R/2的速率发送
, 一些分组是重传的 时,一些分组是重传
于缓冲器满而被丢弃

lout

lout
,有效输出渐进逼近
R/2 (why?)
 发送端最终超时,发送第2 的分组,包括最终被
交付的重复分 组!
 如果发送端知道分组丢失 个拷贝,2个分组都被传出
了,发送方重传分组 lin R/2 lin R/2

lin : original data lin


lout copy
timeout lout
l'in: original data, plus l'in
retransmitted data

A A
free buffer space! free buffer space!

Host B Host B
Transport Layer 3-113 Transport Layer 3-114

2021中科大网络 2021中科大网络
拥塞的原因/代价: 场景2 拥塞的原因/代价: 场景3
现实情况: 重复 Q: 当 增加时,会发生什么?
R/2
 4个发送端
 分组可能丢失,由于缓冲器
满而被丢弃 当以R/2的速率发送  多重路径 A:当红色的 增加时,所有到来
时,一些分组是重传
的蓝色分组都在最上方的队列
lout

 发送端最终超时,发送第2 的分组,包括最终被
交付的重复分 组!
 超时/重传 中丢弃了,蓝色吞吐->0
个拷贝,2个分组都传到
Host A lout
lin : original data
输出比输入少原因:1)重传的丢失分组;2)
l'in : original data, plus
拥塞的“代价”: 没有必要重传的重复分组 retransmitted data

 为了达到一个有效输出,网络需要做更多的工作(重传) finite shared output


link buffers
 没有必要的重传,链路中包括了多个分组的拷贝
 是那些没有丢失,经历的时间比较长(拥塞状态)但是 Host
超时的分组 B

 降低了的“goodput”

Transport Layer 3-115 Transport Layer 3-116


2021中科大网络 2021中科大网络

拥塞的原因/代价: 场景3 拥塞控制方法


C/2 2种常用的拥塞控制方法:
H l
o
o
:
s u
t
t :
lout

A
H
 没有来自网络的显  路由器提供给端系统以
o
s
t 式反馈 反馈信息
B

lin’ C/2  端系统根据延迟和  单个bit 置位,显示有

丢失事件推断是否 拥塞 (SNA, DECbit,


有拥塞 TCP/IP ECN, ATM)
又一个拥塞的代价 :  显式提供发送端可以
 TCP采用的方法
 当分组丢失时,任何“关于这个分组的上游传输能力” 采用的速率
都被浪费了

Transport Layer 3-117 Transport Layer 3-118

2021中科大网络 2021中科大网络
案例学习: ATM ABR 拥塞控制 案例学习: ATM ABR 拥塞控制
ABR: available bit rate: RM (资源管理) 信元: RM cell data cell
 由发送端发送 ,在数据信元中
 “弹性服务”
间隔插入
 如果发送端的路径“轻载
 RM信元中的比特被交换机设

置 (“网络辅助”)
 发送方使用可用带宽
 NI bit: no increase in
 如果发送方的路径拥塞了
rate (轻微拥塞)速率不要
 在RM信元中的2个字节 ER (explicit rate) 字段
 发送方限制其发送的 增加了
 拥塞的交换机可能会降低信元中ER的值
速度到一个最小保障  CI bit: congestion  发送端发送速度因此是最低的可支持速率
速率上
indication 拥塞指示
 数据信元中的EFCI bit: 被拥塞的交换机设置成1
 发送端发送的 RM 信元被接  如果在管理信元 RM前面的数据信元 EFCI被设置成了1, 接收端在
收端返回, 接收端不做任何 返回的RM信元中设置CI bit
改变
Transport Layer 3-119 Transport Layer 3-120
2021中科大网络 2021中科大网络

第3章:提纲 TCP 拥塞控制:机制

3.1 概述和传输层服务 3.5 面向连接的传输:  端到端的拥塞控制机制 拥塞控制的几个问题


3.2 多路复用与解复用 TCP  路由器不向主机有关拥塞的  如何检测拥塞
反馈信息  轻微拥塞
3.3 无连接传输:UDP 段结构
可靠数据传输 • 路由器的负担较轻  拥塞
3.4 可靠数据传输的原理 • 符合网络核心简单的
流量控制  控制策略
TCP/IP架构原则
连接管理  在拥塞发送时如何动
 端系统根据自身得到的信息
3.6 拥塞控制原理 ,判断是否发生拥塞,从而
作,降低速率
• 轻微拥塞,如何降低
3.7 TCP 拥塞控制 采取动作
• 拥塞时,如何降低
 在拥塞缓解时如何动
作,增加速率
Transport Layer 3-121 Transport Layer 3-122

Ack=3460 2021中科大网络 2021中科大网络


TCP 拥塞控制:拥塞感知 Ack=3460
Ack=3460 TCP 拥塞控制:速率控制方法
Ack=3460

? 2000-3459 3460-4919 4920-6379 6380-7839 如何控制发送端发送的速率


 某个段超时了(丢失事件 ):拥塞
1460B 1460B 1460B 1460B  维持一个拥塞窗口的值: CongWin
 超时时间到,某个段的确认没有来
 原因1:网络拥塞(某个路由器缓冲区没空间了,被丢弃)概率大  发送端限制已发送但是未确认的数据量(的上限) :
 原因2:出错被丢弃了(各级错误,没有通过校验,被丢弃)概率小
LastByteSent-LastByteAcked CongWin
 一旦超时,就认为拥塞了,有一定误判,但是总体控制方向是对的  从而粗略地控制发送方的往网络中注入的速率
 有关某个段的 3次重复ACK:轻微拥塞
 段的第1个ack ,正常,确认绿段,期待红段 sender sequence number space
cwnd
 段的第2个重复ack,意味着红段的后一段收到了,蓝段乱序到达 CongWin
rate ~
~ bytes/sec
 段的第2、3、4个ack重复,意味着红段的后第2、3、4个段收到了 RTT
,橙段乱序到达,同时红段丢失的可能性很大(后面3个段都到了,
红段都没到) last byte last byte
ACKed sent, not- sent
 网络这时还能够进行一定程度的传输,拥塞但情况要比第一种好 yet ACKed
(“in-
flight”)
Transport Layer 3-123 Transport Layer 3-124
2021中科大网络 2021中科大网络

TCP 拥塞控制:速率控制方法 TCP拥塞控制和流量控制的联合动作


如何控制发送端发送的速率
:
 CongWin是动态的,是感知到的网络拥塞程度的函数
 发送端控制发送但是未确认 的量同时也不能够超过接收
 超时或者3个重复ack,CongWin↓
窗口,满足流量控制要求
• 超时时:CongWin 1MSS, SS  SendWin=min{CongWin, RecvWin}
CongWin/2 RTT CA
 同时满足 拥塞控制和流量控制要求
•3 ack CongWin CongWin/2,CA
 否则(正常收到Ack,没有发送以上情况):CongWin跃跃欲试↑
• SS ( RTT)
• CA ( RTT)

Transport Layer 3-125 Transport Layer 3-126

2021中科大网络 2021中科大网络

TCP 拥塞控制:策略概述 TCP 慢启动


:  连接刚建立, CongWin = 1  当连接开始时,指数性增
 慢启动 MSS 加发送速率,直到发生丢
如: MSS = 1460bytes & 失的事件
 AIMD:线性增、乘性减少 
RTT = 200 msec  启动初值很低
 超时事件后的保守策略  初始速率 = 58.4kbps
 但是速度很快
 可用带宽可能 >>
MSS/RTT
 应该尽快加速,到达希望的
速率

Transport Layer 3-127 Transport Layer 3-128


2021中科大网络 2021中科大网络

TCP 慢启动(续) TCP 拥塞控制:AIMD


 当连接开始时,指数性增 乘性减: 加性增:
Host A
加(每个RTT)发送速率
Host B
CongWin 1 当CongWin>阈值时,一个
直到发生丢失事件 CongWin/2 RTT如没有发生丢失事件
,将CongWin加1MSS: 探

RTT
 每一个RTT, CongWin加倍
 每收到一个ACK时, CongWin/2 测
CongWin 1(why)
additively increase window size …
 慢启动阶段:只要不超时或 …. until loss occurs (then cut window in half)
3个重复ack,一个RTT,

congestion window size


cwnd: TCP sender
CongWin加倍
AIMD saw tooth
 总结: 初始速率很慢,但是 behavior: probing
加速却是指数性的 for bandwidth
 指数增加,SS时间很短,长 time
期来看可以忽略
time
Transport Layer 3-129 Transport Layer 3-130

2021中科大网络 2021中科大网络

TCP拥塞控制:AIMD 改进(续)
Q:什么时候应该将
 当收到3个重复的ACKs: 指数性增长变成
思路
 CongWin 减半 线性?
 窗口(缓冲区大小)之后
 3个重复的ACK表示网络 A:在超时之前,当
线性增长 还有一定的段传输能力 CongWin
 超时之前的3个重复的
 当超时事件发生时:
ACK表示“警报”
 CongWin 1
MSS,进入SS阶段
实现:
 之后窗口指数增长
 变量:Threshold
 增长到一个阈值(上次发
生拥塞的窗口的一半)时  出现丢失,Threshold设置成 CongWin的1/2
,再线性增加

Transport Layer 3-131 Transport Layer 3-132


2021中科大网络 2021中科大网络
TCP 发送端拥塞控制
总结: TCP拥塞控制 TCP
以前没有收到 慢启动 CongWin = CongWin + MSS 每一个RTT CongWin 加倍
 CongWin Threshold, 发送端处于慢启动阶段 ACK的data (SS) If (CongWin > Threshold)
被ACKed 状态变成 “CA”
slow-start , 窗口指数性增长 .
以前没有收到 拥塞避 CongWin = CongWin+MSS * 加性增加, 每一个RTT对
 当CongWin Threshold, 发送端处于拥塞避免阶段 ACK的data 免 (CA) (MSS/CongWin) CongWin 加一个 1 MSS
congestion-avoidance , 窗口线性增长 . 被ACKed

 当收到三个重复的 ACKs (triple duplicate ACK), 通过收到3个重 SS or Threshold = CongWin/2, 快速重传, 实现乘性的减 .
复的ACK,发现 CA CongWin = Threshold+3, CongWin 没有变成1
Threshold CongWin/2 丢失的事件 状态变成“CA” MSS.
CongWin=Threshold+3.

 当超时事件发生时 timeout, Threshold=CongWin/2 超时 SS or Threshold = CongWin/2, 进入slow start


CA CongWin = 1 MSS,
CongWin=1 MSS ,进入SS阶段 状态变成“SS”
重复的 ACK SS or 对被ACKed 的segment, 增 CongWin and Threshold
Transport Layer 3-133 CA 加重复ACK的计数 不变 Transport Layer 3-134

2021中科大网络 2021中科大网络

总结: TCP拥塞控制 TCP 吞吐量


New
New
ACK!  TCP的平均吞吐量是多少,使用窗口 window尺寸W和RTT来
duplicate ACK
dupACKcount++
ACK!
new ACK
new ACK
.
cwnd = cwnd + MSS (MSS/cwnd)
描述?
dupACKcount = 0
cwnd = cwnd+MSS transmit new segment(s), as allowed
dupACKcount = 0
L transmit new segment(s), as allowed  忽略慢启动阶段,假设发送端总有数据传输
cwnd = 1 MSS
ssthresh = 64 KB
dupACKcount = 0 slow
cwnd > ssthresh
L congestion  W:发生丢失事件时的窗口尺寸(单位:字节)
start timeout avoidance  平均窗口尺寸( #in-flight字节):3/4W
ssthresh = cwnd/2
cwnd = 1 MSS duplicate ACK
timeout
ssthresh = cwnd/2
dupACKcount = 0
retransmit missing segment
dupACKcount++
 平均吞吐量: RTT时间吞吐3/4W
cwnd = 1 MSS
dupACKcount = 0 3 W
avg TCP thruput = bytes/sec
retransmit missing segment
timeout
New
ACK!
4 RTT
ssthresh = cwnd/2
cwnd = 1 New ACK
dupACKcount = 0 W
retransmit missing segment cwnd = ssthresh dupACKcount == 3
dupACKcount == 3 dupACKcount = 0
ssthresh= cwnd/2 ssthresh= cwnd/2
cwnd = ssthresh + 3 cwnd = ssthresh + 3
retransmit missing segment retransmit missing segment
fast
W/2
recovery
duplicate ACK
cwnd = cwnd + MSS
transmit new segment(s), as allowed

Transport Layer 3-135 Transport Layer 3-136


2021中科大网络 2021中科大网络

TCP 未来: TCP over “long, fat pipes” TCP 公平性


 例如: 1500字节/段, 100ms RTT(往返延迟R=200ms), 公平性目标: 如果 K个TCP会话分享一个链路带宽为R的
如果需要10 Gbps 吞吐量 瓶颈,每一个会话的有效带宽为 R/K
 T=0.75W/R -> 0.75W=TR=12.5MB=83333段
 平均需要窗口大小 0.75W = 83,333 in-flight 在传段 TCP connection 1

 吞吐量用丢失率表示 :

1.22  MSS
T
RTT L bottleneck
router
 ➜ L = 2·10-10 (为了达到10Gbps的吞吐,平均50亿段丢 TCP connection 2
capacity R
失一个) 非常非常小的丢失率!可能远远低于链路的物
理丢失率,达不到的
 如果需要网络带宽增加到未来可用的 10Gbps,那就需要更
新的TCP版本! Transport Layer 3-137 Transport Layer 3-138

2021中科大网络 2021中科大网络

为什么TCP是公平的? 公平性 (续)


2个竞争的TCP会话: 公平性和 UDP 公平性和并行 TCP连接
 加性增加,斜率为 1, 吞吐量增加  多媒体应用通常不是用  2个主机间可以打开多个并
TCP 行的TCP连接
 乘性减,吞吐量比例减少
 应用发送的数据速率希望  Web浏览器
R equal bandwidth share 不受拥塞控制的节制
 例如: 带宽为R的链路支持了
 使用UDP:
9个连接;
 音视频应用泵出数据的速
 如果新的应用要求建 1个TCP连
率是恒定的, 忽略数据的
丢失: 将拥塞窗口减半 接,获得带宽R/10
拥塞避免:线性增加拥塞窗口的值 丢失
丢失: 将拥塞窗口减半  如果新的应用要求建 11个TCP
拥塞避免:线性增加拥塞窗口的值  研究领域: TCP 友好性 连接,获得带宽R/2

Connection 1 throughput R

Transport Layer 3-139 Transport Layer 3-140


2021中科大网络 2021中科大网络

Explicit Congestion Notification (ECN) 第三章 总结(1/2)


网络辅助拥塞控制:  传输层提供的服务  可靠数据传输原理
 TOS字段中2个bit被网络路由器标记,用于指示是否发  应用进程间的逻辑通信
• Vs 网络层提供的是主机到主  问题描述
生拥塞 机的通信服务
 停止等待协议:
 拥塞指示被传送到接收主机  互联网上传输层协议:UDP
TCP • Rdt1.0 rdt2.0,2.1 ,2.2
 在接收方-到发送方的ACK中,接收方(在IP数据报中看 • 特性 Rdt 3.0
到了拥塞指示)设置ECE bit,指示发送方发生了拥塞  多路复用和解复用  流水线协议
TCP ACK segment  端口:传输层的 SAP
source destination • GBN
 无连接的多路复用和解复用
application
ECE=1
application
 面向连接的多路复用和解复用 • SR
transport transport
network network  实例1:无连接传输层协议
link link UDP
physical physical
 多路复用解复用
ECN=00 ECN=11  UDP报文格式
 检错机制:校验和
IP datagram Transport Layer 3-141 Transport Layer 3-142

2021中科大网络 2021中科大网络

第三章 总结( 2/2) 第三章 展望


 实例2:面向连接的  拥塞控制原理 下二章:
传输层协议-TCP  网络辅助的拥塞控制  离开网络“边缘” (应用层和传输层 )
 概述:TCP特性  端到端的拥塞控制  深入到网络的 “核心”
 报文段格式  TCP的拥塞控制  2个关于网络层的章
• 序号,超时机制及时  数据平面
 AIMD
间  控制平面
 慢启动
 TCP可靠传输机制
 超时之后的保守策略
 重传,快速重传
 流量控制
 连接管理
• 三次握手
• 对称连接释放
Transport Layer 3-143 Transport Layer 3-144

You might also like