✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
📝推荐参考地址:https://www.xiaolincoding.com/(这个大佬的专栏非常有用!)
55. udp 为什么延迟比较低?udp 丢包应该怎么处理?比如王者荣耀你一个技能放出去但是没有得到响应,用户体验下降怎么办?
UDP(用户数据报协议)相较于 TCP(传输控制协议),延迟较低的主要原因有两个方面:
- UDP 是无连接的:UDP 在传输数据时不需要进行建立连接和断开连接的过程,减少了握手和挥手的时间。这使得 UDP 在传输数据时不需要等待连接的建立和确认,从而减少了延迟。
- UDP 没有拥塞控制和数据重传机制:TCP 通过拥塞控制和数据重传来保证数据的安全可靠,这会引入一定的延迟。而UDP没有这些机制,所以在网络负载较轻、可靠性要求不高的场景下,可以减少一些额外的延迟。
然而,UDP 的不可靠性也导致了容易丢包的问题。当 UDP 发生丢包时,可以考虑以下几种处理方式:
3. 重传机制:应用层可以设计重传机制,在发送端设置一个定时器,如果在一定时间内没有收到确认或响应,就重发该数据包。这需要应用层自行实现。
4. 前向纠错:可以在发送端添加冗余数据,例如使用纠错码(如海明码)来增加数据的冗余度,从而在接收端检测和纠正丢失的数据。
5. 应用层协议设计:根据具体应用场景和需求,可以通过应用层协议设计来解决数据丢失的问题。例如,王者荣耀可以在技能发送后,等待一定时间后才取消技能施放,并向用户显示一个提示,以降低用户体验的下降程度。
56. 什么是 TCP?
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
- 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;
- 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;
- 字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。并且 TCP 报文是「有序的」,当「前一个」TCP 报文没有收到的时候,即使它先收到了后面的 TCP 报文,那么也不能扔给应用层去处理,同时对「重复」的 TCP 报文会自动丢弃。
57. 什么是 TCP 连接?
简单来说就是,用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
所以我们可以知道,建立一个 TCP 连接是需要客户端与服务端达成上述三个信息的共识。
- Socket:由 IP 地址和端口号组成
- 序列号:用来解决乱序问题等
- 窗口大小:用来做流量控制
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。
确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
控制位:
- ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。
- RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
- SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
- FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。