【计算机网络】第三章 传输层(3)
五.滑动窗口协议
1. 流水线机制:提高资源利用率
(1)允许发送方在收到ACK之前连续发送多个分组
(2)需要更大的序列号范围
(3)发送方/接收方需要更大的存储空间以缓存分组
2. 滑动窗口协议(Sliding-window protocol)
(1)窗口:允许使用的序列号问题
(2)滑动窗口:随着协议的运行,窗口在序列号空间内向前滑动
(3)滑动窗口协议:GBN,SR
3. Go-Back-N协议
(1)发送方
·分组头部包含k-bit序列号
·窗口尺寸为N,表示最多有N个等待确认的消息
·ACK(n):确认到序列号n的分组均已被正确接收
·为空中的分组设置计时器
·超时事件:重传序列号大于等于n,还未收到ACK的全部分组
·发送方扩展FSM
(2)接收方
·ACK机制:发送拥有最高序列号的、已被正确接收的分组的ACK
·乱序到达的分组:直接丢弃,重新确认序列号最大的、按序到达的分组
4. Selective Repeat协议
(1)GBN的缺陷:网络中产生许多重复分组,导致效率降低
(2)解决办法
·接收方对每个分组单独确认,设置缓存机制,接收乱序到达的分组
·发送方只重传那些没收到ACK的分组,为每个分组设置定时器
·发送方窗口使用N个连续序列号,限制已发送且未确认的分组
(3)困境:无法区分相同序列号是后续分组还是重传
(4)若序列号位数为k,窗口尺寸需满足Ns + Nr <= 2^k
六.TCP协议
1. 概述
(1)点对点,可靠,按序
(2)流水线机制:TCP拥塞控制和流量控制机制设置窗口尺寸
(3)全双工:同一连接中传输双向数据流
(4)面向连接
·通信双方在发送数据之前必须建立连接
·连接状态只在连接的两端中维护,在沿途节点不维护
·TCP连接包括:两台主机上的缓存、连接状态变量、socket等
2. TCP段结构
(1)序列号:segment中第一个字节的编号,建立TCP连接时,双方随机选择
(2)ACK编号:希望接收到的下一个字节的序列号,累计确认
(3)对乱序到达的segment,无规范规定,由TCP实现者决策
3. TCP可靠数据传输
(1)概述
·单一重传定时器
·触发重传的事件:超时、收到重复ACK
·渐进式:暂不考虑重复ACK、流量控制和拥塞控制
(2)RTT和超时
·定时器的超时时间:大于RTT
·RTT的估计:测量从段发出去到收到ACK的时间,即SampleRTT,测量多个SampleRTT求平均值,形成RTT估计值EstimatedRTT
·指数加权移动平均:EstimatedRTT = (1 - α) * EstimatedRTT + α * SampleRTT (α通常为0.125)
(3)定时器超过时间的设置:EstimatedRTT + 安全边界
·RTT变化值:DevRTT = (1 - β) * DevRTT + β * |SampleRTT - EstimatedRTT| (β通常为0.25)
·TimeoutInterval = EstimatedRTT + 4 * DevRTT
4. TCP发送方事件
(1)从应用层收到数据
·创建Segment,序列号是第一个字节的编号
·开启计时器,设置超时时间
(2)超时:重传引起超时的Segment,重启定时器
(3)收到ACK:如果确认此前未确认的Segment,更新SendBase,若窗口中还有未被确认的分组,重新启动定时器
5. TCP接收方事件
(1)ACK生成:RFC 1122,RFC 2581
·到达按序段,在此段前所有segment都已确认:等待500ms后无后续段,确认
·到达按序段,在此段前有一个segment等待确认:立刻发送ACK,确认两个段
·到达乱序段:立刻发送重复ACK
(2)快速重传机制
·TCP实现中,发生超时后,时间间隔会重新设置,等于加倍,重发分组要等待许久
·通过重复ACK检测分组丢失:发送方背靠背地发送多个分组,收到同一数据的三个ACK则假定该数据之后的段已丢失
6. TCP流量控制
(1)接收方为TCP连接分配buffer:由于上层应用可能处理数据较慢,发送方不会发送太快或太多
(2)假定TCP receiver丢弃乱序的segments,Buffer中的可用空间为:RcvWindow = RcvBuffer - |LastByteRcvd - LastByteRead|
(3)接收方通过segment得头部字段将RcvWindow告诉发送方,即使RcvWindow为0,也可以再发送一个极小段
7. TCP连接管理
(1)建立连接
·初始化TCP变量:Seq#,Buffer和流量控制信息
·Client:连接发起者
·Server:等待客户连接请求
(2)三次握手
·客户端发送SYN段:表示建立连接,无数据,初始化seq#
·服务器接收SYN,回复SYNACK,分配缓存,选择序列号,告知客户端
·客户端收到SYNACK,答复ACK,确认已收到同意连接的报文段
(3)关闭连接:clientSocket.close()
·客户端向服务器发送TCP FIN控制段
·服务器收到FIN,回复ACK,关闭连接,发送FIN
·客户端收到FIN,回复ACK,进入等待(通常30s),如果收到FIN,重新发送ACK
·服务器收到ACK,连接关闭