计算机网络:TCP与UDP(二)

时间:2022-03-26 14:37:10

TCP报文段的首部格式

一个TCP报文段分为首部和数据两部分。

TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项。因此TCP首部的最小长度是20字节。

首部固定部分个字段的意义如下:

  • 源端口:2个字节
  • 目的端口:2个字节
  • 序号:4个字节。序号范围为0-2^32-1,当序号增加到2^32-1后,就重新从0开始。
    TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。
    首部中的序号字段指的是本报文段发送的数据的第一个字节的序号
  • 确认号:4个字节。是期望收到对方下一个报文段的第一个数据字节的序号。
    例子:A向B发送了一个报文段,序号字段为501,数据长度为200,这表明B收到了A发送的到700为止的数据。因此B期望收到的下一个数据序号是701,于是B发给A的确认报文中确认号置为701。
    即,若确认号为N,则表明到序号N-1为止的数据都已经收到。
  • 数据偏移:4位,指的是TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段指的其实是TCP报文段的首部长度。由于首部中还有不确定字段,因此偏移值值必要的。
    数据偏移的单位是4个字节,其本身占4位,能表示的最大十进制数是15,因此TCP首部最大长度为4*15 = 60字节
  • 保留:6位

下面是6个控制位:

  • 紧急URG:URG为1时,表明此报文段中有紧急数据,需要尽快传送。发送方会将这个紧急数据插入到本报文段数据的最前面。
  • 确认ACK:当ACK=1时确认号字段才有效。
    TCP规定在建立连接后所有传送的报文段都必须把ACK置1。
  • 推送PSH
  • 复位RST
  • 同步SYN:在建立连接时用来同步序号。
    SYN=1表明这是一个连接请求或者一个连接接受报文。
    • SYN=1,ACK=0表明这是一个连接请求报文段。
    • 若对方同意建立连接,则在响应的报文段中使用SYN=1和ACK=1。
  • 终止FIN:用来释放连接。当FIN=1时表示此报文段的发送方的数据已发送完毕,并要求释放运输链接。

  • 窗口:2字节,指的是发送本报文段的一方的接受窗口。(不是发送窗口)。目的是告诉对方允许其发送的数据量。窗口值就是作为接收方让发送方设置其发送窗口的依据

  • 检验和:2字节。检验和字段检验的范围包括首部和数据这两部分。
  • 紧急指针
  • 选项:长度可变,最长为40字节。

计算机网络:TCP与UDP(二)

TCP可靠传输的实现

以字节为单位的滑动窗口

假设A收到了来自B的报文段,其中窗口为20,确认号为31,那么A就根据这两个数据构造自己的发送窗口:

计算机网络:TCP与UDP(二)

  • 发送窗口表示:在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去。
    已经发送过的数据在未收到确认之前都必须暂时保留,以便在超时重传是使用。
  • 发送窗口里面的序号表示允许发送的序号。窗口越大,发送方就可以发送更多的数据,从而获得更高的传输效率。但接收方必须来得及处理这些数据。
  • 发送窗口的后沿:后沿的后面部分表示已发送且已收到了确认。这些数据不需要再保留了。
  • 发送窗口的前沿:前沿的前面部分表示不允许发送的。

发送窗口的位置由前沿和后沿共同确定。后沿的变化情况有两种可能:

  • 不动(没有收到新的确认)
  • 向前移动(收到了新的确认)

后沿不可能向后移动。

发送窗口的前沿也有两种变化情况:

  • 向前移动
  • 不动
    • 没有收到新的确认,对方通知的窗口大小也不变
    • 收到了新的确认,但是对方通知的窗口变小了,前沿正好不动
  • 向后收缩:对方通知的窗口缩小了。

计算机网络:TCP与UDP(二)

超时重传时间

TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文。

TCP对于超时重传时间的选择使用了一种自适应算法。它记录一个报文段发出的时间以及收到确认的时间。这两个时间之差就是报文段的往返时间RTT,TCP保留了一个RTT的加权平均往返时间RTTs。

超时计时器设置的超时重传时间会略大于RTTs。

TCP的流量控制

流量控制的目的是让发送方的发送速率不要太快,要让接收方来得及接收。

利用滑动窗口实现流量控制

发送方的发送窗口不能超过接收方给出的接受窗口的数值。
TCP的窗口单位是字节。

计算机网络:TCP与UDP(二)

接收方的主机B进行了三次流量控制,分别把窗口减小到300、100和0(即不允许发送方发送数据了)。这种使发送方暂停发送数据的状态持续到主机B发出一个新的窗口值为止。

TCP的拥塞控制

拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。

慢开始和拥塞避免

发送方维持一个叫做拥塞窗口cwnd的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。
发送方让自己的发送窗口等于拥塞窗口。

发送方控制拥塞窗口的原则是:

  • 只要没有出现拥塞,拥塞窗口就再增大一些
  • 一旦出现网络拥塞,拥塞窗口就减小一些

发送方是如何知道网络发生了拥塞呢?当网络发生拥塞时,路由器就要丢弃分组,因此只要发送方没有按时收到确认报文,就可以猜想网络中可能出现了拥塞。

为了防止拥塞窗口增长过大引起网络拥塞,需要设置一个慢开始门限ssthresh

  • cwdn < ssthresh时,使用慢开始算法
  • cwdn>ssthresh时,使用拥塞避免算法
  • cwdn = ssthresh时,既可以使用慢开始也可以使用拥塞避免

下面是一个慢开始&拥塞避免的完整例子,设ssthresh开始为16。

  • 拥塞窗口cwdn一开始为1,执行慢开始算法,发送方每收到一个对新报文段的确认拥塞窗口就加1。因此拥塞窗口cwdn是随着传输轮次指数增长的
  • 当拥塞窗口cwdn = 慢开始门限ssthresh时,开始使用拥塞避免算法。拥塞窗口按线性规律增长,每次加1
  • 假设拥塞窗口增长到24时,网络出现拥塞。
    无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送窗口值的一半。然后把拥塞窗口重新设置为1,执行慢开始算法。
    因此此时慢开始门限改为24的一半即12,拥塞窗口再次设置为1,开始执行慢开始算法。
  • 此后若拥塞窗口达到12时则改为执行拥塞避免算法。

计算机网络:TCP与UDP(二)

总结一下,几个重要的节点:
1.拥塞窗口达到慢开始门限后,改用拥塞避免算法(加法增大
2.网络中出现拥塞时,慢开始门限减半,使用慢开始算法,拥塞窗口从1开始。(乘法减小

快重传和快恢复

在之前的算法中,发送方如果在设置的超时计时器时间内没有收到确认,那么就认为网络中出现了拥塞,就会将拥塞窗口减小到1执行慢开始算法,同时减半慢开始门限。

但是快重传算法要求接收方每收到一个失序的报文段后就立即发出重复确认
计算机网络:TCP与UDP(二)

接收方在没有收到M3的情况下收到了M4,M4显然是一个失序报文段,根据快重传规定,接收方此时要发送对M2的重复确认,能尽早让发送方知道M3没有到达接收方。发送方接着发送M5和M6,接收方收到后还是重复发送对M2的确认。当发送方一连收到3个重复确认时就立即重传M3,而不必等待为M3设置的超时定时器到期。

由于发送方可以尽早重传未被确认的报文段,使得网络吞吐量提高。

与快重传配合使用的是快恢复算法:

  • 当发送方连续收到三个重复确认时,就执行乘法减小:将慢开始门限减半,但是接下来不执行慢开始算法
  • 发送方认为现在网络很可能没有发生拥塞,因此此时不是将cwdn设为1,而是设置为慢开始门限减半后的数值,然后开始执行拥塞避免算法

计算机网络:TCP与UDP(二)

与流量控制一起考虑的话,发送窗口不能超过对方给出的接受窗口值rwdn,因此最终发送窗口大小受rwdn与cwdn两个值的限制,它的上限值应取这两个中较小的那一个。

发送方窗口的上限值 = Min[rwdn,cwdn]

拥塞控制与流量控制的区别

  • 拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
    是一个全局性的过程,涉及到所有的主机与路由器,以及与降低网络传输性能有关的所有因素。
  • 流量控制往往指点对点通信量的控制,是个端到端的问题。
    流量控制是要抑制发送端发送数据的速率,以便接收端来得及接受。