TCP协议二
- 本小节讲了TCP的可靠传输的工作原理、报文段的首部格式、可靠传输的实现、流量控制以及运输链接管理
- TCP的拥塞控制的四中算法(满开始、拥塞避免、快重传、快恢复)未详解
1.可靠传输的工作原理
TCP下面的网络所提供的通信是不可靠的传输,即网络层、数据链路层和物理层的传输是不可靠的。
1.1自动重传请求ARQ
“停止等待”就是每发送完一个分组就停止发送,等待对方的确认,在收到确认后在发送下一个分组。
可靠的传输协议设计原则:client只要超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组,这就叫 超时重传。要实现超时重传,就要在每次发送完一个分组时设置一个超时计时器。超时重传有三个细节:
- client发送完分组后必须暂时保留发送分组的副本,以待可能的重传使用(收到确认后才可从发送缓存清除);
- 对分组和确认分组进行编号来确定两者的对应关系(client向server发送报文首部的确认号ACknowledgement number与对应的相应报文的序列号sequence number相同;
- 超时计时器设置的重传的时间应当比数据在分组传输的平均往返时间更长一些。在“RTO”小节详解;
server响应的确认报文段丢失时,如果server收到了client重传的分组(TCP报文段),则对其这个重复的分组,并向client发送确认(否则client还回重传)。
对于server端重复的确认,client只要收下丢弃就好。
上述讲到的这种可靠地传输协议称为 ARQ(automatic repeat request)自动重传请求。
1.2信道利用率
client发送两个分组的间隔时间包括:
- TD,client发送分组的时间,等于
分组长度/发送速率
,分组长度即TCP报文段长度;??相当于 发送时延/传输时延?? - RTT,即往返时间;相当于 ??传播时延+处理时延+排队时延??
- TA:server发送确认分组所花费的时间,一般远小于TD;
上述三段时间自由TD用来发送有用的数据,因此信道利用率U
可用公式表示:
U=\frac{T_D}{T_D+RTT+T_A}
为了提高传输效率,可以使用流水线传输,即可以连续发送多个分组,不比每发送完一个分组就停下来等待对方的确认。HTTP持续链接下的管道式的工作方式就对应着这种连续传输。此时不能再使用“停止等待协议”,而应该使用连续ARQ协议和滑动窗口协议。
1.3连续ARQ协议
连续ARQ协议规定,client没收到一个确认,就把发送窗口向前滑动一个分组的位置。
server一般采用累积确认的方式,而非对每个分组都响应一个确认。
2.TCP报文段的首部格式
TCP连接的端点是socket(套接字),socket由IP和Port组成,因此可知TCP首部格式(head format)一定有源端口和目的端口,其他字段如下图所示,每个字段所占位数由图上部数字标识,即端口16位2直接,序号和确认号4字节...:
- IP数据报的数据部分包含TCP报文段的header format;
- 序号值:本报文段所发送数据的第一个字节的序号;
- 确认好:发送方所期望的对方下一个报文的第一个字节的序号;
- Data Offset:本TCP报文段的首部长度;
- Reserved保留,6位,默认为0;
- URG:此报文段包含紧急字段,应该优先发送(不排队),而且不管接收方接受窗口值是否是0;PS接收方接受窗口为0时仍有三种报文段需要接受:探测报文段、紧急报文段和确认报文段;
- ACK:
ACK=1
时确认号字段才有效,TCP连接建立后所有的报文段必须把ACK置为1; - PSH,希望对方尽快响应时
PSH=1
,效果是接收方立即将数据交付给应用程序,而不管接受缓存填充多少; - RST:重建TCP连接;
- SYN和FIN:建立TCP连接和释放TCP连接时使用,
SYN=1 ACK=0
表示这是一个请求连接,SYN=1 ACK=1
表示同意建立连接,第三次握手及以后SYN不再需要(值为0);FIN=1
时表示请求释放TCP连接; - Urgent Point:URG=1时才有意义,指出报文段紧急数据字节数;
- Window窗口:接收方目前允许发送方发送的数据量;
- Options选项,包括MMS最大报文长度、SACK选择确认、窗口扩大、时间戳等;
3.TCP可靠传输的实现
TCP可靠传输的实现包括窗口滑动协议、超时重传时间的选择和选择确认ACK。
3.1以字节为单位的滑动窗口
详情参见课本计算机网络.谢希仁.5.6.1小节的内容。主要内容有:
- 发送窗口前沿、后沿的运动方式;
- 三个指针间字节流内容的含义(发送窗口/通知窗口、可用窗口/有效窗口);
- 发送应用程序、发送缓存和发送窗口的关系示意图,接受同理;
- ...
3.2超时重传时间(RTO,retransmissionTime-Out)时间的选择
RTO设置的过大会使网络的空闲时间增大,降低传输效率;过小会导致过多的不必要的重传。RTO的设置依赖RTT的加权平均往返时间RTTs和RTT的偏差的加权平均值RTTD:
-
RTTs为“平滑往返时间”,RTTs初始值为第一次测量到的RTT值?TCP连接前两次握手的时间??,之后按照下边公式计算(α建议取值1/8):
$ RTT_S=(1-α)*RTT^{old}+α*RTT^{new}$
-
超时重传时间RTO计算公式如下:
$ RTO=RTT_S+4*RTT_D $
-
RTTD是RTT的偏差的加权平均值(β建议取值1/4),与RTTS和RTT取值有关,RTTD初始值为RTT的一半,之后按照公式计算:
$ RTT_D=(1-β)*RTT_D^{old}+β*|RTT_S-RTT^{new}| $
对于重传后但是第一次server的确认信息只是延时的情况,如果计算时将第一次server的确认信息当做重传的确认,则会导致RTT和RTO偏小,最后导致报文段过多的重传。反之如果将重传的确认当做第一次的确认,则会导致RTT和RTO越来越大,网络空闲时间越来越大。
针对以上问题的解决办法:
- 报文段没重传一次,RTO增大一倍;
- 或者报文重传时,计算RTTS就不采用RTTnew样本。但是如果报文段延时突然因为某种原因增大很多导致超时的情况,RTT时间就无法更新,所以不如第一种办法;
3.3选择确认SACK
SACK用于以下情况:
当server接收到的字段不连续时,是否可以告知client只传送未发送的数据。
TCP建立连接时,在首部的Options(20个字节)中用2个字节指明加上SACK选项和此选项占用多少字节。因为每个序号必须用2个字节表示,因此一个“空白快”需要用4个字节表示,由此可知选项中最多可指明4个“空白块”。
详情请看“谢希仁P202”。
4.TCP的流量控制
4.1利用滑动窗口实现流量控制
滑动窗口参见P197.
流量控制(flow control)就是让发送发的发送速率不要太快,让接收方来得及接收。
TCP的窗口的单位是字节,发送方的窗口不能大于接收方的窗口。下图解释了利用滑动窗口实现流量控制:
- 回复的三个箭头是接收方进行的三次流量控制;
- B可以积累多次A方的数据,然后进行一次确认。
- 如图,最后B窗口关闭了,A停止发送数据。如果B的接受缓存又有了一些存储空间,B可以发送报文段告知。但是如果此报文段丢失则会造成死锁,为了解决问题,TCP为每一个连接设有一个持续计时器(persistence timer),接收方收到零窗口通知时启动计时器,时间到期就发送一个探测报文段,对方则会返回现在的窗口值,为0则重新计时。
4.2考虑传输效率.TCP发送报文段的时机
TCP发送报采用Nagle算法:发送应用吧数据字节流发送大TCP发送缓存:
- 发送方把第一个字节先发送出去,并缓存后面到达的数据字节,等收到第一个字节的确认后,将缓存中所有字节发出去,并缓存后边字节流,等待响应到达时发送。 但是
- 发送窗口到最大报文段长度MMS或者发送窗口的一半时,立即发送一个报文段;
当发送方应用层到达数据较快而网络较慢时,Nagle可以减小使用的网络带宽。
TCP发送报文机制一般如下三种:
- 等于MMS;
- 发送方设置计时器;
- TCP支持push操作,应用进程可以进行设置。
5.TCP的拥塞控制
5.1基本概念
- 流量控制指的是让发送方的发送速率不要太快,要让接收方来得及接收。指的是点对点通信量的控制;
- 拥塞(congestion)指的是对资源的需求大于网络的可用资源时,网络性能会变坏。网络资源指带宽、交换节点中的缓存和处理机等;
- 拥塞控制就是防止过多的数据注入到 网络 中,防止网络中的路由器或者链路不致过载。
拥塞控制说起的作用如示意图所示:
5.2解决方法
拥塞控制大的方面来讲有两种解决方法:开环控制和闭环控制:
- 开环控制就是在设计网络时提前考虑到所有与可能与发生拥塞有关的因素;
- 闭环控制基于反馈环路的概念:
- 监测网络系统以感知何时何地发生拥塞;
- 把拥塞信息发送到可采取行动的地方;
- 采取行动、调整网络系统以解决拥塞;
拥塞控制有四种算法:满开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)和快恢复(fast recovery)。未详细展开讲解;
6.TCP的连接和释放
TCP是面向连接的,有连接建立、数据传送和连接释放三个阶段。连接建立采用C/S方式(client、server)。主动发起连接建立的一方叫客户,被动建立连接的应用叫服务器。
连接的建立和释放都要注意两个方面:
- 客户client和服务器的状态:关闭、连接建立、监听、同步发送、同步接受、等待、确认等状态;
- 客户端发送的报文和服务器响应的报文的报文首部重要字段,比如请求建立连接和同意建立连接时的
SYN=1
、同意建立连接并传送数据时ACK=1
、释放连接时FIN=1
等等等;
6.1连接时的三次握手
SYN=1
表示请求连接;SYN=1 ACK=1
表示同意连接请求;- 连接后所有报文
ACK=1
; seq
表示序号:本报文发送数据第一个字节的序号;ack
表示期望收到对方下一次传输数据的序号;- 注意双发状态变化。
之所以三次握手而非两次,是为了防止客户端延时的连接请求在“重传的请求连接后”又发送到服务器,导致不正确的连接而浪费了资源。
6.2 释放连接时的四次挥手
- 大致可以认为双方请求释放连接并收到响应的过程;第一个响应完成时,TCP处于半关闭(half-close)状态;
- 如图,两次用到了
FIN=1
字段:请求释放连接报文段,seq=u
u是以传送字节最大序号加1;FIN报文段即使不携带数据也消耗一个序号; - TIME-WAIT状态等于两个最长报文段寿命MSL(Maximum Segment Lifetime);
TIME-WAIT状态设置原因如下:
- 为了保证客户端最后发送的ACK报文能到达服务器(如果丢失则服务器收不到响应,此时服务器会重传
FIN=1 ACK=1
字段; - 防止已失效的连接 请求报文段:2*MSL时间可以使得此链接产生所的报文段失效;
保活计时器(keepalive timer)用于客户端突然故障,服务器长时间收不到客户端信息时,此时服务器会发送探测报文到客户端,累积多次无响应则断开连接。
6.2 TCP的有限状态机
- 红色实线代表客户的变迁;
- 虚线代表服务器状态的变迁;
- 细线代表异常变迁。
第六节内容详情参见“谢希仁P215”;