TCP

TCP可靠传输的实现

1.TCP滑动窗口

cf17ca852fa1dc04ba8b08642a763d8203f.jpg

TCP是全双工通信协议,发送方和接收方都有各自的接收和发送窗口。发送方的滑动窗口是根据接收方的TCP报文字段的窗口和其他信息来确定的。

发送窗口内都是可以允许发送的数据,当发送窗口中左部的字节是已发送和已确认时,发送窗口就会向后滑动一定距离,直到该数据不是已发送和已确认的,接收窗口处理方式类似。

接收方只对按序收到的数据中的最高序号给出确认,例如发送方发送{31,32,33},但是接收方只收到32和33的数据,这些数据没有按序到达,接收方发送的确认报文段中确认号仍然为31。

2.超时重传时间的选择

3284cb11803d8096305af30db2477c464a1.jpg

TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。

一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:

https://camo.githubusercontent.com/02e9a4a23b05bcf814d9e5d0c1b79a6bb5ae2aee/68747470733a2f2f6c617465782e636f6465636f67732e636f6d2f6769662e6c617465783f525454733d28312d61292a2852545473292b612a525454

其中,0 ≤ a 1RTTs 随着 a 的增加更容易受到 RTT 的影响。

超时时间 RTO 应该略大于 RTTsTCP 使用的超时时间计算如下:

https://camo.githubusercontent.com/da3da0a6cad7ef2af7d7adcd2940277780c35325/68747470733a2f2f6c617465782e636f6465636f67732e636f6d2f6769662e6c617465783f52544f3d525454732b342a5254545f64

其中 RTTd 为偏差的加权平均值。

3.选择SACK

TCP的流量控制

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

1d63c2947c224d73e943c3b6bfa615c4d14.jpg

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

通过确认报文中窗口字段来控制发送方的发送速率。

  1. TCP的传输效率

 

TCP的拥塞控制

78a7a3a87bc019ea7d8e2e35ab230681e10.jpg

拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路过载。如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收(端对端的通信),而拥塞控制是为了降低整个网络的拥塞程度(全局性)。

TCP的拥塞控制方法

TCP进行拥塞控制的算法有四种,即慢开始,拥塞避免,快重传,快恢复。

发送方让自己的发送窗口等于拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。

  1. 数据是单方向传送的,对方只传送确认报文。
  2. 接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度决定。

 

41b5a6763cd01b9fb2bd7f41cd8415b2dcd.jpg

 

  1. 慢开始和拥塞避免

发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:248 ...

cwnd > ssthresh(慢开始门限)时,改用拥塞避免算法,拥塞避免算法每经过一个往返时间cwnd1

cwnd = ssthresh时,既可以用慢开始也可以使用拥塞避免算法。

cwnd < ssthresh时,慢开始算法。

当网络出现超时,ssthresh = cwnd / 2,同时设置拥塞窗口cwnd=1.进入慢开始算法。

2.快重传与快恢复

e1508802c47cee7d3cb5518f58d8e9bf7ab.jpg

快重传算法要求接收方不要等待自己发送数据才进行捎带确认,而是立即发送确认。即使收到失序的报文段对已发送的报文段的重复确认。发送方一连收到3个重复确认就应当立即进行重传。在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,发送方调整门限值ssthresh =cwnd/2,同时设置拥塞窗口cwnd=ssthresh ,并开始拥塞避免算法。

慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh

 

TCP的运输连接管理

TCP的连接建立

13ad7adef6b4a653a7079861d20f0ee2148.jpg

假设 A 为客户端,B 为服务器端。

  1. 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
  2. A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
  3. B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
  4. A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
  5. B 收到 A 的确认后,连接建立。

 

三次握手的原因

三次握手为了防止已失效的连接请求报文突然有传送到了B,因而产生错误连接。

现假定出现一个异常情况,客户端发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某一个时间到达服务器。如果不是三次握手,服务器发送确认,新的连接就建立了,由于现在客户端并没有发出建立连接的请求,服务器只能一直等待客户端发送数据。如果采用三次握手,就可以防止以上现象的发生。

TCP的连接释放

81405c4da002f06b5179cc305a20fb0761a.jpg

以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。

  1. A 发送连接释放报文,FIN=1。
  2. B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
  3. 当 B 不再需要连接时,发送连接释放报文,FIN=1。
  4. A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
  5. B 收到 A 的确认后释放连接。

四次握手的原因

客户端发送释放报文后,服务器收到这个报文后,进入CLOSED-WAIT。这个状态是为了让服务器发送未传送完毕的数据,传送完毕,服务器向客户端发送释放连接报文。

TIME-WAIT

  1. 为了保证A发送的最后一个ACK报文能够到达B,如果A在TIME-WAIT不等待一段时间,而是发送完ACK报文后立即释放连接,ACK报文丢失的话,B无法释放连接。
  2. 防止已失效的连接请求报文段出现在本连接中,A在发送完最后一个ACK报文段后,在经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文从网络中消失,使下一次新的连接不会出现旧的连接请求报文。

转载于:https://my.oschina.net/u/4045381/blog/3094214

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值