c++笔试面试之网络和多线程

所需积分/C币:50 2018-03-12 16:11:11 352KB PDF
收藏 收藏 5
举报

该文档是我总结的c++笔试面试通常会问的一些问题。另外可以从我的资源目录下找c++数据结构与算法,c++笔试面试基础两部分材料,综合这三个材料一起看,我相信大家一定尽快找到工作。
Client Server FIN WAIT 1I FIN M CLOSE WAIT ack M+1 FIN WAIT 2 LAST ACK FIN N TIME WAIT ACK=1 ack=K+ CLOSED m 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成 数据发送任务后,发送个FIN来终止这·方向的连接,收到个FIN只是意味着这方向 上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到 这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭, 上图描述的即是如此 第一次挥于 Client发送个HN,用来关闭 Client到 Server的数据传送, Client进入 FIN WA1状 第二次挥手 Server收到FIN后,发送一个ACK给 Clien,确认序号为收到序号+1(与SN相同,一个 FIN占用一个序号), Server进入 CLOSE WAIT状态。 第三次挥手 Server发送一个FIN,用来关闭 Server到 Client的数据传送, Server进入 LAST ACK状态。 第四次挥手 Client收到FIN后, Client进入 TIME WAIT状态,接着发送一个ACK给 Server,确认序号 为收到序号+1, Server进入CL0SED状态,完成四次挥手。 5.tcp为什么建立连接是三次握手,而关闭连接却是四次挥手呢? 当主杋A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是 可以发),就会发FN给主机B;主机B收到A发送的F⊥N,表示收到了,就会发送ACK回 复;但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FⅣN与ACK不是同时发 送的,而是等到B数据发送完了,才会发送FIN给主机A:;A收到B发米的FIN,知道B的 数据也发送完∫,回复ACK,A等待2MSL以后,没有收到B传来的任何消息,知道B已经 收到自己的ACK了,A就关闭链接,B也关闭链接了。 6.TCP头大小,包含字段? TCP协议头最少20个字节,包括TCP的源端口,目的端口,序列号,应答号等等。 7.tcp与udp的区别?为什么TCP要叫做数据流? 1).基于连接与无连接 2).对系统资源的要求(TCP较多,UDP少) 3).UDP程序结构较简单 4).流模式与数据报模式 5).TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证 6).TCP有拥塞控和流量控制,UDP没有 TCP提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在 双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丟弃重复数据,检 验数据,沇量控制等功能,保证数据能从端传到另·端 UDP是一个简单的面向数据报的运输层协议。∪DP不提供可靠性,它只是把应用程序传给 IP层的数据报发送出去,但是不能保证它们能到达目的地。山于UDP在传输数据报前不 用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快 8使用udp和tcp进程网络传输,为什么tcp能保证包是发送顺序,而udp无法保证? 因为TCP发送的数据包是按序号发送,有确认机制和丢失重传机制,而udp是不可靠的发 送机制,发送的对应端口的数据包不是按顺序发送的。 9tcp三次握手的, accept发生在三次握手哪个阶段? 三次握手:C--->SYNK >ACK K+1 SYN J C ->ACK]+1 DONEL client的 connect引起3次握于 server在 socket,bind, listen后,阻塞在 accept,三次握手完成后, accept返回 一个fd, TCP服务器端 sackett TC客户端 bindo sten) connecto 建立连接 阻寒直到有客户端连接 请求数据 write readr 处理请求 回应数据 readr 结束连接 readr y close 10.流量控制和拥塞控制的实现机制 数据的传送与接收过程当中很可能出现收方来不及接收的情况,这时就需要对发方进行 控制,以免数据丢失。流量控制是一种解决发送端与接收方吞吐量不匹配问题的机制。 网络拥瘧现象是指到达通信了网中杲部分的分组数量过多,使得该部分网络来不及处 理,以致引起这部分乃至整个冈络性能下降的现象,严重时甚至会导致网络通信业务陷入停 顿即出现死锁现象。拥塞控制是处理网络拥塞现象的一种机。 11.滑动窗口的实现机制 滑动窗凵机制是tcp流量控制的一种机制。滑动窗口分为发送窗凵和接收窗口,发送窗口 会根据接受窗口返回的ack中的大小来确定发送数据多少,如果ack返回可接受为零时, 发送窗口不发送数据,然后启动定时器,一定时间内给接收端发送探测报文。为了传递效率 提扃,发送数据吋会尽量次发送多个字节,这里会通过算法控制 接收窗口 发送窗口 接收窗口取决 发送窗口取决于对 于本段应用 端接收窗囗 应用 应用 接收窗口取决 发送窗口取决于对 于本段应用 端接收舍口 发送窗口 接收窗口 字节流方向 窗囗关联方问 发送窗口中的四个概念:已发送并收到确认;凵发送但未收到确认;允许发送但未发送;不 允许发送。每次成功发送完数据后,发送窗口都会根据接受窗口返冋的ack大小来调整窗口 大小 后浩 前沿 前移 收缩 前移 A的发送窗凵=20 E区图国时国时网國國回回区画乎图 已发送井 不允许发送 收到确认 允许发送的序号 B期望 收到的序号 图5-15根据B给出的窗口值,A构造出自己的发送窗口 12. linux的五种I0模式/异步模式 1)同步阻塞I/O 2)同步非阻塞I/O(只能阻塞个io) 3)同步I/O复用模型(可以阻塞多个i,用一个进程/线程调用多个io,其实是复用进稈/ 线程) 4)同步信号驱动I/O 5)异步I/O模型 3.网络编程设计模式, reactor/ proactor/半同步半异步模式? reactor模式:同步阻塞I/O模式,注册对应读写事件处理器,等待事件发生进而调用事件 处理器处理事件。 proactor模式:异步I/O模式。 Reactor和 Proactor模式的主要区别 就是真正的读取和写入操作是有谁来完成的, Reactor中需要应用程序自己读取或者写入 数据, Proactor模式中,应用程序不需要进行实际读写过程。 Reactor 是: 主线程往epo‖l核上注册 socket读事件,上线程调用 epoll_wait等待 socket上有数据 可读,当 socket上有数据可读的时候,主线程把 socket可读事件放入请求队列。睡眠在 请求队列上的某个工作线程被唤醒,处理客户请求,然后往epo‖!内核上注册 socket写请 求事件。主线程调用 epoll_wait等待写请求事件,当有事件可写的时候,主线程把 socket 可写事件放入请求队刎。睡眠在请求队列上的工作线程被唤醒,处理客户请求。 Proactor 主线程调用 aio read函数向内核注册 socket上的读完成事件,并告诉内核用广读缓冲区 的位置,以及读完成后如何通知应用程序,主线程继续处理其他逻辑,当 socket上的数据 被读入用户缓冲区后,通过信号告知应用程序数据已经可以使用。应用程序预先定义好的信 号处理凼数选择一个工作线程来处理客户请求。工作线程处理完客户请求之后调用 ao wrⅰte函数向内核注册 socke写完成事件,并告诉内核写缓冲区的位置,以及写完成 时如何通知应用程序。主线程处玛其他逻辑。当用户缓存区的数据被写入 socket之后内核 向应用程序发送一个信号,以通知应用程序数据已经发送完毕。应用程序预先定义的数据处 理函数就会完成工作。 半同步半异步模式 上:层的任务(如:数据库查询,文件传输)使用同步IO模型,简化了编写并行程序的难 度 而底层的任务(如网络控制器的中断处理)使用异步I/O模型,提供了执行效率 14.1inux下io多路复用的方案 select、poll、epol1的区别 select:利用一个数组结构(最大1024)来存储需要检测的描述符,每次调用需要清空数 组结构后重新存入新的描述符文件,然后遍历需要操作的描述符。可以用仨检测单个描述符 可以理解为拉取 pol:也是利用数组结构存储,但是没有描述符个数限制,而且每次调用时不需要清空存储 描述符结构数组。可以用于检测大量描述符的情况。可以理解为拉取 epoll:是 select/po!的升级版本,它的机制是可以监视大量的描述符,当有需要连接时将 改描述符存放到队列中,而epol只监视和执行队列中即可。可以用于大量并发连接中只有 少量活跃的情况。可以理解为推送 http://blog.csdnnet/lookatthestars/article/details/52108773 15.epo11哪些触发模式,有啥区别?(必须非常详尽的解释水平触发和边缘触发的区别, 以及边缘触发在编程中要做哪些更多的确认 epo‖有EPoL和 EPOLLET两种触发模式,LT是默认的模式,ET是高速"模式。LT 模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户稈序 去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不 会再提小」,无论fd中是否还有数据可读。所以在ET模式下,read一个fd的时候一定 要把它的 buffer读光,也就是说一直读到read的返回值小于请求值。 也就是说在LT模式的情况下‘定要确认收发的数据包的 buffer是不是足够大如果收发数 据包大小大于 buffer的大小的时侯就可能会出现数据丢失的情况。 16. Boost.asio、 libevent、1ibev简介。 Boost.asio是一个跨平台的C++库,用于网络和底层I/0编程,可以在I/0对象(如 socket)上执行同步和异步操作。 boost.asio的跨平台性原理是在win系统(支持I0CP) linux系统(支持epo11)。 boost:asio将整个异步平台抽象成 boost::asio: lo service, 用work控制 1o service生命周期,通知它是否结束,只要对象work( 1o servi ce)存在, 10 service就不会结束。利用 buffer类存储数据 libevent是一个C语言与的网络库,官方主要支持的是类 linux操作系统,最新的 版本添加了对 windows的I0CP的支持由于I0CP是异步I0,与 linux下的POL模型, EPOLL 型,还有 freebsd的 KQUEUE等这些同步模型在用法上完全不一致,所以使用方法也不 样,就好比ACE中的 Reactor和 Proactor模式一样,使用起来需要转变思路。如果对性能 没有特别的要求,那么使用 Libevent中的 select模型来实现跨平台的操作, select模 型可以橫跨 windows, linux,unix, solaris等系统。 libel是一个C语言写的,只支持1inux系统的库,我以前研究的时候只封装了EPOL 模型,不知道现在的新版有没有改进。使用方法类似 libevent,但是非常简洁,代码量 是最少的一个库,乜貮几千行代码。显然这样的代码跨平台肯定是无法支持的了,如果你 只需要在1inux下面运行,那用这个库也是可以的。 17. connect可能会长时间阻塞,怎么解决? 1.使用定时器;(最常用也最有效的·种方法 2.采用非阻塞模式:设置非阻塞,返回之后用 select检测状态 18. keepalive是什么东西?如何使用? keepalive,是在TCP中一个可以检测死连接的机制。 1).如果主机可达,对方就会响应ACK应答,就认为是存活的。 2).如果可达,但应用程序退岀,对方烑发RST应答,发送TCP撤消连接。 3).如果可达,但应用程序崩溃,对方就发FIN消息。 4).如果对方主杋不响应ack,rst,继续发送直到超时,就撤消连接。默认二个小时。 19. socket什么情况下可读? 1. socket接收缓冲区中己经接收的数据的字节数大于等于 socket接收缓冲区低潮限度的 当前值;对这样的 socket的读操作不会阻塞,并返回一个大于0的值(准备好读入的数据的 字节数) 2连接的读一半关闭(即:接收到对方发过来的FIN的TCP连接)并且返回0 3.s0cket收到了对方的 connect请求已经完成的连接数为非0这样的 socket处于可读 状态; 4.异常的情况下 socket的读操作将不会阻塞,并且返同一个错误(-1)。 20. socket编程,如果 client断电了,服务器如何快速知道? 使用定时器(适合有数据流动的情况); 使用sock吐t选项SO_ KEEPALIVE(适合没有数据流动的情况); 1)、自己编写心跳包程序,简单的说就是自己的程序加入一条线程,定时向对端发送数据包, 看是否有ACK,根据ACK的返回情况来管理连接。此方法比较通用,般使用业务层心跳 处理,灵活可控,但改变了现有的协议 2)、使用TCP的 keepalive机制,∪NX网络编程不推荐使用SO_ KEEPALIVE米做心跳 检测。 keepalive原理:TCP内嵌有心跳包,以服务端为例,当 serve检测到超过一定时间 (/proc/sys/net/ipv4/tcp_ keepalive_ time7200即2小时)没有数据传输,那么会向 client端发送一个 keepalive packet 21.如果 select返回可读,结果只读到0字节,什么情况? 某个套接字集合中没有准备好,可能会 select内存用 FD CLR清为0. 22.网络中,如果客户端突然掉线或者重启,服务器端怎么样才能立刻知道? 若客户端掉线或者重新启动,服务器端会收到复位信号,每一种tcp/ip得实现不一样,控 制机制也不·样。 23.TTL是什么?有什么用处,通常那些工具会用到它?ping? traceroute? ifconfig? netstat? TTL是 Time to live,每经过一个路由就会被减去一,如果它变成0,包会被丢掉。它的 主要目的是防止包在有回路的网络上死转,浪费网络资源。ping和 traceroute用到它。 24请说出http协议的优缺点 1.支持客户/服务器模式。2.简单快速:客户向服务器请求服务吋,只需传送请求方法和路 径,通信速度很快。3.灵活:HTTP允许传输任意类型的数据对象。4.无连接:无连接的含 义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断 廾连接。采用这种方式可以节省传输时间。5.无状态:HTTP协议是无状态协议。无状态是 指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必 须重传,导致每次连接传送的数据量增大。缺点就是不够安全,可以使用hps完成使用 25大规模连接上来,并发模型怎么设计 Epol1+线程池(epo11可以采用 libevent处理) 26.tcp怎么做到不丢包。 TCP提供超时重发(每一个seq后都有ack,计时时间到后重发seq),丢重复数据(通 过判断seq和ack的大小,如果seq比ack小说明发过了),检验数据(通过tcp的伪首 部),流量控制(利用滑动窗口实伣流量控制)等功能,保证数据能从一端传到另一端。 27.TCP的确认重发机制 A 发—B/a向b发送数据 B 确认-A//b收到数据后发送给a确认包 A-在重发数据中将发送成功的数据删掉 28.I0CP和epo1l的联系与区别? 联系:两者都是高效的io模型,都是基于事件驱动。 区别:TOCP用在 Windows上,epo11用在1inux上;IQCP本质是异步非阻塞的,而epo1l 是同步非阻塞的;1OCP是当事件完成时再通知,而 epoll是当事件满足处理要求是通知处 理。 boost中的asio网络模块的跨平台性原理是在win系统(支持IOCP),1inuκ系统(支持 epoll https://yg.aliyun.com/articles/53621 进程与线程 1.进程之间的通信 无名管道:单向通信,只能亲戚关系才能传递,般用在父了进程之间 有名管道:单向通信,可以用在任意两个进程之间通信。 信号量:是一种计数器,主要用于资源共亨,用在多个进程或者进程内多个线程之间同步手 段 共享内存:一个进程创建共多个进程使用,和信号一起使用在进程同步与通信。 信号:比较复朵的·种通信。 套接字: 消息队列:客服信号传递信息少,管道缓冲区受限。 2.线程同步 临界区,互斥对象,事件,信号量 3.多线程和多进程的区别 1)进程数据是分丌的:共享复岽,需要用IPC,同步简单;多线程共享进程数据:共享简 单,同步复杂 2)进程创建销毁、切换复杂,速度慢:线程创建销毁、切换简单,速度快 3)进程占用内存多,CPU利用率低;线程占用内存少,CPU利用率高 4)进程编程简单,调试简单;线程编程复杂,调试复杂 5)进程间不会相互影响;线程个线程挂掉将导致整个进程挂抻 6)进程适应于多核、多机分布;线程适用于多核 线程所私有的: 线程jd、寄存器的值、栈、线程的优先级和调度策略、线程的私有数据、信号屏蔽字、ero 变量。 4.多线程锁的种类有哪些? a.互斥锁( mutex)b.递归锁C.自旋锁d.读写锁 5.自旋锁和互斥锁的区别? 白旋锁中当锁被其他线程占用时,其他线程并不是睡眠状态,而是不停的消耗CPU,获取 锁;互斥锁则不然,保持睡眠,直到互斥锁被释放溦活。 自旋锁,递归调用容易造成死锁,对长时间才能获得到锁的情况,使用自旋锁容易造成CPU 效率低,只有内核可抢占式或SMP情况下才真正需要自旋锁 6.多线程程序架构,线程数量应该如何设置? 应尽量和CPU核数相等或者为CPU核数+1的个数 7.有一个计数器,多个线程都需要更新,会遇到什么问题,原因是什么,应该如何做?如 何优化? 有可能一个线程更新的数据已经被另外一个线程更新了,更新的数据就会出现异常,可以加 锁,保证数据史新只会被一个线程完成

...展开详情
试读 11P c++笔试面试之网络和多线程
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    一个资源只可评论一次,评论内容不能少于5个字
    hys_110 一般般吧,内容不是特别全面和详细
    2018-08-25
    回复
    wuhui9955 看看吧 还行
    2018-08-20
    回复
    daixiang28 看看吧 还行
    2018-08-09
    回复
    • 签到新秀

      累计签到获取,不积跬步,无以至千里,继续坚持!
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    c++笔试面试之网络和多线程 50积分/C币 立即下载
    1/11
    c++笔试面试之网络和多线程第1页
    c++笔试面试之网络和多线程第2页
    c++笔试面试之网络和多线程第3页
    c++笔试面试之网络和多线程第4页

    试读已结束,剩余7页未读...

    50积分/C币 立即下载 >