00 sendbase= initial sequence number TcP:可 01 nextseqnum= initial sequence number 03 loop(forever)i 靠数据传 04 switch(event) 05 event: data received from application above create TCP segment with sequence number nextseqnum 输 start timer for segment nextseqnur 08 pass segment to IP 09 nextseqnum= nextseqnum length(data 10 event: timer timeout for segment with sequence number retransmit segment with sequence number compue new timeout interval for segment y 简化的 restart timer for sequence number TCP 14 event: ACK received with acK field value of 15 if y >sendbase)(/* cumulative ACK of all data up to y * 发送方 16 cancel all timers for segments with sequence numbers <y sendbase=y 18 19 else/ a duplicate ACK for already ACKed segment*/ increment number of duplicate ACKs received fory 21 if(number of duplicate ACKS received fory = 3) 22 / tCP fast retransmit * 23 resend segment with sequence number restart timer for segment y 25 3/end of loop forever */ 主讲人:西安交通大学程向前 第4讲传输层之二46
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-6 TCP: 可 靠数据传 输 00 sendbase = initial_sequence number 01 nextseqnum = initial_sequence number 02 03 loop (forever) { 04 switch(event) 05 event: data received from application above 06 create TCP segment with sequence number nextseqnum 07 start timer for segment nextseqnum 08 pass segment to IP 09 nextseqnum = nextseqnum + length(data) 10 event: timer timeout for segment with sequence number y 11 retransmit segment with sequence number y 12 compue new timeout interval for segment y 13 restart timer for sequence number y 14 event: ACK received, with ACK field value of y 15 if (y > sendbase) { /* cumulative ACK of all data up to y */ 16 cancel all timers for segments with sequence numbers < y 17 sendbase = y 18 } 19 else { /* a duplicate ACK for already ACKed segment */ 20 increment number of duplicate ACKs received for y 21 if (number of duplicate ACKS received for y == 3) { 22 /* TCP fast retransmit */ 23 resend segment with sequence number y 24 restart timer for segment y 25 } 26 } /* end of loop forever */ 简化的 TCP 发送方
TCP ACK规则[RFc11221RFC2581 事件 TCP接收方的动作 有序数据段到达, 延迟ACK.等待500ms 没有缺失的段, 看是否还有数据段到达.如果没有, 所有其他数据段已经 ACKed 发送ACK 有序数据段到达, 立即发送一个 没有缺失的段, 积欠的ACK 有一个延迟ACK等待 失序数据段到达 发送重复的ACK,说明seq.# seq.#高于预期值 为下一个期望的字节 测到间隔 到达的数据段部分或全部填满 立即ACK,如果数据段处于缺失的 了缺失的段 段的较低端 主讲人:西安交通大学程向前 第4讲传输层之二47
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-7 TCP ACK 规则 [RFC 1122, RFC 2581] 事件 有序数据段到达, 没有缺失的段, 所有其他数据段已经 ACKed 有序数据段到达, 没有缺失的段, 有一个延迟 ACK 等待 失序数据段到达 seq. # 高于预期值 测到间隔 到达的数据段部分或全部填满 了缺失的段 TCP 接收方的动作 延迟 ACK. 等待 500ms 看是否还有数据段到达. 如果没有, 发送ACK 立即发送一个 积欠的 ACK 发送重复的 ACK, 说明 seq. # 为下一个期望的字节 立即 ACK,如果数据段处于缺失的 段的较低端
TCP:重传场景 Host A Host B e s92 8b yte lata Seq=92, 8 bytes data 20 by ACK=100 ta OSs Se S 92,8 8b data sd CK fime fime 丢失ACK场景 过早超时 积欠ACK 主讲人:西安交通大学程向前 第4讲传输层之二48
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-8 TCP: 重传场景 Host A loss timeout time 丢失 ACK 场景 Host B X Host A Seq=92 timeout time 过早超时, 积欠 ACKs Host B Seq=100 timeout
TCP流量控制 流量控制 接收端:显式通知发送 发送端不可发送的太多 端(动态变化中的 、太快以至于使得接收 端的缓存溢出 自由缓存空间 o RcyWindow TCcP数据段的字 RcvBuffer=接收端的TCP缓存大小 段 RcvWindow=缓存中空闲的部分 发送端:需要保存已经 Rey Window 发送, unACKed数 据可少于最近收到的 data from TCP application re room RcVWindow process in buffer RcvBuffer 接收端缓存 主讲人:西安交通大学程向前 第4讲传输层之二49
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-9 TCP 流量控制 接收端: 显式通知发送 端 (动态变化中的) 自由缓存空间 RcvWindow TCP 数据段的字 段 发送端: 需要保存已经 发送, unACKed 数 据可少于最近收到的 RcvWindow 发送端不可发送的太多 、太快以至于使得接收 端的缓存溢出 流量控制 接收端缓存 RcvBuffer = 接收端的 TCP 缓存大小 RcvWindow = 缓存中空闲的部分
TCP交互的往返时间(RTT)和超时 Q:如何设置TCP超时Q:如何估算RTT? 的值? 口 SampleRTT:对数据段发送到收到 口应较RTT长一点 AcK回应的时间进行测量 o注意:RTT会变哟! o忽略重传,积欠 ACKed数据段 口太短了:过早出现超时 口Samp1eRTT是会变化的,要使得 造成不必要的重传 估算的RTT“更平滑” 口太长了:减缓了对数据段 o使用若干新近的测量结果,而不 丢失的反应 仅仅是最近一次的 SamplertT 主讲人:西安交通大学程向前 第4讲传输层之二4-10
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-10 TCP 交互的往返时间(RTT)和超时 Q: 如何设置 TCP 超时 的值? 应较RTT长一点 注意: RTT 会变哟! 太短了: 过早出现超时 造成不必要的重传 太长了: 减缓了对数据段 丢失的反应 Q: 如何估算 RTT? SampleRTT: 对数据段发送到收到 ACK 回应的时间进行测量 忽略重传, 积欠 ACKed 数据段 SampleRTT 是会变化的, 要使得 估算的 RTT “更平滑” 使用若干新近的测量结果, 而不 仅仅是最近一次的 SampleRTT