1、传输层
协议栈层次:application transport network link physical
理解传输层服务的基本理论和基本机制
多路复用/分用
可靠数据传输机制
流量控制机制
拥塞控制机制
掌握Internet的传输层协议
UDP:无连接传输服务
TCP:面向连接的传输服务
TCP拥塞控制
==================================================================
2、传输层概述
传输层协议是为运行在不同Host上的进程提供了一种逻辑通信机制。
逻辑通信机制:两个通信进程之间仿佛是直接连接的,不需要关心之间多远的物理距离,到底经过多少路由器,到底经过多少物理层。
端系统运行传输层协议:
发送方:将应用递交的消息分成一个或多个的Segment,并向下传给网络层。
接收方:将接受到的segment组装成消息,并向上交给应用层。
传输层可以为应用提供多种协议
Internet上的TCP
Internet上的UDP
网络层:提供主机之间的逻辑通信机制
传输层:提供应用进程之间的逻辑通信机制
位于网络层之上
依赖于网络层服务
对网络层服务进行(可能性)增强
可靠、按序的交付服务(TCP)
拥塞控制
流量控制
连接建立
不可靠的交付服务(UDP)
基于“尽力而为”的网络层,没有做(可靠性方面的)扩展
两种服务都不保证
延迟
带宽
==================================================================
3、多路复用/分用
如果某层的一个协议对应直接上层的多个协议/实体,则需要复用/分用。
接收端进行多路分用:
传输层依据头部信息将收到的Segment交给正确的Socket即不同的进程。
发送端进行多路复用:
从多个Socket接收数据,为每块数据封装上头部信息,生产Segment,交给网络层。
分用如何工作?
主机接收到IP数据报(datagram)
每个数据报携带源IP地址、目的IP地址。
每个数据报携带一个传输层的段(Segment)。
每个段携带源端口号和目的端口号。
主机收到Segment后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket。
TCP做更多处理
网络层不关心报文中的端口号信息
无连接分用:
利用端口号创建Socket
UDP的Socket用二元组标识
(目的IP地址,目的端口号)
主机收到UDP段后
检查段中的目的端口号
将UDP段导向绑定在该端口号的Socket
来自不同源IP地址和或源端口号的IP数据包被导向同一个Socket
面向连接的分用
TCP的Socket用四元组标识
源IP地址
源端口号
目的IP地址
目的端口号
接收端利用所有的四个值将Segment导向合适的Socket
服务器可能同时支持多个TCP Socket
每个Socket用自己的四元组标识
Web服务器为每个客户端开不同的Socket
==================================================================
4、UDP协议 User Datagram Protocol
基于Internet IP协议
复用/分用
简单的错误校验
“Best Effort” 服务,UDP段可能
丢失
非按序到达
无连接
UDP发送方和接收方之间不需要握手
每个UDP段的处理独立于其他段
UDP为什么存在?
无需建立连接(减少延迟)
实现简单:无需维护连接状态
头部开销少
没有拥塞控制:应用可更好地控制发送时间和速率
常用于流媒体应用
容忍丢失
速率敏感
UDP还用于
DNS
SNMP
在UDP上实现可靠数据传输?
在应用层增加可靠性机制
应用特定的错误恢复机制
UDP校验和(checksum)
目的:检查UDP段在传输中是否发生错误(如位翻转)
==================================================================
5 、可靠数据传输原理
什么是可靠?
不错、不丢、不乱
可靠数据传输协议
可靠数据传输对应用层、传输层、链路层都很重要
网络Top-10问题
信道的不可靠特性决定了可靠数据传输协议(rdt)的复杂性
可靠数据传输协议基本结构:接口
渐进地设计可靠数据传输协议的发送方和接收方
只考虑单向数据传输
但控制信息双向流动
利用状态机刻画传输协议
Rdt 1.0:可靠信道上的可靠数据传输
底层信道完全可靠
不会发生错误
不会丢弃分组
发送方和接收方的FSM独立
有限状态机 刻画网络协议
Rdt 2.0 产生位错误的信道
底层信道可能翻转分组中的位(bit)
利用校验和检测位错误
如何从错误中恢复?
确认机制:接收方显式地告知发送方分组已正确接收
NAK:接收方显式地告知发送方分组有错误
发送方收到NAK后,重传分组
基于这种重传机制的rdt协议称为ARQ(Automatic Repeat reQuest)协议
Rdt 2.0 中引入的新机制
差错检测
接收方反馈控制消息:ACK/NAK
重传
Rdt 2.1 和 2.2
如果ACK/NAK消息发生错误/被破坏会怎么样?
为ACK/NAK增加校验和,检错并纠错
添加额外的控制消息
如果ACK/NAK坏掉,发送方重传
不能简单的重传:产生重复分组
如何解决重复分组问题
序列号:发送方给每个分组增加序列号
接收方丢弃重复分组
Rdt 2.2 无NAK消息协议
Rdt 3.0
信道既可能发生错误,也可能丢失分组,怎么办?
校验和+序列号+ACK+重传 够用吗?
方法:发送方等待“合理”时间
如果没收到ACK,重传
如果分组或ACK只是延迟而不是丢了
重传会产生重复,序列号机制能够处理
接收方需在ACK中显式地告知所确认的分组
需要定时器
性能分析:
能够正确工作,但性能很差
网络协议限制了物理资源的利用
软硬件协同设计
停等操作是主要原因
==================================================================
6 、流水线机制与滑动窗口协议
流水线协议
允许发送方在收到ACK之前连续发送多个分组
更大的序列号范围
发送方和或接收方需要更大的存储空间以缓存分组
滑动窗口协议
窗口:允许使用的序列号范围,窗口尺寸为N,最多有N个等待确认的消息
滑动窗口:随着协议的运行,窗口在序列号空间内向前滑动
滑动窗口协议:GBN SR
GO-Back-N协议
分组头部包含k-bit序列号
窗口尺寸为N,最多允许N个分组未确认
ACK(n):确认到序列号n(包含n)的分组均已被正确接收,累计确认
可能收到重复ACK
为空中的分组设置计时器(timer)
超时Timer(n)事件:重传序列号大于等于n,还未收到ACK的所有分组(潜在的资源浪费)
接收方:乱序到达的分组直接丢弃,接收方只接受序列号最大的,按序到达的分组。
ACK机制,发送拥有最高序列号的,已被正确接收的分组的ACK。
可能产生重复ACK,只需要记住唯一的expectedseqnum。
Selective Repeat (SR)协议
GBN的缺陷:
会重传很多分组,导致网络中充斥着很多重传的分组。
接收方对每个分组单独进行确认
设置缓存机制,缓存乱序到达的分组
发送方只重传那些没收到ACK的分组
为每个分组设置定时器
发送方窗口
N个连续的序列号
限制已发送且未确认的分组
SR存在的问题:
序列号空间大小与窗口尺寸关系
分组分为:窗口发送方 窗口结构
已经确认的分组
已经发送了但未确认的分组
可用的序列号,可以用来发送的
不能使用的序列号,窗口还未滑动到
可靠数据传输原理与协议回顾
信道的(不可靠)特性
可靠数据传输的需求
Rdt 1.0
Rdt 2.0 rdt 2.1 rdt 2.2
Rdt 3.0
流水线与滑动窗口协议
GBN
SR
==================================================================
7、TCP概述
点对点:一个发送方,一个接收方
可靠的、按序的字节流
流水线机制
TCP拥塞控制和流量控制机制动态调整窗口尺寸。
设置窗口尺寸
发送方/接收方缓存
全双工
同一连接中能够传输双向数据流
面向连接
通信双方在发送数据之前必须建立连接
连接状态只在连接的两端中维护,在沿途节点中并不维护状态
TCP连接包括:两台主机上的缓存、连接状态变量、socket等
流量控制机制
7.1TCP段结构
序列号
序列号指的是segment中的第一个字节的编号
而不是segment的编号
建立TCP连接时,双方随机选择序列号
ACKs
希望接收到的下一个字节的序列号
累计确认:该序列号之前的所有字节均已被正确接收到
7.2TCP可靠数据传输
TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务
流水线机制:
累积确认:像GBN
TCP使用单一重传定时器
触发重传的事件
超时
收到重复ACK
渐进式
暂不考虑重复ACK
暂不考虑流量控制
暂不考虑拥塞控制
TCP RTT和超时
如何设置定时器的超时时间?
大于RTT:但是RTT是变化的
过短:不必要的重传
过长:对段丢失时间反应慢
TCP发送方事件:
从应用层收到数据
创建Segment
序列号是Segment的第一个字节的编号
开启计时器
设置超时时间:TimeOutInterval
超时
重传引起超时的Segment
重启定时器
收到ACK
如果确认此前未确认的Segment
更新SendBase
如果窗口中还有未被确认的分组,重新启动定时器
TCP重传示例:
快速重传机制:
TCP的实现中,如果发生超时,超时时间间隔将重新设置,即将超时时间间隔加倍,导致其很大
通过重复ACK检测分组丢失
Sender会背靠背地发送多个分组
如果某个分组丢失,可能会引发多个重复的ACK
如果Sender收到对同一数据的3个ACK,则假定该数据之后的段已经丢失
快速重传:在定时器超时之前即进行重传。
为什么是3次?
3.7.3TCP流量控制
接收方为TCP连接分配buffer
上层应用可能处理buffer中数据的速度较慢
流量控制就是:发送方不会传输的太多、太快以至于淹没接收方(buffer溢出)
速度匹配机制
(假定TCP Receiver 丢弃乱序的 segments)
Buffer中的可用空间
Receiver通过在Segment的头部字段将RcvWindow告诉Sender
Sender限制自己已经发送的但还未收到ACK的数据不超过接收方的空闲RcvWindow尺寸
Receiver告知Sender Rcvwindow=0, 会出现什么情况?
7.4TCP连接管理
TCP sender和receiver 在传输数据前需要建立连接
初始化TCP变量
Seq.#
Buffer和流量控制信息
Client:连接发起者
Server:等待客户连接请求
3次握手:
Step 1: client host sends TCP SYN segment to server
Specifies initial seq.#
No data
Step 2: server host receives SYN, replies with SYNACK segment
Server allocates buffers 分配缓存
Specifies server initial seq.# 选择自己初始序列号,告知客户端
Step 3: client receivers SYNACK, replies with ACK segment, which may contain data
为什么要3次握手?
TCP是双向传递的,必须保证双方都能收发,且保证互相知道对方都能收发
7.5拥塞控制 更像是社会问题
太多发送主机发送了太多数据或者发送速度太快,以至于网络无法处理
表现:
分组丢失(路由器缓存溢出)
分组延迟过大(在路由器缓存中排队)排队延迟
拥塞控制 vs 流量控制
流量控制是发送方不要发送得太快,让接收方承受不了
拥塞控制室让网络承受不了
拥塞的另一个代价
当分组被drop时,任何用于该分组的“上游”传输能力全都被浪费掉。
如何进行拥塞控制:在传输层在做,为什么,要思考一下
控制网络负载:管制发送方的发送速率
端到端拥塞控制
网络层不需要显式的提供支持
端系统通过观察loss,delay等网络行为判断是否发生拥塞
TCP采用这种方法
网络辅助的拥塞控制
路由器向发送方显式地反馈网络拥塞信息
简单的拥塞指示
指示发送方应该采取何种速率
ABR:available bit rate
弹性服务
如果发送方路径
Underloaded
使用可用带宽
如果发送方路径拥塞
将发送速率降到最低保障速率
RM (resource management) cells
发送方发送
交换机设置 RM cell 位 (网络辅助)
NI bit : rate不许增长
CI bit : 拥塞指示
RM cell 由接收方返回给发送方
在RM cell中有显式的速率(ER)字段:两个字节
拥塞的交换机可以将ER置为更低的值
发送方获知路径所能支持的最小速率
数据cell中的EFCI位:拥塞的交换机将其设为1
如果RM cell前面的data cell的EFCI位被设为1,那么发送方在返回的RM cell中置CI位。
7.6 TCP拥塞控制机制
TCP拥塞控制面临3个问题:
如何控制发送速率?
Sender限制发送速率:
CongWin: 拥塞窗口 是一个变量 LastByteSent-LastByteAcked<=CongWin
Rate=CongWin/RTT
动态调整以改变发送速率
反映所感知到的网络拥塞
如何感知网络拥塞?
Loss事件=timeout或3个重复ACK
发生loss时间后,发送方降低速率
如何合理地调整发送速率?
加性增-乘性减:AMID
慢启动:SS
AMID
原理:逐渐增加发送速率,谨慎探测可用带宽,直到发生loss
方法:AIMD
Additive Increase: 每个RTT将CongWin增大一个MSS,拥塞避免
Multiplicative Decrease: 发生loss后将CongWin 减半
TCP慢启动:SS
TCP连接建立时,CongWin=1
可用带宽可能远远高于初始速率
希望快速增长
原理:
当连接开始时,指数性增长
指数性增长:
每个RTT将CongWin翻倍
收到每个ACK进行操作
初始速率很慢,但是快速攀升
Threshold变量:
如何从指数性增长变成线性增长(拥塞避免)?
当CongWin达到Loss事件前值的1/2时
实现方法:
变量Threshold
Loss事件发生时,Threshold被设为Loss事件前CongWin值得1/2.
Loss事件的处理:
3个重复ACKs
CongWin切到一半
然后线性增长
Timeout事件
CongWin直接设为1个MSS(Maximum Segment Size)
然后指数增长
达到threshold后,再线性增长
3个重复ACKs表示网络还能够传输一些segment
Timeout事件表明拥塞更为严重
TCP拥塞控制算法
7.7 TCP性能
TCP throughput 吞吐率
给定拥塞窗口大小和RTT,TCP的平均吞吐率是多少?
忽略掉Slow start
假定发生超时时CongWin的大小为W,吞吐率W/RTT
超时后,CongWin=W/2,吞吐率是W/2RTT
平均吞吐率为:0.75W/RTT
吞吐率和丢包率的关系
高速网络下,需要重新设计TCP
TCP的公平性
如果K个TCP Session 共享相同的瓶颈带宽R,那么每个Session的平均速率为R/K。
多媒体应用通常不适用TCP,以免被拥塞控制机制限制速率,使用UDP:以恒定速率发送,能够容忍丢失
产生了不公平
公平性与并发TCP连接
某些应用会打开多个并发连接
Web浏览器
产生公平性问题
UDP的分组称为 用户数据报
TCP的分组称为报文段 segment
Packet 分组
一个数据包切割成很多段segment
确认机制 Acknowledgement ACK
ACK NAK
利用校验和检测底层信道可能产生的位错误
可靠数据传输 RDT:不错、不丢、不乱
可靠数据传输协议基本结构:接口
Rdt_send()
Udt_send()
Rdt_rcv()
Deliver_data()
状态机 (Finite State Machine FSM) 刻画传输协议
状态表明当前发送方的分组序列号
接收方的所处状态提供了期望收到的分组序列号
Rdt1.0:
Rdt2.0: 增加了ACK/NAK机制
Rdt2.1: 序列号(Sequence number)解决重复分组的问题
Rdt2.2 无NAK消息协议
(以上是信道可能发生错误的假设,ACK出错)
Rdt3.0:(丢失分组可能,或者分组或ACK只是延迟而不是丢了),发送方要设置等待合理时间,这个时间不好设置,需要定时器
流水线机制:停-等协议效率太低,允许发送方在收到ACK之前连续发送多个分组
滑动窗口协议:允许使用序列号的范围,窗口在序列号空间内向前滑动。