第4讲传输层之二 本讲目的: 本讲概述: 口 Interne传输层 的实现和实例 口面向连接的传输:TCP 教科书参考 o可靠传输 o流量控制 o第8章 o连接管理 TCP拥塞控制 口拥塞控制原则 主讲人:西安交通大学程向前 第4讲传输层之二41
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-1 第4讲 传输层之二 本讲目的: Internet传输层 的实现和实例 教科书参考 第8章 本讲概述: 面向连接的传输: TCP 可靠传输 流量控制 连接管理 TCP拥塞控制 拥塞控制原则
TCP:概述 RFcs:793.1122.1323.2018.2581 口点对点 T全双工数据传输: 个发送方,一个接收方 o在同一连接上双向传输 口可靠,按序的字节流: o MSS: maximum o无“报文边界”,无结构 segment size(最大段字 但有顺序 节数-1500,536,512) 口流水式控制: 口面向连接: oTcP的拥塞和流量控制,设 o握手过程(交换控制信息) 置窗口大小 在交换数据前初始化收发 双方的状态,“三次握手” 口发送&接做缓存 口流量控制: application socket writes data O发送方的发送速度不得超 door TCP TCP 过接收方的处理速度 send buffer receive buffo 主讲人:西安交通大学程向前 第4讲传输层之二42
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-2 TCP: 概述 RFCs: 793, 1122, 1323, 2018, 2581 全双工数据传输: 在同一连接上双向传输 MSS: maximum segment size(最大段字 节数-1500,536,512) 面向连接: 握手过程 (交换控制信息) 在交换数据前初始化收发 双方的状态, “三次握手” 流量控制: 发送方的发送速度不得超 过接收方的处理速度 点对点: 一个发送方, 一个接收方 可靠, 按序的字节流 : 无 “报文边界”,无结构 但有顺序 流水式控制: TCP的拥塞和流量控制,设 置窗口大小 发送& 接收缓存 socket door TCP send buffer TCP receive buffer socket door segment application writes data application reads data
TcP段格式(p238) 32 bits URG: urgent data source port dest port 按发送数据的字 (一般不用) sequence number 节计算 ACK: ACK acknowledgement number (不是按段数!) va UAPRSFI rcvr window size PSH: push data now len used (一般不用) checksum ptr urgent data bytes 接收方愿意 RST SYN. FIN Options(可变长度MSS 接受的 connection estab (setup, teardown commands) 应用数据 (可变长度) Internet checksum (as in UDP) 主讲人:西安交通大学程向前 第4讲传输层之二43
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-3 TCP 段格式(p238) source port # dest port # 32 bits 应用数据 (可变长度) sequence number acknowledgement number rcvr window size checksum ptr urgent data UAP RSF head len not used Options (可变长度-MSS) URG: urgent data (一般不用) ACK: ACK # valid PSH: push data now (一般不用) RST, SYN, FIN: connection estab (setup, teardown commands) # bytes 接收方愿意 接受的 按发送数据的字 节计算 (不是按段数!) Internet checksum (as in UDP)
TCP seq.#s和ACKs Sea, #5s Host a st B o该数据段第一个字节 在(整个报文)字节 流中“编号 bes Seq=42, ACK=79, data=C ACKs: host ACKs receipt of oseq#为预期从对方 发来的“下一个”字 Seq=79, ACK=43, data=C'C echoes back c 节的编号 积累的AcK host ACks Q:接收方如何接受失序的cep 数据段 of echoed Seq=43, ACK=80 OA:TCP没有定义 由程序设计者决定 fime 简单的tene↑场景 主讲人:西安交通大学程向前 第4讲传输层之二44
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-4 TCP seq. #’s 和 ACKs Seq. #’s: 该数据段第一个字节 在(整个报文)字节 流中 “编号” ACKs: seq #为预期从对方 发来的“下一个”字 节的编号 积累的 ACK Q: 接收方如何接受失序的 数据段 A: TCP 没有定义, - 由程序设计者决定 Host A Host B User types ‘C’ host ACKs receipt of echoed ‘C’ host ACKs receipt of ‘C’, echoes back ‘C’ time 简单的 telnet 场景
TCP:可靠数据传输 event: data received from application above 简化的发送方,假设 create, send segment 单向数据传输 无流量,拥塞控制 wait event: timer timeout for fc segment with seq# y or event retransmit segment event: AcK received with ACK #y ACK processing 主讲人:西安交通大学程向前 第4讲传输层之二45
主讲人:西安交通大学 程向前 第4讲 传输层之二 4-5 TCP: 可靠数据传输 简化的发送方, 假设 wait for event wait for event event: data received from application above event: timer timeout for segment with seq # y event: ACK received, with ACK # y create, send segment retransmit segment ACK processing •单向数据传输 •无流量, 拥塞控制
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