C++面试常见问题总结

1、TCP为什么是可靠传输的?

答:TCP的可靠传输依赖于两个协议。停止等待协议和连续ARQ协议(自动重传请求),具体实现是以字节为单位的滑动窗口,超时重传和选择确认这三种方式,并辅以流量控制和拥塞控制这两种机制,来实现TCP的可靠传输。流量控制是指抑制发送端的发送速率,以便接受端来得及接受。拥塞控制有慢开始和拥塞避免,对应的快重传和快恢复。发送方维护一个拥塞窗口cwnd,取决于网络的拥塞程度,动态变化。慢开始门限。
在这里插入图片描述

2、TCP为什么是三次握手,四次挥手,两次握手为什么不行?

这主要是为了防止已失效的请求连接报文忽然又传送到了,从而产生错误。
  三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。
假定A向B发送一个连接请求,由于一些原因,导致A发出的连接请求在一个网络节点逗留了比较多的时间。此时A会将此连接请求作为无效处理又重新向B发起了一次新的连接请求,B正常收到此连接请求后建立了连接,数据传输完成后释放了连接。如果此时A发出的第一次请求又到达了B,B会以为A又发起了一次连接请求,如果是两次握手:此时连接就建立了,B会一直等待A发送数据,从而白白浪费B的资源。 如果是三次握手:由于A没有发起连接请求,也就不会理会B的连接响应,B没有收到A的确认连接,就会关闭掉本次连接。

3、为什么需要TIME_WAIT,TIMEWAIT状态也称为2MSL等待状态。

1)为实现TCP这种全双工(full-duplex)连接的可靠释放
这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用。
 2)为使旧的数据包在网络因过期而消失
每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime)。它是任何报文段被丢弃前在网络内的最长时间。

4、为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,我们也未必全部数据都发送给对方了,所以我们不可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,我们的ACK和FIN一般都会分开发送。

5、I/O模型

select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

6、进程间常见的通信方式

管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系,具有固定的读端和写端。
命名管道:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
消息队列:
共享内存
信号量:作为进程同步控制
套接字socket:不同主机之间进程通信
信号:signal

7、条件变量

是进程间同步的一种机制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值