TCP可靠传输的实现
1.TCP滑动窗口
TCP是全双工通信协议,发送方和接收方都有各自的接收和发送窗口。发送方的滑动窗口是根据接收方的TCP报文字段的窗口和其他信息来确定的。
发送窗口内都是可以允许发送的数据,当发送窗口中左部的字节是已发送和已确认时,发送窗口就会向后滑动一定距离,直到该数据不是已发送和已确认的,接收窗口处理方式类似。
接收方只对按序收到的数据中的最高序号给出确认,例如发送方发送{31,32,33},但是接收方只收到32和33的数据,这些数据没有按序到达,接收方发送的确认报文段中确认号仍然为31。
2.超时重传时间的选择
TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。
一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:
其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。
超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:
其中 RTTd 为偏差的加权平均值。
3.选择SACK
TCP的流量控制
- 利用滑动窗口实现流量控制
流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。
通过确认报文中窗口字段来控制发送方的发送速率。
- TCP的传输效率
TCP的拥塞控制
拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路过载。如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收(端对端的通信),而拥塞控制是为了降低整个网络的拥塞程度(全局性)。
TCP的拥塞控制方法
TCP进行拥塞控制的算法有四种,即慢开始,拥塞避免,快重传,快恢复。
发送方让自己的发送窗口等于拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。
- 数据是单方向传送的,对方只传送确认报文。
- 接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度决定。
- 慢开始和拥塞避免
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 ...
当cwnd > ssthresh(慢开始门限)时,改用拥塞避免算法,拥塞避免算法每经过一个往返时间cwnd加1。
当cwnd = ssthresh时,既可以用慢开始也可以使用拥塞避免算法。
当cwnd < ssthresh时,慢开始算法。
当网络出现超时,ssthresh = cwnd / 2,同时设置拥塞窗口cwnd=1.进入慢开始算法。
2.快重传与快恢复
快重传算法要求接收方不要等待自己发送数据才进行捎带确认,而是立即发送确认。即使收到失序的报文段对已发送的报文段的重复确认。发送方一连收到3个重复确认就应当立即进行重传。在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,发送方调整门限值ssthresh =cwnd/2,同时设置拥塞窗口cwnd=ssthresh ,并开始拥塞避免算法。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
TCP的运输连接管理
TCP的连接建立
假设 A 为客户端,B 为服务器端。
- 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
- A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
- B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
- A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
- B 收到 A 的确认后,连接建立。
三次握手的原因
三次握手为了防止已失效的连接请求报文突然有传送到了B,因而产生错误连接。
现假定出现一个异常情况,客户端发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某一个时间到达服务器。如果不是三次握手,服务器发送确认,新的连接就建立了,由于现在客户端并没有发出建立连接的请求,服务器只能一直等待客户端发送数据。如果采用三次握手,就可以防止以上现象的发生。
TCP的连接释放
以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。
- A 发送连接释放报文,FIN=1。
- B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
- 当 B 不再需要连接时,发送连接释放报文,FIN=1。
- A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
- B 收到 A 的确认后释放连接。
四次握手的原因
客户端发送释放报文后,服务器收到这个报文后,进入CLOSED-WAIT。这个状态是为了让服务器发送未传送完毕的数据,传送完毕,服务器向客户端发送释放连接报文。
TIME-WAIT
- 为了保证A发送的最后一个ACK报文能够到达B,如果A在TIME-WAIT不等待一段时间,而是发送完ACK报文后立即释放连接,ACK报文丢失的话,B无法释放连接。
- 防止已失效的连接请求报文段出现在本连接中,A在发送完最后一个ACK报文段后,在经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文从网络中消失,使下一次新的连接不会出现旧的连接请求报文。