计算机网络

运输层详细问题

Posted by Gavin on March 5, 2020

淮南皓月冷千山

冥冥归去无人管

基本功能

运输层也是面试重点,尤其是TCP和UDP。运输层是为进程之间提供逻辑通信的层次,是通信的最高层,用户功能的最低层。

各功能使用的运输层服务:

UDP

特点:

  • 无连接
  • 尽最大努力交付(不保证可靠)
  • 面向报文(保留应用层报文边界)
  • 无拥塞控制
  • 支持一对一、一对多、多对一、多对多
  • 首部开销小(8字节)
    • 源端口
    • 目的端口
    • 长度
    • 检验和

TCP

特点:

  • 面向连接
  • 可靠传输(无差错、不丢失、不重复、按序到达)
  • 点对点(一对一通信)
  • 全双工通信
  • 面向字节流(将应用层报文看作字节序列)

可靠传输的工作原理

  • 停止-等待协议
    发送完一组,必须等待确认,得到确认之后才能发送下一组,若长时间没有的到确认,则重传(超时重传)
    确认丢失和确认迟到的情况如下:
  • 连续ARQ协议
    发送方维持一个发送窗口,窗口内的分组都能连续发送,不需要等待确认,收到一个分组的确认,则发送窗口向前移动一格 接收方采用累积确认,即不需要对每一个分组进行确认,可以收到几个连续分组后,对最后一个分组进行确认,表示这个分组及其之前的分组都到达了
  • 可靠传输的实现——滑动窗口机制

滑动窗口也用于流量控制,流量控制就是让发送方控制发送速率,免得接收方来不及接收,这里规定发送窗口大小不得超过接收窗口大小,这里接收方会通过(rwnd)不断提醒发送目前接收方接收窗口大小

TCP拥塞控制

发送方维持一个拥塞窗口

  • 慢开始
    拥塞窗口从1开始翻倍增长至阈值
  • 避免拥塞
    到达窗口阈值之后,线性增长,避免窗口太大造成拥塞
  • 快重传
    如果只是一时丢失确认造成超时,也适用慢开始算法的话,就太浪费资源了,因此接收方发送确认之后如果规定时间内未收到新的分组,则立刻重发确认三次。发送方如果收到连续三次确认,说明并未拥塞,只是偶然,因此执行快恢复算法,提高阈值,之后再进行避免拥塞
  • 快恢复

三次握手

  • client主动打开,发送连接请求报文段,首部SYN置1,随机取seq=x,进入SYN-SENT状态
  • server收到后,发送反馈报文,SYN置1,ACK置1,ack取x+1,随机取seq=y,进入SYN-RCVD状态
  • client收到后,勘查ack是否为x+1,发送确认,SYN置1,ACK置1,seq=x+1,ack=y+1,进入ESTABLISHED状态
  • server收到后,进入ESTABLISHED状态

三次握手是为了避免client发送连接请求,该请求滞留在网络上,client重发请求,server收到重发的请求后,建立连接,发送数据后关闭连接,这时,滞留的请求却送到了server,server又建立新的连接,但此时client并没有需求,此连接被空置,浪费了资源

四次挥手

  • client主动关闭,发送请求关闭报文,首部FIN=1,取seq为前面发送过的序号+1,即seq=u+1,进入FIN-WAIT-1状态
  • server收到后,发送确认,ACK=1,seq=v,ack=u+1,随机进入CLOSE-WAIT状态,此时A->B方向已关闭,B->A方向还可以发送剩下的数据,因此是半关闭状态
  • client收到确认之后,进入FIN-WAIT-2状态,等待server发送的连接释放报文
  • server发出连接释放报文,FIN=1,ACK=1,seq=w,ack=u+1,进入LAST-WAIT状态
  • client收到后,发出确认,ACK=1,seq=u+1,ack=w+1,进入TIME-WAIT状态
  • server收到最后确认之后,进入CLOSED状态
  • client进入CLOSED状态

    为何会有TIME-WAIT(2倍最长报文有效时间,4min)状态:

    • client发出的最后确认可能会丢失,导致server超时重传连接释放报文,client如果已经关闭了,则无法重新确认,那么server收不到最后确认,无法关闭
    • 使已失效的连接请求不会出现在本次连接中