我们知道TCP在传输过程中是比较可靠的,具体可靠性又是如何体现的呢。
可靠性:
特点:
双方必须先建立连接才能进行数据的读写,双方都要为该连接分配必须的资源,用来管理连接的状态和连接上的传输
双方的数据可以通过一个连接进行,完成数据交换后,双方必须断开连接,TCP通信双方都可以在任何时候发送数据,并且两端都设有发送缓存和接受缓存,用来存放临时数据。
发送端执行多次写操作时,TCP模块必须先把这些数据放入TCP发送缓冲区中,当TCP模块真正发送数据时,才把TCP发送缓冲区等待发送的数据封装成一个或多个TCP报文段发出
TCP连接端点称为套接字,它是由IP地址和端口号唯一确定的。
TCP可靠传输的原理
(1)无差错
无差错情况既是可靠性之一请求应答机制,A发送数据1,发送就暂停发送,B收到1就向A发送确认,A收到对1的确认再发送下一个数据。注意,此时如果A收到连续的1的确认消息,证明B有缺失。
(2)出现差错
只要A过了一段时间仍然没有收到确认消息,就认为刚才所发送的数据丢失,此时采用超时重传机制,重新发送数据,这个时间由一个计时器实现。
但是要注意:
(3)如果B收到重复的数据,则不向上一层交付,需要向A发送确认消息
在发送某一个数据以后开启一个定时器,如果在这个定时的时间内没有得到与发送的数据报的ACK报文,那么就重新发送数据,直到发送成功位置
优点是简单,但是通道利用率太低(总要等)。解决方法是采用连续的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就是拥塞窗口大小。
慢开始和拥塞避免
拥塞控制作用
因特尔定义了进行拥塞控制的四种算法:慢开始、拥塞避免、快重传、快恢复。我们假定
发送报文段速率的确定,既要根据接收端的接收能力,又要从全局考虑不要使网络发生拥塞,这由接收窗口和拥塞窗口两个状态量确定。接收端窗口(Reciver Window)又称通知窗口(Advertised Window),是接收端根据目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。拥塞窗口cwnd(Congestion Window)是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。
(a)慢启动原理:
(b)拥塞避免
具体过程为:
快重传算法规定:只要发送方一连接受到三个重复确认就应当立即重传尚未收到的报文
具体过程为:
具体过程为: