C++/java网络常见题目3_TCP如何实现可靠传输

TCP如何实现可靠传输

可靠:发送方发送的数据到达接收方的时候不会发生错误,不会丢失,不会重复,不会乱序!

 

  • 差错检测(校验和)

  1. 目的:检测数据在传输过程中是否发生变化。如果检验和出错,丢弃该报文段。(发送端超时重传)
  • 接收端反馈(序列号和确认应答)

  1. 序列号的目的:解决乱序问题,将数据以正确顺序送到应用层,提供确认应答的条件。
  2. 确认应答信号ACK:当发送端将数据发出之后会等待接收端的确认应答。如果有确认应答,说明数据已经成功到达接收端主机了。反之,若没有收到确认应答,则数据包丢失的可能性比较大。
  • 发送端重传(超时重传)

  1. 当发送端迟迟没有等到接收端的确认应答,则可能丢失数据包。                                                                                              数据包丢失的原因两种:(1)发送端的数据包丢失,没有到达接收端,;(2)接收端的确认应答信号ACK丢失。
  2. 超时重传机制:简单理解就是发送端在发送完数据后等待一个特定时间,时间到达没有接收到确认应答信号ACK,那么对刚才发送的数据进行重新发送。
  3. 如果针对发送端数据丢失,当超时重传后,接受端接受到二次重发的数据后,便进行确认应答信号ACK的发送。如果针对接收端的确认应答信号ACK丢失,当再次收到该数据报文,会判断重复并将其丢弃,仍然发送确认应答信号ACK。
  4. 超时重传计时器RTT:平均往返时延RTT=α×(旧的RTT)+(1-α)×(新的往返时延样本),1 ≤ α < 1 典型的值为α为7/8.
  5. 超时重发时间间隔RTO:RTO = β × RTT, β > 1, 推荐是2
  • 连接管理

  1. 见博文:https://blog.csdn.net/zzhang_12/article/details/81285860
  • 流量控制(滑动窗口)

  1. 滑动窗口协议在在发送方和接收方之间各自维持一个滑动窗口,发送发是发送窗口,接收方是接收窗口,而且这个窗口是随着时间变化可以向前滑动的。它允许发送方发送多个分组而不需等待确认。TCP的滑动窗口是以字节为单位的。

  2. 发送窗口中有四个概念:(1)已发送并收到确认的数据(不在发送窗口和发送缓冲区之内)、(2)已发送但未收到确认的数据(位于发送窗口之内)、(3)允许发送但尚未发送的数据(位于发送窗口之内)、(4)发送窗口之外的缓冲区内暂时不允许发送的数据。

  3. 接收窗口中也有四个概念:(1)已发送确认并交付主机的数据(不在接收窗口和接收缓冲区之内)、(2)未按序收到的数据(位于接收窗口之内)、(3)允许接收的数据(位于接收窗口之内)、(4)不允许接收的数据(位于发送窗口之内)。

  4. 规则:(1)凡是已经发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用。

               (2)只有当发送端收到了接收端的确认报文段时,发送端窗口才可以向前滑动对应长度。

               (3)当发送端发送的数据经过一段时间没有收到确认(由超时计时器控制),就要使用回退N步协议,回到最后接收到确认号的地方,重新发送这部分数据。

  5. 选择性确认(Selective ACK, SACK)机制。在 SACK 支持下,仅可以重传缺少部分的数据,而不会重传那些已经正确接受的数据段。

  • 拥塞控制

  • 慢启动和拥塞控制: (1)拥塞窗口cwnd:大小取决于网络的拥塞程度,并且动态变化。(2)慢开始门限ssthresh:防止cwnd增长过大引起网络拥塞 
  1. 当cwnd
  2. 当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
  3. 当cwnd>ssthresh时,改用拥塞避免算法。(16,17,18.....)
  4. 当出现丢包时(超时重传), ssthresh = 发生网络拥塞时的cwd一半,然后cwd = 0 并重新回到 1                                                                                                        
  • 快恢复/快重传:
  1. 当cwnd
  2. 当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
  3. 当cwnd>ssthresh时,改用拥塞避免算法。(16,17,18.....)
  4. 当出现丢包时 (三个重复ACK),cwd = 发生网络拥塞时的cwd一半,然后回到(2)

 

TCP和UDP的区别:

  1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  3. TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
  4. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
  5. TCP首部开销20字节;UDP的首部开销小,只有8个字节
  6. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  7. TCP有拥塞控制,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

 

本系列文章目的为个人准备面试的简单总结,文中多有不足,敬请批评指正!

参考:

https://blog.csdn.net/guoweimelon/article/details/50878503

https://blog.csdn.net/ls5718/article/details/52141571

你可能感兴趣的:(网络基础)