TCP/UDP面试题高频词汇详解

前言

本文是网络基础的最后一篇,解析常见的TCP面试高频词汇。

1、TCP/UDP的区别

  • 用户数据报协议 UDP(User Datagram Protocol)是无连接的,没有拥塞控制,面向数据报文段,提供非可靠性传输,传输效率高,一般用于即时通信。
  • 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,有流量控制,拥塞控制,面向字节流,提供可靠性传输,传输效率相对UDP较低,一般用于文件传输、发送和接收邮件等场景。

2、TCP三次握手/四次挥手

2.1、三次握手策略

如果面试说到网络这块,这道题目几乎是必问,我们日常用到最多的应用层HTTP协议,传输层使用的就是TCP协议,为了准确无误地把数据送达目标处,TCP 协议采用了三次握手策略:

  1. 客户端给服务端发送带有 SYN 标志、序号seq = J(J是随机数)、确认号 = 0的数据包完成一次握手
  2. 服务端给客户端发送带有 SYN/ACK 标志、序号seq = K(K是随机数), 确认号 = J + 1(SYN请求本身需要占用一个序号 )的数据包完成二次握手
  3. 客户端给服务端发送带有 ACK 标志、序号seq = J + 1,确认号 = K + 1的数据包完成三次握手

2.2、为什么需要三次握手

三次握手的目的是建立可靠的通信信道,目的是双方确认自己与对方的发送与接收是正常的:

  1. 第一次握手,服务端确认自己接收正常、确认客户端发送正常
  2. 第二次握手,客户端确认自己发送正常、接收正常,确认服务端发送正常、接收正常
  3. 第三次握手,服务端确认自己发送正常、接收正常,确认客户端发送正常、接收正常

2.3、四次挥手的策略

四次挥手是在断开TCP连接的时候,数据传输完毕后,双方都可释放连接。一般由客户端主动关闭,服务器被动关闭,我们将客户端用A代替,服务端用B代替,简单描述下四次握手的过程:

  • A发出连接释放报文段,首部 FIN = 1,序号 seq = i,等待B确认。
  • B发出确认报文段,确认号 ack = i+1,序号 seq = k。
  • A收到B的确认报文,A到B方向的连接就释放了,TCP 连接处于半关闭状态。A不能向B发送数据;B若发送数据,A仍要接收。
  • 当B不再需要连接时,发送连接释放请求报文段,FIN=1。
  • A收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(两个报文最大生命周期)释放连接。
  • B收到A的确认后释放连接。

2.4、为什么要四次挥手

TCP是全双工的,为了实现可靠的连接关闭,客户端发出结束报文FIN,服务端收到这个报文,就进入 CLOSE-WAIT 状态(服务端可能有未传送完毕的数据),服务端传送完毕之后,服务器会发送 FIN 连接释放报文。

客户端收到这个报文,向服务端发送确认报文,进入TIME_WAIT状态,等待2MSL(两个报文最大生命周期),发送设置等待时间有两个目的:
  1. 接收服务端重新发送连接释放请求(可能第一次没收到客户端确认报文)
  2. 让网络中延迟的FIN/ACK数据都消失,使得新的连接不会出现旧的连接请求报文。

2、超时重传

TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。

2.1、超时时间怎么确定

RTT(往返时延)表示数据包从发出去到收到对应 ACK 的时间。加权平均往返时间 RTTs 计算:

其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。 超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:

其中 RTTd 为偏差的加权平均值。想要深入的了解这个算法,参考RFC6298

2.2、重传机制

基于定时器的重传

这种机制下,每个数据包都有相应的计时器,一旦超过 RTO 而没有收到 ACK,就重发该数据包。没收到 ACK 的数据包都会存在重传缓冲区里,等到 ACK 后,就从缓冲区里删除。

快速重传

基于计时器的重传基于设置的超时时间,而快速重传使用了累计确认机制:服务器如果收到乱序的包,给客户端回复最近一次报文段的 ACK,如果相同的ACK累计达到3次就重发该数据包。

3、滑动窗口

窗口是缓存的一部分,用来暂时存放字节流,发送方和接收方各有一个窗口。发送方根据接收方窗口字段和其它信息设置自己的窗口大小,用来控制发送的速率,保证接收方来得及接收。

如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {16, 24, 30},其中 {24} 按序到达,而 {24, 30} 就不是,因此只对字节 16 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。

4、拥塞控制

流量控制是控制发送方的发送速率,让接收方能来得及接收;而拥塞控制是作用于网络,它是防止过多的包被发送到网络中,避免出现网络负载过大,降低整个网络的拥塞程度。TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。想要深入的了解这四个算法,参考 TCP的拥塞控制(详解)

结束语

本来还想多讲点内容的,但是实力限制了我的发挥……

我是夏夜凉月,咱们下篇再见

你可能感兴趣的:(网络,面试,tcp,网络协议)