15.C++面经

本文主要探讨了C++面试中涉及的操作系统和TCP/IP相关问题。在操作系统部分,讲解了进程切换内核栈的原因、虚拟内存与物理内存的关系及malloc的工作原理。在TCP/IP部分,详细阐述了TCP流量控制机制、粘包问题及其解决方案,以及TCP如何确保可靠传输,包括超时重传、流量控制和拥塞控制策略等核心概念。
摘要由CSDN通过智能技术生成

师兄版面试经验

1.操作系统

  • 进程切换为什么要切换内核栈;
    为了数据安全;…

  • malloc申请的是虚拟内存还是物理内存,两者之间的关系,怎么转换?
    虚拟内存;
    虚拟内存实际上是操作系统对于内存管理的一种方式,这些内存对应的物理地址,应用程序本身是无法知道的;
    虚拟内存映射到物理地址
    linux虚拟内存和物理内存的理解

  • malloc申请完空间时立即在堆区分配一块实际的物理空间吗?不是的话什么时候分配,怎么分配?
    malloc只是在进程虚拟地址空间得到一块地址,当需要访问时会发生缺页中断,然后系统为该虚拟地址分配物理地址,单纯的调研malloc而不访问该地址,则没有分配物理内存;

2、TCP/IP面试问题

  • TCP流量控制
    (1).接受方通过设置tcp数据包中接收窗口字段的大小来控制发送方发送数据的大小,当接收窗口的大小设置为0,发送方便不再发送数据 ;
    (2).若过了重发超时的时间以后还没有收到窗口更新,发送段会发送一个窗口探测包;
    (3).当接收方缓冲区有可用空间后,便会发送窗口更新通知给发送方;

  • tcp粘包问题
    (1) UDP协议的保护消息边界使得每一个消息都是独立的,因此udp不会发生粘包的问题;
    (2)而tcp是基于流的传输,而面向流的传输是没有保护边界的,流传输把数据当作一串数据流,如果发送方连续发送数据,接收端可能在一次的接收动作中接收到两个或者更多个数据包 ;
    什么情况下会发生:
    a.Nagle算法: 发送段为了将多个发往接收端的包更有效的发到对发;将多次间隔较小、数据量小的数据,合并成一个大的数据块,然后进行封包。
    Nagle算法规则
    i. 如果包长度达到MSS,则允许发送;
    ii.如果该包含有FIN,则允许发送;
    iii. 设置了TCP_NODELAY选项,则允许发送;
    vi. 未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
    v. 上述条件都未满足,但发生了超时(一般为200ms),则立即发送。
    b.接收端接收不及时造成的接收端粘包
    c.发送的数据包大小超过MSS

  • 解决方案
    a.每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接。这种算法的局限在于每次都要进行三次握手四次挥手,既浪费流量,又使数据传输延时性增大,socket不能很好的复用。
    b.特殊切割符来分割包。这种方式必须严格要求包体中不会出现该特殊字符,因此,需要控制使用范围。
    c.每个包都是固定长度。这种方式会造成包的体积很难确定,浪费流量等问题。
    d.发送端使用TCP强制数据立即传送的操作指令push。可能引发频繁发送小包所导致的流量浪费和网络阻塞问题。
    e.在消息的头部加上消息的大小

  • 延迟确认机制:延迟ACK的目的也是为了减少网络中传输大量的小报文数,但该报文数是针对ACK报文的 ;
    i. 一个来自发送端的报文到达接收端,TCP会延迟ACK的发送,希望应用程序会对刚刚收到的数据进行应答,这样就可以用新数据将ACK捎带过去 ;
    ii. 如果连续收到两个TCP包,并不一定需要ACK两次,只要回复最终的ACK就可以了,可以降低网络流量。

  • 连续arq协议
    a.滑动窗口协议:发送方和接收方各自维持着发送窗口和接受窗口,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
    b.连续ARQ协议:接收方一般采用累计确认方式,即接收方不必对收到的分组逐个发送确认,而是可以在收到几个分组后,对按序到达的最后一个分组发送确认,这样就表示:到这个分组位置的所有分组都已经正确收到了。

  • TCP累计确认的作用

  • 超时重传和快速恢复

  • TCP协议如何保证可靠传输的:
    TCP如何实现可靠传输的
    校验和: == TCP 将保持它首部和数据的检验和==。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
    TCP的接收段会丢弃重复的数据;
    流量控制:== TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据==。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制,将窗口字段设置为 0,则发送方不能发送数据
    拥塞控制: 当网路拥塞时,减少数据的发送;
    停止等待协议: 即每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
    超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

  • TCP的拥塞控制采用了四种算法
    (1)慢启动:ssthresh慢启动阈值)即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍 ;
    (2)拥塞避免:拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的cwnd加1 ;
    (3)快重传: 如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段(这个机制不需要等到重传定时器溢出),而快速重传以后,因为走的不是慢启动而是拥塞避免算法,所以这又叫做快速恢复算法 ;
    (4)快恢复:快重传之后,重新进入拥塞避免状态,而不是慢启动状态 ;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值