TCP如何实现可靠传输

1.确认重传机制
2.数据排序
3.流量控制:滑动窗口机制,以字节为单位的滑动窗口
流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。

利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制。

建立会话的时候,接收方会告诉发送方我的接收窗口是10字节,然后发送方就会设置一个发送窗口,发送窗口里的数据可以连续发送,这些数据还保留在发送窗口里,直到收到接收方的确认包,就把窗口往前滑动,如果接收方来不及处理不过来自己接收窗口里的数据,就会发送给对面,告诉它我的接收窗口变为8了,然后发送窗口就会减小发送窗口;如果要让发送方暂停发送,就让rwnd=0,告诉它我现在要处理数据了,你等会儿再发——————这个就是流量控制,等到接收方处理完数据了,再发一个包让发送方继续发
又有个问题,万一之后那个包丢了,那发送方岂不是要一直等么(也就是死锁局面产生了),那这里发送方会定时地发送询问包,看看接收方处理好了没
发送方和接收方死锁局面的产生
TCP 为每一个连接设有一个持续计时器。
若持续计时器设置的时间到期,就发送一个零窗口探测报文段
若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。
若窗口不是零,则死锁的僵局就可以打破了。

图片说明
如果出现丢包怎么办?
[1 2 3]、[4 5 6]、[7 8 9]、[10 11 12]在传的过程中,[7 8 9]这个包丢了,那么B在给A发送确认包的时候,确认号就为7,然后会加一个选择确认SACK,告诉B只要发送[7 8 9]过来就行
图片说明

图片说明

图片说明

下面我们来看一个流量控制的例子:
图片说明
超时重传时间的选择:
TCP中会有一个超时重传,就是如果在指定时间内我没有收到对面发过来的确认包,我就会再重新发一遍,那么这个时间要怎么确定呢?
TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。
RTTs是平均往返时间
图片说明
4.拥塞控制
下面我们来看一看拥塞控制:
流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制,它所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
而拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素
出现资源拥塞的条件:对资源需求的总和 > 可用资源
下面我们看下拥塞控制所起的作用:
图片说明
吞吐量:单位时间一个网络所经过的数据总量
理想的拥塞控制:比如说,一个网络的最大吞吐量是100M,那么如果这时候来了150M,那我就把50M扔了,以100M进行传输
实际的拥塞控制:实际情况不可能不出现丢包现象,但是为了不出现死锁现象,需要进行拥塞控制
拥塞控制的方法:
慢启动和拥塞避免:
(慢开始:发送方每收到一个确认,拥塞窗口cwnd就加一个,所以是呈指数增长;拥塞避免:发送方每隔一个往返时间,拥塞窗口增加一个,所以是呈线性增长)
发送方维持拥塞窗口 cwnd (congestion window) 可以连续发几个数据包
发送方控制拥塞窗口的原则是:

  • 只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。
  • 只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
    慢开始门限 ssthresh 的用法如下:
    当 cwnd < ssthresh 时,使用慢开始算法。
    当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
    当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
    拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。
    下面看一个慢开始和拥塞避免的例子:
    图片说明

过程:

  • 当 TCP 连接进行初始化时,将拥塞窗口置为 1(注意图中的窗口单位不是字节而是报文段)
  • 慢开始门限的初始值设置为 16 个报文段,即 ssthresh = 16
  • 发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值。
  • 在执行慢开始算法时,拥塞窗口 cwnd 的初始值为 1,发送第一个报文段 M0。
  • 发送端每收到一个确认 ,就把 cwnd 加 1。于是发送端可以接着发送 M1 和 M2 两个报文段。
  • 接收端共发回两个确认。发送端每收到一个对新报文段的确认,就把发送端的 cwnd 加 1。现在 cwnd 从 2 增大到 4,并可接着发送后面的 4 个报文段。 (发送端每收到一个对新报文段的确认,就把发送端的拥塞窗口加 1,因此拥塞窗口 cwnd 随着传输轮次按指数规律增长。
  • 当拥塞窗口 cwnd 增长到慢开始门限值 ssthresh 时(即当 cwnd = 16 时),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。
  • 假定拥塞窗口的数值增长到 24 时,网络出现超时,表明网络拥塞了。
  • 假定拥塞窗口的数值增长到 24 时,网络出现超时,表明网络拥塞了。
  • 当 cwnd = 12 时改为执行拥塞避免算法,拥塞窗口按按线性规律增长,每经过一个往返时延就增加一个 MSS 的大小。

快速重传和快速恢复:
快重传:比如说,A给B发送数据,如果本来是采用累积确认5个包,但是B收到了1,2,4,这时候B就知道数据包3给丢了,这时候就不等5来了再发确认,而是立刻发送3个确认号为3的确认包(让A再发3过来)------------连续发送三个重复的确认
快恢复:接收方连续收到三个重复的确认转入拥塞避免
图片说明

讲完拥塞控制的几个算法之后,我们就应该知道,发送窗口的实际上的限值就应该是:接收方窗口 和拥塞窗口 这两个变量中较小的一个,即应按以下公式确定:
图片说明

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务