1、1/,第 16 讲 传输层(2),2/,知识回顾,传输层的作用 端口 TCP和UDP的区别和联系 UDP报文,3/,本讲内容和教学目标,掌握TCP 报文段的首部格式 理解TCP 可靠传输的工作原理 停止等待协议 连续ARP协议 理解TCP可靠传输的实现,TCP 首部,20 字节的 固定首部,目 的 端 口,数据 偏移,检 验 和,选 项 (长 度 可 变),源 端 口,序 号,紧 急 指 针,窗 口,确 认 号,保 留,F I N,32 bit,S Y N,R S T,P S H,A C K,U R G,比特 0 8 16 24 31,填 充,TCP 数据部分,TCP 首部,TCP 报文段,I
2、P 数据部分,IP 首部,发送在前,TCP报文段,5/,TCP伪首部,typedef struct tsd_hdr /定义TCP伪首部 unsigned long saddr; /源地址 unsigned long daddr; /目的地址 char mbz; char ptcl; /协议类型 unsigned short tcpl; /TCP长度 PSD_HEADER;,6/,最大报文段长度 MSS,附加选项 长度可变。 TCP 只规定了一种选项,即最大报文段长度 MSS (Maximum Segment Size)。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是
3、 MSS 个字节。” MSS的默认值是536。因为Internet上,默认的MTU是576字节。由于采用了MSS作为选项,所以TCP连接不会溢出。MSS (Maximum Segment Size) 是 TCP 报文段中的数据字段的最大长度。 数据字段加上 TCP 首部 才等于整个的 TCP 报文段。,7/,TCP 的数据编号与确认,TCP 协议是面向字节的。TCP 将所要传送的报文看成是字节组成的数据流,并使每一个字节对应于一个序号。 在连接建立时,双方要商定初始序号。 TCP 每次发送的报文段的首部中的序号字段数值表示该报文段中的数据部分的第一个字节的序号。TCP 的确认是对接收到的数据的
4、最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号加 1。因此确认号表示接收端期望下次收到的数据中的第一个数据字节的序号。,8/,TCP的功能,在TCP/IP协议中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。,9/,TCP功能c
5、ont.,TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。 TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。计算方法同UDP。,10/,停止等待协议,(a) 无差错情况,A,发送 M1,确认 M1,B,发送 M2,发送 M3,确认 M2,确认 M3,A,发送 M1,B,超时重传 M1,发送 M2,确认 M1,丢弃有差错 的报文,(b) 超时重传,t,t,t,t,11/
6、,请注意,在发送完一个分组后,必须暂时保留已发送的分组的副本。 分组和确认分组都必须进行编号。 超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。,12/,确认丢失和确认迟到,A,发送 M1,B,超时 重传 M1,发送 M2,丢弃 重复的 M1 重传确认 M1,(a) 确认丢失,确认 M1,A,发送 M1,B,超时 重传 M1,发送 M2,丢弃 重复的 M1 重传确认M1,(b) 确认迟到,确认 M1,收下迟到 的确认 但什么也不做,t,t,t,t,13/,可靠通信的实现,使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。 这种可靠传输协议常称为自动重传请求
7、ARQ (Automatic Repeat reQuest)。 ARQ 表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组 。,14/,信道利用率,停止等待协议的优点是简单,但缺点是信道利用率太低。,TD,RTT,A,TD + RTT + TA,B,分组,确认,t,t,分组,确认,15/,信道的利用率 U,(5-3),16/,流水线传输,发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。 由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。,B,分组,t,t,A,ACK,17/,连续 ARQ 协议,1,2,3,4,5,6,7,8,9,10
8、,11,12,(a) 发送方维持发送窗口(发送窗口是 5),发送窗口,18/,累积确认,接收方一般采用累积确认的方式。即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。 累积确认有的优点是:容易实现,即使确认丢失也不必重传。缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。,19/,Go-back-N(回退 N),如果发送方发送了前 5 个分组,而中间的第 3 个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。 这就叫做 Go-back-N(
9、回退 N),表示需要再退回来重传已发送过的 N 个分组。 可见当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。,20/,TCP 可靠通信的具体实现,TCP 连接的每一端都必须设有两个窗口一个发送窗口和一个接收窗口。TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。TCP 两端的四个窗口经常处于动态变化之中。 TCP连接的往返时间 RTT 也不是固定不变的。需要使用特定的算法估算较为合理的重传时间。,21/,TCP 可靠传输的实现 以字节为单位的滑动窗口,前移,不允许发送,已发送并 收到确认,A 的发送窗口 = 20,允许发送的序号,26,27
10、,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,B 期望 收到的序号,前沿,后沿,前移,收缩,根据 B 给出的窗口值 A 构造出自己的发送窗口,TCP 标准强烈不赞成 发送窗口前沿向后收缩,22/,不允许发送,已发送并 收到确认,A 的发送窗口位置不变,允许发送但尚未发送,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,已发送但未收到确认
11、,56,P1,P2,P3,不允许接收,已发送确认 并交付主机,B 的接收窗口,允许接收,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,未按序收到,可用窗口,A 发送了 11 个字节的数据,P3 P1 = A 的发送窗口(又称为通知窗口) P2 P1 = 已发送但尚未收到确认的字节数 P3 P2 = 允许发送但尚未发送的字节数(又称为可用窗口),23/,允许发送但尚未发送,A 的发送窗口向前滑动,26,27,28,29,30,31,32,33,34,35,3
12、6,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,已发送并收到确认,不允许 发送,已发送 但未收到确认,56,P1,P2,P3,允许接收,B 的接收窗口向前滑动,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,已发送确认 并交付主机,不允许 接收,56,未按序收到,A 收到新的确认号,发送窗口向前滑动,先存下,等待缺少的 数据的到达,24/,不允许 发送,已发送并收到确认,A 的发送窗口已满,有效
13、窗口为零,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,已发送但未收到确认,56,P1,P2,P3,A 的发送窗口内的序号都已用完, 但还没有再收到确认,必须停止发送。,25/,发送缓存,最后被确认 的字节,发送应用程序,发送缓存,最后发送 的字节,发送窗口,已发送,TCP,序号增大,26/,接收缓存,接收应用程序,已收到,接收窗口,TCP,接收缓存,下一个读取 的字节,序号增大,下一个期望收到的 字节(确认号),27/,发送缓存与接收缓存的作用,发送缓存用来暂
14、时存放:发送应用程序传送给发送方 TCP 准备发送的数据;TCP 已发送出但尚未收到确认的数据。 接收缓存用来暂时存放:按序到达的、但尚未被接收应用程序读取的数据;不按序到达的数据。,28/,需要强调三点,A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。 TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。 TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。,29/,超时重传时间的选择,重传机制是 TCP 中最重要和最复杂的问题之一。 TCP 每发送一个报文段,就对这个报文
15、段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。,30/,往返时延的方差很大,由于 TCP 的下层是一个互联网环境,IP 数据报所选择的路由变化很大。因而运输层的往返时间的方差也很大。,时间,数据链路层,T1,T2,T3,往返时间的 概率分布,31/,加权平均往返时间,TCP 保留了 RTT 的一个加权平均往返时间 RTTS(这又称为平滑的往返时间)。 第一次测量到 RTT 样本时,RTTS 值就取为所测量到的 RTT 样本值。以后每测量到一个新的 RTT 样本,就按下式重新计算一次 RTTS:新的 RTTS (1 ) (旧的 RTTS) (新的 RTT 样本
16、) (5-4) 式中,0 1。若 很接近于零,表示 RTT 值更新较慢。若选择 接近于 1,则表示 RTT 值更新较快。 RFC 2988 推荐的 值为 1/8,即 0.125。,32/,往返时间 RTT?,往返时间的测量相当复杂,TCP 报文段 1 没有收到确认。重传(即报文段 2)后,收到了确认报文段 ACK。 如何判定此确认报文段是对原来的报文段 1 的确认,还是对重传的报文段 2 的确认?,发送一个 TCP 报文段,超时重传 TCP 报文段,收到 ACK,时间,1,2,往返时间 RTT?,是对哪一个报文段 的确认?,33/,Karn 算法,在计算平均往返时间 RTT 时,只要报文段重传
17、了,就不采用其往返时间样本。 这样得出的加权平均往返时间 RTTS 和超时重传时间 RTO 就较准确。,34/,TCP 进行流量控制的原因,在 TCP 报文段首部的窗口(WIN)字段写入的数值就是当前给对方设置的发送窗口数值的上限。 发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。 一般说来,总是希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。 利用
18、滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。,35/,TCP 采用大小可变的滑动窗口进行流量控制。窗口大小的单位是字节。,TCP的流量控制,36/,收到确认即可前移,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701,801,1,可发送,不可发送,滑动窗口,发送端要发送 900 字节长的数据,划分为 9 个 100 字节长的报文段,而发送窗口确定为 500 字节。 发送端只要收到了对方的确认,发送窗口就可前移。 发送 TCP 要维护一个指针。每发送一个报文段,指针就向前移动一个报文段的距离。,37/,收到确
19、认即可前移,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701,801,1,不可发送,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701,801,1,发送窗口,可发送,不可发送,发送窗口前移,滑动窗口cont.,发送端已发送了 400 字节的数据,但只收到对前 200 字节数据的确认,同时窗口大小不变。 现在发送端还可发送 300 字节。,38/,100,200,300,400,500,600,700,800,900,101,201,301,4
20、01,501,601,701,801,1,已发送 并被确认,已发送但 未被确认,可发送,不可发送,指针,100,200,300,400,500,600,700,800,900,101,201,301,401,501,601,701,801,1,不可 发送,指针,发送窗口前移,发送端收到了对方对前 400 字节数据的确认,但对方通知发送端必须把窗口减小到 400 字节。 现在发送端最多还可发送 400 字节的数据。,滑动窗口cont.,39/,seq = 1, DATA,seq = 201, DATA,seq = 401, DATA,seq = 301, DATA,seq = 101, DATA
21、,seq = 201, DATA,seq = 501, DATA,ACK = 1, ack = 201, rwnd = 300,ACK = 1, ack = 601, rwnd = 0,ACK = 1, ack = 501, rwnd = 100,A,B,允许 A 发送序号 201 至 500 共 300 字节,A 发送了序号 101 至 200,还能发送 200 字节,A 发送了序号 301 至 400,还能再发送 100 字节新数据,A 发送了序号 1 至 100,还能发送 300 字节,A 发送了序号 401 至 500,不能再发送新数据了,A 超时重传旧的数据,但不能发送新的数据,允许 A 发送序号 501 至 600 共 100 字节,A 发送了序号 501 至 600,不能再发送了,不允许 A 再发送(到序号 600 为止的数据都收到了),丢失!,流量控制举例,A 向 B 发送数据。在连接建立时, B 告诉 A:“我的接收窗口 rwnd = 400(字节)”。,40/,本讲小结,TCP 报文段的首部 TCP 如何利用数据编号与确认保证可靠传输 TCP可靠传输的实现 TCP的流量控制 滑动窗口,41/,作业,P221, 20,21,23,24,28,31,