一、TCP的无差错传输
众所周知,TCP是一种可靠性传输协议,那么他的可靠传输是如何实现的呢?
基本思想
- 当传输出现差错的时候,可以重新传输
- 当接收方来不及接收的时候,如何调整发送的数据速率。同时确保在网络传输中能保持一种高效、高速传输。
解决办法
- 重传机制
- 流量控制和拥塞控制
1、重传机制
【1】停止等待协议
每发送完一个分组就停止等待回复确认,在收到确认之后才会进行下一次的传输。 如果接收方收到重复的分组,会丢弃。但是还是会发送确认请求回去。
1)无差错情况
发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。
2) 出现差错情况(传输差错):
传输过程中没有传过去,所以迟迟收不到确认,这时候已经过了计时器的时间,那么发送方继续发送。
3)确认丢失
当A发送M1消息,B收到后,B向A发送了一个M1确认消息,但却在传输过程中丢失。而A并不知道,在超时计时过后,A重传M1消息,B再次收到后,首先丢弃该信息,然后重新向A发送确认。
4)确认迟到(确认信息在传输过程中延误了)
A发送M1消息,B收到并发送确认。在超时时间内没有收到确认消息,A重传M1消息,B仍然收到并继续发送确认消息(B收到了2份M1)。此时A收到了B第二次发送的确认消息。接着发送其他数据。过了一会,A收到了B第一次发送的对M1的确认消息(A也收到了2份确认消息)。处理如下:
A丢弃重复确认。 B丢弃重复信息。
【2】自动重传请求 ARQ 协议
停止等待协议中超时重传是指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。因此每发送完一个分组需要设置一个超时计时器,其重转时间应比数据在分组传输的平均往返时间更长一些。这种自动重传方式常称为自动重传请求ARQ。
【3】连续ARQ协议
上面我们所说的停止等待协议和自动重传,都是每次发送一个分组,也就是一个TCP段,连续ARQ协议则是维持一个发送窗口,接收方维护一个接收窗口。发送方可以一次性将窗口内的分组发送出去,接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。
2、流量控制
TCP 利用滑动窗口实现流量控制的机制。为了控制发送方的速率,保证接收方能够来得及接收。
TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报。
接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
3、拥塞控制
防止过多的数据注入到网络中,使得网络中的路由器 & 链路不致于过载
共分为2个解决方案:慢开始 & 拥塞避免、快重传 & 快恢复
(1)解决方案1:慢开始 & 拥塞避免
- 拥塞窗口
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。
- 慢开始
当主机开始发送数据时,由小到大逐渐增大 拥塞窗口数值(即 发送窗口数值),从而 由小到大逐渐增大发送报文段。
当开始发送的时候,设置cwnd为1,(1表示一个最大报文段)。没收到一个确认就加倍。
- 拥塞避免 算法
使得拥塞窗口(cwnd)按线性规律 缓慢增长:每经过一个往返时间RTT,发送方的拥塞窗口(cwnd)加1
总之:
(2)解决方案2: 快重传 & 快恢复
- 快重传
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。 立马开始重新传输。这意味这不是丢失了重传计时器,而是加快了反应。
- 快恢复
(1)当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。
(2)由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
二、UDP
用户数据报协议。
UDP 是无连接的。
UDP尽最大可能的交付,所以不存在拥塞控制等,提供不可靠通信。
UDP面向报文。
支持一对一、一对多、多对多通信。
UDP首部开销小。
1、UDP是面向报文的
发送方将应用程序交下来的报文进行添加首部,然后交给网络层。UDP对移交来的报文不做任何拆分,直接原封不动往下传。
接收方收到后,去掉IP首部,去掉UDP首部,直接交付给应用程序,一次性交付一个完整的报文。
2、UDP的不可靠性
UDP 是无连接的,也就是说通信不需要建立和断开连接。 UDP 也是不可靠的。协议收到什么数据就传递什么数据,并且也不会备份数据,对方能不能收到是不关心的 UDP 没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。
3、传输方式
UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。