网络编程运输层TCP/UDP面试知识点

1 功能

1.1 进程间通信

  • 从通信和信息处理的角度看,运输层向应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层

  • 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能

  • 运输层为相互通信的应用进程提供了逻辑通信

    网络编程运输层TCP/UDP面试知识点

1.3 运输层的主要功能

  • 为应用进程之间提供端到端的逻辑通信
  • 对收到的报文进行差错检测
  • 需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP。

1.4 两种不同的运输协议

  • 运输层向高层用户屏蔽了下面网络核心的细节,它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道
  • 当运输层采用面向连接的 TCP 协议时,尽管下层的网络都是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道
  • 当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道

2 UDP与TCP异同

2.1 TCP 与 UDP

  • 两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。

  • TCP 传送的数据单位协议是 TCP 报文段(segment)

  • UDP(User Datagram Protocol) 传送的数据单位协议是 UDP 报文或用户数据报

  • TCP/IP 体系中的运输层协议

    网络编程运输层TCP/UDP面试知识点
    网络编程运输层TCP/UDP面试知识点
  • 第一次握手
    建立连接时,客户端发送syn包(syn=j)到服务器,进入态,待服务器确认

SYN:同步序列编号(Synchronize Sequence Numbers)

  • 第二次握手
    服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,服务器进入态
  • 第三次握手
    客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入状态,完成三次握手

完成三次握手,也就建立了客户端与服务端的连接。客户端与服务器开始传送数据。一个完整的三次握手也就是:请求—应答—再次确认。

那说到现在,到底什么是连接就是经过 TCP 三次握手后,双方主机准备好数据传输的资源(比如各种数据结构)。

4.2.3 四次挥手

由于TCP连接是全双工,因此每个方向都必须。

原则

当一方完成它的数据发送任务后,就能发送一个FIN来终止这个方向的连接。
收到一个 FIN只代表这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。
首先进行关闭的一方将执行主动关闭,另一方执行被动关闭。

工作流程

  • 客户端A发送一个FIN,以关闭Client A —->>>Server B的数据传送
  • B收FIN,发ACK,确认序号为收到的序号加1
  • B关闭与A的连接,发FIN给A
  • A发ACK报文确认,并将确认序号设置为收到序号加1
    网络编程运输层TCP/UDP面试知识点

    4.2.4 为什么建立连接是三次握手,而关闭连接却四次握手

    服务端的状态下的socket当收到syn报文的连接请求后,它可把ACK和SYN(ACK起应答作用,SYN起同步作用)放在同一个报文发送。

    但关连接时,当收到对方的FIN报文时,仅表示对方没有数据发送给你了,但未必你所有的数据都全部发送给对方了,所以你大可不必立即关闭socket,即你可能还需发送一些数据后,再发FIN来表示你也可以关连接了,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。

    4.3 可靠传输

    4.3.1 工作原理

    确认丢失和确认迟到

    4.3.2 可靠传输的实现

    TCP 通过下列方式提供可靠性

    • 将应用数据分割为 TCP 认为最合适发送的数据块
    • 超时重传
      当 TCP 发出一个段后,他启动一个定时器,等待目的端确认收到这个报文段
      若不能及时收到一个确认,将重发这个报文段
    • 当 TCP 收到发自 TCP 链接另一端的数据时,它将发送一个确认(对于收到的请求,给出确认响应)
      这个确认不是立即发送,通常将推迟几分之一秒(之所以推迟,可能是要对包做完校验)
    • 若 TCP 收到包,校验出包有错,丢弃报文段,不给出响应,TCP 发送端会超时重传
    • 对于失序数据进行重排序,然后交给应用层
      TCP 报文段作为 ip 数据报进行传输,而 ip 数据报的到达会失序,因此 TCP 报文段的到达也可能失序。若必要,TCP 将对收到的数据进行重新排列,以正确的顺序交给应用层
    • 对于重复数据,直接丢弃。
    • TCP 可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出。

    使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信

    这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)

    • ARQ表明重传的请求是自动进行的
      接收方不需要请求发送方重传某个出错的分组

    4.3.3 TCP 可靠通信的具体实现

    TCP 连接的每一端都必须设有两个窗口

    • 一个发送窗口
    • 一个接收窗口

    TCP 的可靠传输机制用字节的序号进行控制:所有的确认都是基于序号而不是基于报文段

    TCP 两端的四个窗口经常处于动态变化中

    TCP 连接的往返时间 RTT 也不是固定不变的:需要使用特定的算法估算较为合理的重传时间

    应用场景

    聊天消息传输、推送,单人语音、视频聊天等。几乎UDP能做的都能做,但需要考虑复杂性、性能问题。

    限制

    无法进行广播、多播等操作

    5 TCP 报文段的首部格式

    流量控制举例
  • 持续计时器(persistence timer)

    • TCP 为每一个连接设有一个持续计时器
    • 只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器
    • 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值
      • 若窗口仍是零,则收到这个报文段的一方就重新设置持续计时器。
      • 若窗口不是零,则死锁的僵局就可以打破了

6.2 传输效率

可以用不同的机制来控制 TCP 报文段的发送时机

  • TCP 维持一个变量,等于最大报文段长度(MSS)
    只要缓存中存放的数据达到MSS 字节,就组装成一个 TCP 报文段发送出去
  • 由发送方的应用进程指明要求发送报文段
    即 TCP 支持的推送(push)操作
  • 发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去

7 TCP的拥塞控制

7.1 原理

在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏——产生拥塞(congestion)

  • 出现拥塞的条件
    对资源需求 > 可用资源
  • 若网络中有许多资源同时产生拥塞,网络性能就会明显变坏,整个网络的吞吐量将随输入负荷的增大而下降

拥塞控制与流量控制的关系

  • 拥塞控制

    • 所要做的都有一个前提,就是网络能够承受现有的网络负荷
    • 是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素
  • 流量控制

    • 在给定的发送端和接收端之间的点对点通信量的控制
    • 抑制发送端发数据的速率,以便使接收端来得及接收
  • 拥塞控制所起的作用

    网络编程运输层TCP/UDP面试知识点

传输轮次(transmission round)

  • 使用慢开始算法后,每经过一个传输轮次,拥塞窗口 cwnd 就加倍
  • 一个传输轮次所经历的时间其实就是往返时间 RTT
  • “传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认
  • 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间

设置慢开始门限状态变量ssthresh

  • 当 cwnd < ssthresh 时,使用慢开始算法。
  • 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
  • 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
  • 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长

当网络出现拥塞时

  • 无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)
  • 然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法
  • 这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕

2.1.5 乘法减小(multiplicative decrease)

  • 不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值 ssthresh 设置为当前的拥塞窗口值乘以 0.5
  • 当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数

2.1.6 加法增大(additive increase)

执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。

文章知识点与官方知识档案匹配,可进一步学习相关知识网络技能树首页概览22327 人正在系统学习中

网络编程运输层TCP/UDP面试知识点 微信公众号 网络编程运输层TCP/UDP面试知识点 关注后台回复“面试”,领取海量学习资源

来源:JavaEdge.

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月9日
下一篇 2020年10月9日

相关推荐