一、TCP可靠性与特点
我们知道TCP在传输过程中是比较可靠的,具体可靠性又是如何体现的呢。
可靠性:
- 基于应答机制。只有经过确认的消息才是可靠的。请求和确认是双方都要做的
- 提供面向链接的全双工的面向字节流的服务。
- 基于序号的请求机制,所以数据按序到达。
- 基于序号可以确认丢包,此时有丢包重传机制。
- 基于滑动窗口来进行一个流量控制,滑动窗口是自己接收缓冲区的大小
- 出现了数据大面积丢包不重传少发或者不发,执行网络拥塞避免算法,超时重传
- TCP中维护多重定时器.参考之前的博客。TCP定时器总结:http://blog.csdn.net/archyli/article/details/75807747
特点:
(1)面向连接
双方必须先建立连接才能进行数据的读写,双方都要为该连接分配必须的资源,用来管理连接的状态和连接上的传输
(2)连接是全双工
双方的数据可以通过一个连接进行,完成数据交换后,双方必须断开连接,TCP通信双方都可以在任何时候发送数据,并且两端都设有发送缓存和接受缓存,用来存放临时数据。
(3)基于字节流
发送端执行多次写操作时,TCP模块必须先把这些数据放入TCP发送缓冲区中,当TCP模块真正发送数据时,才把TCP发送缓冲区等待发送的数据封装成一个或多个TCP报文段发出
(4)每一条TCP连接只能有两个端点
TCP连接端点称为套接字,它是由IP地址和端口号唯一确定的。
二、可靠传输
TCP可靠传输的原理
1、无差错
(1)无差错
无差错情况既是可靠性之一请求应答机制,A发送数据1,发送就暂停发送,B收到1就向A发送确认,A收到对1的确认再发送下一个数据。注意,此时如果A收到连续的1的确认消息,证明B有缺失。
(2)出现差错
只要A过了一段时间仍然没有收到确认消息,就认为刚才所发送的数据丢失,此时采用超时重传机制,重新发送数据,这个时间由一个计时器实现。
但是要注意:
- A每次发送数据暂时要保留数据的一份副本
- 数据与确认数据必须进行编号
- 超时计时器的重传时间比数据在分组的平均往返时间更多一些
(3)如果B收到重复的数据,则不向上一层交付,需要向A发送确认消息
2、超时重传
在发送某一个数据以后开启一个定时器,如果在这个定时的时间内没有得到与发送的数据报的ACK报文,那么就重新发送数据,直到发送成功位置
3、停止等待协议
优点是简单,但是通道利用率太低(总要等)。解决方法是采用连续的ARQ协议,发送方维持发送窗口,每次连续发送几个分组,接收方采用积累确认,对按序到达的最后一个分组发送确认。
缺点是:不能向发送方反映出接收方已经正确收到分组消息,例如传输中丢失中间的数据,无法向发送方确认。
三、流量控制
流量控制的核心就是让发送方不要用太快的频率发送数据,其中就是通过滑动窗口来确认大小,发送方的发送窗口不能超过接收方的滑动窗口大小。
滑动窗口单位为字节。
再上图B主机进行了三次流量控制。
第一次设置为300
第二次设置为100
第三次设置为0
在最后B向A发送了ACK=1确认字段有效。
但是,当窗口值为0,接受方把窗口值恢复(比如ACK=1,ack=601,rwnd=200),如果这份报文在传输过程中丢失,A一直等待B发送报文,B也在等待A发送数据,所以进入相互等待的死锁局面。
所以如果窗口值为0,发送端就会开启一个持续计时器,每个一段时间询问一下接收方,如果计时器到期,就发送一个零窗口探测报文段(携带1字节数据),对方确认这个报文是给出现在的rwnd。若rwnd=0,则重置计时器,否则正常传输。
四、拥塞控制
某一段时间内,如果对网络中的某一资源的需求量超过了该资源所能提供的可用部分,就会使网络的性能发生变换,这种情况就叫做阻塞。
这时我们便想,重传机制是否可以缓解阻塞呢?
重传不能缓解阻塞,反而会加剧阻塞:原因在于,如果一个路由器因为缓存空间的阻塞而丢弃了一些通信的数据,发送方就会重传数据(可能会多次),这样会引起更多的数据流入网络或者被网络中的路由器丢弃。
swnd=min(rwnd,cwnd),cwnd就是拥塞窗口大小。
慢开始和拥塞避免
(1)拥塞控制方法
拥塞控制作用
- 防止过多的数据注入网络
- 使得当前网络能承受现有的网络负荷
因特尔定义了进行拥塞控制的四种算法:慢开始、拥塞避免、快重传、快恢复。我们假定
- 数据是单方向传递,而另外一个方向只传送确认
- 接收方总是有足够大的缓存空间,因为发送窗口的大小由网络拥塞程度来决定
(2)慢开始和拥塞避免
发送报文段速率的确定,既要根据接收端的接收能力,又要从全局考虑不要使网络发生拥塞,这由接收窗口和拥塞窗口两个状态量确定。接收端窗口(Reciver Window)又称通知窗口(Advertised Window),是接收端根据目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。拥塞窗口cwnd(Congestion Window)是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。
(a)慢启动原理:
- 当主机开始发送数据时,如果立即将较大的发送窗口的全部数据字节都注入到网络中,那么由于不清楚网络的情况,有可能引其网络拥塞
- 比较好的方法是试探一下,即从小到达逐渐增大发送端的拥塞控制窗口数值
- 通常在刚刚开始发送报文段时可先将拥塞窗口cwnd(拥塞窗口)设置为一个最大报文段的MSS的数值。在每收到一个对新报文段确认后,将拥塞窗口增加至多一个MSS的数值,当rwind(接收窗口)足够大的时候,为了防止拥塞窗口cwind的增长引起网络拥塞,还需要另外一个变量---慢开始门限ssthresh
(b)拥塞避免
具体过程为:
- TCP连接初始化,将拥塞窗口设置为1
- 执行 慢开始算法:cwind按指数规律增长,知道cwind == ssthress开始执行 拥塞避免算法:cwnd按线性规律增长
- 当网络发生拥塞,把ssthresh值更新为拥塞前ssthresh值的一半,cwnd重新设置为1,按照步骤(2)执行。
(3)快重传
快重传算法规定:只要发送方一连接受到三个重复确认就应当立即重传尚未收到的报文
具体过程为:
- 发送方发送F1报文
- 接收方接收F1,并向发送方发送F1的确认①
- 发送方收到F1确认后,发送F2报文
- 而接收方未收到F1,接收方发送F1的确认②,表示未收到之后的报文F2
- 发送方接着发送F3、F4
- 接收方继续发送F1的确认③
- 触发重传,发送方发送F2
(4)快恢复
具体过程为:
- 当发送方收到连续的三个重复确认时,执行乘法减小算法,即ssthresh减半
- 将cwnd的值设为ssthresh减半后的数值
- 执行拥塞避免算法的加法增大