UDP和TCP高频面试题

UDP 的特点

  1. 无连接:UDP 是无连接的协议,不需要建立连接即可发送数据。
  2. 不可靠传输:UDP 不提供数据包的确认机制,也不保证数据包的顺序或是否送达。
  3. 低延迟:由于没有连接建立和维护过程,UDP 具有较低的传输延迟,适用于对延迟敏感的应用。
  4. 无流量控制:UDP 不进行流量控制,发送端可以以任意速度发送数据包。
  5. 简单性:UDP 协议头较短,开销小,仅包含源端口、目的端口、长度和校验和。

TCP 的特点

  1. 面向连接:TCP 是面向连接的协议,在数据传输前需要建立连接(三次握手)。
  2. 可靠传输:TCP 提供可靠的数据传输,保证数据包按序到达,并通过确认机制重传丢失的数据包。
  3. 流量控制:TCP 实现流量控制,通过调整发送窗口大小避免网络拥塞。
  4. 拥塞控制:TCP 包含拥塞控制算法,动态调整发送速率以防止网络拥塞。
  5. 数据完整性:TCP 提供数据包的校验和,确保数据在传输过程中不被篡改。
  6. 连接管理:TCP 提供连接建立和断开机制(四次挥手)。

UDP 和 TCP 的区别

特性UDPTCP
连接类型无连接面向连接
传输可靠性不可靠可靠
传输顺序不保证保证按序传输
数据包重传不支持支持(通过确认和重传机制)
流量控制不支持支持
拥塞控制不支持支持
延迟相对较高
传输速度较慢(由于可靠性机制)
开销低(协议头较短)高(协议头较长,包含更多信息)
应用场景实时应用(如视频、语音)可靠性高的应用(如文件传输、邮件)

UDP 适用场景:

  • 实时通信:如 VoIP(语音通信)、视频会议、在线游戏等,需要低延迟而不一定需要可靠传输的场景。
  • 广播和组播:如局域网中的服务发现协议(如 mDNS、SSDP)等。
  • 简单的请求-响应协议:如 DNS 查询、SNMP 等。

TCP 适用场景:

  • 文件传输:如 FTP、SFTP,需要保证文件完整传输的场景。
  • 电子邮件:如 SMTP、IMAP、POP3,需要可靠传输的场景。
  • 网页浏览:如 HTTP、HTTPS,需要数据完整性和可靠性的场景。
  • 数据库连接:如 MySQL、PostgreSQL 等,需要稳定和可靠数据传输的场景。

TCP 的三次握手(为什么三次)

三次握手过程

  1. 第一次握手:客户端发送 SYN

    • 客户端向服务器发送一个 SYN(Synchronize Sequence Numbers)包,请求建立连接。
    • 这个 SYN 包包含了客户端的初始序列号 Seq = x
    • 客户端进入 SYN_SENT 状态。
    Client -> Server: SYN, Seq = x
    
  2. 第二次握手:服务器发送 SYN-ACK

    • 服务器收到客户端的 SYN 包后,发送一个 SYN-ACK 包给客户端,表示同意连接。
    • 这个 SYN-ACK 包包含了服务器的初始序列号 Seq = y,以及对客户端 SYN 包的确认 Ack = x + 1
    • 服务器进入 SYN_RECEIVED 状态。
    Server -> Client: SYN, Seq = y, ACK, Ack = x + 1
    
  3. 第三次握手:客户端发送 ACK

    • 客户端收到服务器的 SYN-ACK 包后,发送一个确认包 ACK 给服务器。
    • 这个 ACK 包包含了对服务器 SYN 包的确认 Ack = y + 1,以及客户端的下一个序列号 Seq = x + 1
    • 客户端进入 ESTABLISHED 状态,连接建立完成。
    Client -> Server: ACK, Seq = x + 1, Ack = y + 1
    
    • 服务器收到这个 ACK 包后,也进入 ESTABLISHED 状态,连接建立完成。

为什么需要三次握手?

1. 确认双方接收能力:

  • 第一次握手:客户端发送 SYN 包,告诉服务器希望建立连接,并发送初始序列号 Seq = x
  • 第二次握手:服务器发送 SYN-ACK 包,确认收到客户端的 SYN 包,并发送服务器的初始序列号 Seq = y
  • 第三次握手:客户端发送 ACK 包,确认收到服务器的 SYN-ACK 包,并确认双方可以接收和发送数据。

2. 防止重复的历史连接初始化:

  • 如果只进行两次握手,无法保证客户端和服务器都知道对方的接收能力。
  • 三次握手确保双方都确认了各自的接收和发送能力,并且不会误认为过期的 SYN 包是一个新的连接请求。

3. 防止 SYN 洪泛攻击:

  • 三次握手过程中的第二次握手(SYN-ACK)和第三次握手(ACK)有助于减轻 SYN 洪泛攻击的影响。
  • 服务器在收到 SYN 包后,会为这个连接分配一定的资源,但只有在收到客户端的第三次握手 ACK 包后,才会正式分配更多资源。
  • 这使得攻击者很难通过伪造大量 SYN 包来消耗服务器资源。

TCP 的四次挥手(为什么四次?)

四次挥手过程

  1. 第一次挥手:客户端发送 FIN

    • 客户端向服务器发送一个 FIN(Finish)包,表示客户端已经没有数据要发送了,请求关闭连接。
    • 这个 FIN 包包含了客户端的序列号 Seq = u
    • 客户端进入 FIN_WAIT_1 状态。
    Client -> Server: FIN, Seq = u
    
  2. 第二次挥手:服务器发送 ACK

    • 服务器收到客户端的 FIN 包后,发送一个 ACK 包作为确认,表示已经收到客户端的关闭请求。
    • 这个 ACK 包包含了服务器的确认号 Ack = u + 1
    • 服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
    Server -> Client: ACK, Ack = u + 1
    
  3. 第三次挥手:服务器发送 FIN

    • 服务器确认完客户端的 FIN 包后,若服务器也没有数据要发送了,就会发送一个 FIN 包给客户端,表示服务器也准备关闭连接。
    • 这个 FIN 包包含了服务器的序列号 Seq = v
    • 服务器进入 LAST_ACK 状态。
    Server -> Client: FIN, Seq = v
    
  4. 第四次挥手:客户端发送 ACK

    • 客户端收到服务器的 FIN 包后,发送一个 ACK 包作为确认,表示已经收到服务器的关闭请求。
    • 这个 ACK 包包含了客户端的确认号 Ack = v + 1
    • 客户端进入 TIME_WAIT 状态,并在等待一段时间(通常为 2 * 最大报文段寿命,2 * MSL)后,进入 CLOSED 状态,正式关闭连接。
    • 服务器收到这个 ACK 包后,立即进入 CLOSED 状态,正式关闭连接。
    Client -> Server: ACK, Ack = v + 1
    

为什么需要四次挥手?

1. 全双工通信的关闭:

  • TCP 是全双工的,即数据可以同时在两个方向上传输。
  • 因此,关闭连接时,两个方向的数据传输都需要单独关闭。
  • 四次挥手确保了双方各自的数据传输都能正常结束。

2. 双向确认关闭:

  • 每一方都需要确认对方的 FIN 包,以确保对方已经准备好关闭连接。
  • 四次挥手中的每一步都提供了必要的确认,保证了连接的可靠关闭。

3. 防止丢包和重传:

  • 每次挥手中的 ACK 包确认了对方的 FIN 包,确保没有数据包丢失。
  • 通过分开传输和确认 FIN 包,可以避免丢包和重传带来的问题。

4. TIME_WAIT 状态的必要性:

  • 客户端在最后一次挥手后进入 TIME_WAIT 状态,以确保最后的 ACK 包能够被服务器收到。
  • TIME_WAIT 状态的存在可以防止延迟的 FIN 包对未来的新连接产生影响。

四次挥手的必要性

每次挥手都起到重要作用:

  1. 第一次挥手:客户端发送 FIN,通知服务器没有数据要发送了。
  2. 第二次挥手:服务器确认 FIN 包,并通知客户端还需要发送数据。
  3. 第三次挥手:服务器发送 FIN,通知客户端服务器也没有数据要发送了。
  4. 第四次挥手:客户端确认 FIN 包,完成整个关闭过程。

TCP 可靠传输

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

一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:

图片

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

图片

其中 RTTd 为偏差的加权平均值。

TCP 滑动窗口

窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

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

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

TCP 流量控制

流量控制是为了控制发送方发送速率,保证接收方来得及接收。

接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

实际上,为了避免此问题的产生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅包含一个字节来获取最新的窗口大小信息。

TCP 拥塞控制

拥塞控制的四个阶段

慢启动、 拥塞避免、快速重传、快速恢复

1. 慢启动(Slow Start)

慢启动是为了防止网络突然被大量数据包淹没。在连接建立初期,发送窗口(拥塞窗口,cwnd)从一个较小的值开始,并逐渐增大。

  • 初始状态:cwnd = 1 MSS(最大报文段大小)
  • 增长方式:每收到一个 ACK,cwnd 增加 1 MSS
  • 指数增长:cwnd 以指数方式增长,即每个 RTT(往返时间)cwnd 值会翻倍
  • 阈值:如果 cwnd 超过慢启动阈值(ssthresh),则进入拥塞避免阶段
2. 拥塞避免(Congestion Avoidance)

在慢启动阶段,当 cwnd 达到慢启动阈值后,就会进入拥塞避免阶段,以避免拥塞。

  • 增长方式:cwnd 每个 RTT 增加 1 MSS
  • 线性增长:cwnd 以线性方式增长,即每个 RTT 增加一个固定值,而不是指数增长
  • 目的:防止网络过载,确保网络稳定运行
3. 快速重传(Fast Retransmit)

当发送方收到三个重复的 ACK 时,立即重传认为丢失的数据包,而不等待超时。

  • 三次重复 ACK:当收到三个重复的 ACK(即连续三个相同的 ACK),认为数据包丢失
  • 立即重传:立即重传丢失的数据包,而不是等待超时
4. 快速恢复(Fast Recovery)

在快速重传之后,进入快速恢复阶段,试图快速恢复传输速率。

  • 减半 cwnd:将 cwnd 减半,同时将 ssthresh 设置为 cwnd 的一半
  • 增加 cwnd:在每次收到新的 ACK 时,cwnd 增加 1 MSS,直到 cwnd 达到 ssthresh
  • 恢复到拥塞避免:当 cwnd 达到 ssthresh 时,恢复到拥塞避免阶段

不同的拥塞控制算法如 Tahoe、Reno、New Reno 和 CUBIC,进一步优化了拥塞控制机制,以适应不同的网络环境和需求。

OSI七层协议

OSI(Open Systems Interconnection)模型是一个标准化的网络通信框架,将网络通信划分为七个不同的层次。每一层都有特定的功能,并与上下层相互配合以完成数据的传输。

1. 物理层

功能

  • 传输原始的比特流
  • 通过物理媒体(如电缆、光纤、无线电波)进行比特传输
  • 定义物理连接的硬件规范,如电压、电缆规格、数据传输速率等

设备

  • 网线、光纤、电缆、集线器、调制解调器
2. 数据链路层

功能

  • 将数据帧从一个节点传输到相邻节点
  • 提供介质访问控制(MAC)和逻辑链路控制(LLC)
  • 检测和纠正物理层可能引入的错误

设备

  • 交换机、网卡、桥接器

协议

  • Ethernet、PPP、HDLC
3. 网络层

功能

  • 负责路径选择(路由)和逻辑地址(IP地址)分配
  • 管理数据包的传输和重组
  • 处理拥塞控制和网络间的互联

设备

  • 路由器

协议

  • IP、ICMP、IGMP
4. 传输层

功能

  • 提供端到端的可靠传输服务
  • 管理数据流量控制和错误校正
  • 确保数据包按序到达并无重复

协议

  • TCP、UDP
5. 会话层

功能

  • 管理应用程序之间的会话
  • 建立、维护和终止会话
  • 提供会话恢复和同步服务

协议

  • NetBIOS、RPC
6. 表示层

功能

  • 数据格式化、加密、解密和压缩
  • 处理数据的编码和转换,确保数据的语法和语义正确

协议

  • JPEG、MPEG、GIF、TLS/SSL
7. 应用层

功能

  • 为用户和应用程序提供网络服务
  • 直接与应用程序交互,提供诸如电子邮件、文件传输和网络浏览等功能

协议

  • 确保数据包按序到达并无重复

协议

  • TCP、UDP
5. 会话层

功能

  • 管理应用程序之间的会话
  • 建立、维护和终止会话
  • 提供会话恢复和同步服务

协议

  • NetBIOS、RPC
6. 表示层

功能

  • 数据格式化、加密、解密和压缩
  • 处理数据的编码和转换,确保数据的语法和语义正确

协议

  • JPEG、MPEG、GIF、TLS/SSL
7. 应用层

功能

  • 为用户和应用程序提供网络服务
  • 直接与应用程序交互,提供诸如电子邮件、文件传输和网络浏览等功能

协议

  • HTTP、FTP、SMTP、DNS、POP3、IMAP
  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值