# 02|面试题笔记系列

“本文大约有 2794 字。

面试笔记系列的第 2 篇文章。

01面试题来源

  • 老虎二面

  • BIGO 一面

 

# 02|面试题笔记系列

02概念题

1. C++ 的内存管理?

在 C++ 中,内存分为 5 个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。

 

堆/栈、malloc/new

 

# 02|面试题笔记系列

# 02|面试题笔记系列

2. TCP 和 UDP 的区别?

TCP 是面向连接的,UDP 是面向无连接的。

 

  • TCP 提供可靠交付。UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。

  • TCP 是面向字节流的,发送的时候发的是一个流,没头没尾。UDP 是基于数据报的,一个一个的发,一个一个的收。

  • TCP 是可以有拥塞控制的。它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点。UDP 就不回,应用让他发,它就发,可不管网络情况怎么样。

  • TCP 是一个有状态服务,精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行。UDP 则是无状态服务,没有什么保证机制,一个包发出去就发出去了。

# 02|面试题笔记系列

 

3. TCP 怎么确定可靠传输?

  • 顺序问题,稳重不乱;

每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什么,然后按照 ID 一个个发送。

 

  • 丢包问题,承诺靠谱;

对于发送的包都要进行应答,有高效的累计确认。

 

  • 连接维护,有始有终;

 

  • 流量控制,把握分寸;

接收窗口控制发送窗口。当发送端的窗口为 0 时(接收方一直不处理数据),发送方会定时发送窗口探测数据包,看看是否有机会调整窗口大小。

 

  • 拥塞控制,知进知退。

避免包丢失和超时重传,指数式增长、线性增长,快速重传算法:cwnd 减半为 cwnd/2,然后 sshthresh = cwnd。

 

4. 流量控制与拥塞控制

流量控制机制,在对于包的确认中,同时会携带一个窗口的大小。包的确认到达的时候,窗口滑动,才有更多的包可以发送。

# 02|面试题笔记系列

如果接收方处理的太慢,导致缓存中没有空间了,可以通过确认信息修改窗口大小,降低发送方发送速度或者发送方暂停发送。

 

发送方会定时发送窗口探测数据包,看是否有机会调整窗口的大小。又要防止低能窗口综合征,别空出一个字节来就告诉发送方,有马上填满了,具备一定的松弛操作,直到到达一定的大小,才更新窗口。

 

“粘包”其实是应用程序中没有处理好数据包分割,两个应用层的数据包粘在一块了,这不关 TCP 的事,在大学学习网络的时候,书本上就没有这个名词。

 

拥塞控制:TCP 的拥塞控制主要来避免两种现象,即包丢失和超时重传。一旦出现了这些现象就说明,发送的速度太快了,要慢一些。

 

一条 TCP 连接开始,cwnd 设置为一个报文段,一次只能发送一个;当收到这一个确认的时候,cwnd 加一,于是一次能够发送两个;当这两个的确认到来的时候,每个确认 cwnd 加一,两个确认 cwnd 加二,于是一次能够发送四个;当这四个的确认到来的时候,每个确认 cwnd 加一,四个确认 cwnd 加四,于是一次能够发送八个。可以看出这是指数性的增长。

 

涨到什么时候是个头呢?有一个值叫做门限(ssthresh)为 65535 个字节,当超过这个值的时候,就要小心一点了,就不能增长那么快了。

 

于是,每收到一个确认后,cwnd 增加 1/cwnd,我们接着上面的过程来,一次发送八个,当八个确认到来的时候,每个确认增加 1/8,八个确认一共 cwnd 增加 1,于是一次能够发送九个,变成了线性增长。

 

但是线性增长还是增长,还是越来越多,直到发送拥塞。拥塞的一种表现形式是丢包,需要超时重传。

 

有一种方式是,将 sshresh 设为 cwnd/2,将 cwnd 设为 1,重新开始慢启动。。但是这种方式太激进了,将一个高速的传输速度一下子停了下来,会造成网络卡顿。

 

快速重传算法。当接收端发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速的重传,不必等待超时再重传。TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,cwnd 减半为 cwnd/2,然后 sshthresh = cwnd,呈线性增长。

 

TCP BBR 拥塞算法,它占满带宽,但是不占满缓存,时延较低。

03算法题

1. 怎么删除链表第 n 个结点?

(1)找到待删节点的前一个节点,然后指向待删节点的下一个节点,释放待删节点的空间。

(2)如果传入的参数为第 n 个节点,则可以直接将后一个节点值覆盖掉当前节点,然后删除后一节点。注:传入的节点不是最后一个节点。

# 02|面试题笔记系列

 

04理解应用题

1. STL 容器是线程安全的还是不安全的?

多线程读取是安全的,多线程对不同的容器写是安全的。多个线程可以读同一个容器内的数据,读时不允许写操作。

 

2. Windows 出现了内存泄漏怎么办?

* VC++ 的 CRT 库在 Debug 下支持内存的诊断。

* IBM 的 Purify 号称最强大的内存检测工具。

 

3. TCP, UDP 应用的场景

TCP 支持的应用层协议主要有:Telnet、FTP、SMTP、HTTP。

UDP 支持的应用层协议有:DNS、NFS(网络文件系统)、SNMP(简单的网络管理协议)、TFTP(通用文件传输协议)等。

 

UDP 的三大应用场景:

第一,需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。

第二,不需要一对一沟通,建立连接,而是可以广播的应用。第三,需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候。

 

基于 UDP 的五个例子:

(1)网页访问:QUIC(全称Quick UDP Internet Connections,快速 UDP 互联网连接)是 Google 提出的一种基于 UDP 改进的通信协议。QUIC 在应用层上,会自己实现快速连接建立、减少重传时延,自适应拥塞控制。

 

(2)流媒体的协议

很多直播应用,都基于 UDP 实现了自己的视频传输协议。直播,实时性比较比较重要,宁可丢包,也不要卡顿的。在网络不好的情况下,应用希望选择性的丢帧。

 

老的视频帧丢了其实也就丢了,就算再传过来用户也不在意了,他们要看新的了,如果老是没来就等着,卡顿了,新的也看不了,那就会丢失客户。

 

(3)实时游戏

游戏有一个特点,就是实时性比较高。TCP 的强顺序问题,如果出现一个数据包丢失,容易造成卡顿。游戏对实时要求较为严格的情况下,采用自定义的可靠 UDP 协议,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。

 

(4)IoT 物联网

物联网领域终端资源少,很可能只是个内存非常小的嵌入式系统,而维护 TCP 协议代价太大;另一方面,物联网对实时性要求也很高,而 TCP 还是因为上面的那些原因导致时延大。

 

Google 推出的物联网通信协议 Thread,就是基于 UDP 协议的。

 

在 4G 网络里,移动流量上网的数据面对的协议 GTP-U 是基于 UDP 的。

 

4. 红黑树

这里我写了一篇博客,讲的是红黑树与 2-3树的等价性,请看参考。

 

5. 稳定的排序算法

稳定性:*稳定排序算法*会让原本有相等键值的记录维持相对次序,原本在前面的还是在前面。

稳定的排序:冒泡、插入、桶子、计数、归并、基数。

“快”“堆”“选”“希“不稳。

快:2330 ==> 切分 i 和 j 互换,3 和 0 换。

堆:222 === > 第一个出堆后,选择后面的一个放到堆顶。

选择:221 ==> 122 一趟排序后,第一个 2 个最后一个 1 换了位置。

希尔明显不稳。

 

6. C++ 有哪些创建线程的方法?

(Function Pointer)函数指针

(Function Objects)函数对象

(Lambda functions)

生产者消费者,传递的是函数指针。

# 02|面试题笔记系列

05参考

1. 数据结构 | 2-3树与红黑树的等价性

https://donngdev.github.io/posts/rb-tree

2. Have Fun with LeetCode

https://github.com/donngdev/Have-Fun-with-LeetCode

 


 

PS:关注微信公众号「蓝本本」,和我一起学习、进修和放纵好奇心。

题图:Photo by Mohamed Khaled from Pexels.


 

 

Landon

——

学习、进修和放纵好奇心!

# 02|面试题笔记系列

@  蓝本本  

——

 

 

相关文章:

  • 2021-07-30
  • 2021-06-09
  • 2022-12-23
  • 2021-08-22
  • 2021-08-24
  • 2021-12-29
  • 2021-07-04
  • 2021-10-14
猜你喜欢
  • 2021-09-04
  • 2021-09-24
  • 2021-09-18
  • 2021-06-29
  • 2021-10-27
  • 2022-01-17
相关资源
相似解决方案