华为交换机arp攻击 128K MAC 空间能存储多少arp表项

&figure&&img src=&https://pic4.zhimg.com/v2-7b37cbb19c40a_b.jpg& data-rawwidth=&1350& data-rawheight=&950& class=&origin_image zh-lightbox-thumb& width=&1350& data-original=&https://pic4.zhimg.com/v2-7b37cbb19c40a_r.jpg&&&/figure&&p&&b&一、ARP攻击概述&/b&&/p&&p&在上篇文章里,我给大家普及了ARP协议的基本原理,包括ARP请求应答、数据包结构以及协议分层标准,今天我们继续讨论大家最感兴趣的话题:&b&ARP攻击原理是什么?通过ARP攻击可以做什么,账号是否可以被窃取?有哪些常见的ARP渗透(攻击)工具可以用来练手?ARP扫描和攻击有什么区别,底层数据包特征是怎样的?&/b&&/p&&p&接下来,我们通过图解的方式来深入了解ARP攻击是如何实现的。&/p&&p&&br&&/p&&p&&b&二、ARP攻击原理&/b&&/p&&p&但凡局域网存在ARP攻击,都说明网络存在&中间人&,我们可以用下图来解释。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cea1daf14fdb_b.jpg& data-rawwidth=&1350& data-rawheight=&698& class=&origin_image zh-lightbox-thumb& width=&1350& data-original=&https://pic4.zhimg.com/v2-cea1daf14fdb_r.jpg&&&/figure&&p&&br&&/p&&p&在这个局域网里面,PC1、PC2、PC3三台主机共同连接到交换机SW1上面,对应3个接口port1/2/3。假设PC3这台主机安装了ARP攻击软件或遭受ARP病毒,成为这个网络的攻击者(hacker),接下来,PC3是如何攻击的?先不急,先来回顾下PC1和PC2是如何通信的。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-e1b7e53428c74_b.jpg& data-rawwidth=&1346& data-rawheight=&942& class=&origin_image zh-lightbox-thumb& width=&1346& data-original=&https://pic1.zhimg.com/v2-e1b7e53428c74_r.jpg&&&/figure&&p&&br&&/p&&p&①PC1需要跟PC2通信,通过ARP请求包询问PC2的MAC地址,由于采用广播形式,所以交换机将ARP请求包从接口P1广播到P2和PC3。(注:&b&交换机收到广播/组播/未知帧都会其他接口泛洪&/b&)&/p&&p&&br&&/p&&p&②PC2根据询问信息,返回ARP单播回应包;此时PC3作为攻击者,没有返回ARP包,但是处于&&b&监听&/b&&状态,为后续攻击做准备。&/p&&p&&br&&/p&&p&③PC1和PC2根据ARP问答,将各自的ARP映射信息(IP-MAC)存储在本地ARP缓存表。&/p&&p&&br&&/p&&p&④交换机根据其学习机制,记录MAC地址对应的接口信息,存储在&b&CAM缓存表&/b&(也称为MAC地址表)。交换机收到数据包时,会解封装数据包,根据&b&目标MAC&/b&字段进行转发。&/p&&p&&br&&/p&&p&关于上面的图解,我们要记住这些关键知识(敲黑板!):&/p&&p&&u&①主机通信需要查找ARP表,而交换机通信需要查找CAM表(路由器则查找Route表)。&/u&&/p&&p&&u&注:ARP表:ip&-&mac
CAM表:mac&-&port
(Route表:route&-&port)&/u&&/p&&p&&u&②交换机基于源MAC地址学习,基于目的MAC地址转发。&/u&&/p&&p&&u&③同一局域网内,攻击者可以根据主机的ARP广播请求监听其IP和MAC信息。&/u&&/p&&p&&u&注:这里是&被动监听&,跟后面要谈到的&主动扫描&,原理上有区分,这里先埋个坑)&/u&&/p&&p&&br&&/p&&p&接下来是重点,我们来看看PC3(Hacker)是如何发起ARP攻击的=&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-383f86e253b689d40ff20d648ce7afac_b.jpg& data-rawwidth=&1348& data-rawheight=&944& class=&origin_image zh-lightbox-thumb& width=&1348& data-original=&https://pic1.zhimg.com/v2-383f86e253b689d40ff20d648ce7afac_r.jpg&&&/figure&&p&正常情况下,若收到的ARP请求不是给自己的,则直接丢弃;而这里PC3(Hacker)在监听之后,发起了ARP回应包:&b&我就是PC2(IP2-MAC3)&/b&。&/p&&p&&br&&/p&&p&从拓扑可以出现,PC3明明是IP3对应MAC3,很显然这就是一个ARP欺骗行为。于此同时,PC2正常的ARP回应包也交到了PC1手中,我们来看PC1接下来如何处理的:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d234cb3ec99e072f16c1_b.jpg& data-rawwidth=&1344& data-rawheight=&692& class=&origin_image zh-lightbox-thumb& width=&1344& data-original=&https://pic2.zhimg.com/v2-d234cb3ec99e072f16c1_r.jpg&&&/figure&&p&&br&&/p&&p&PC1收到两个ARP回应包,内容分别如下:&/p&&p&③我是PC2,我的IP地址是&b&IP2&/b&,我的MAC地址是&b&MAC2&/b&;&/p&&p&③我是PC2,我的IP地址是&b&IP2&/b&,我的MAC地址是&b&MAC3&/b&;&/p&&p&PC1一脸懵:&b&咋回事?还有这操作?不管了,我选最新的!(后到优先)&/b&&/p&&p&这里给大家顺便普及下网络协议里各种表在处理缓存信息的方式:&/p&&p&&u&要么&先到先得&,要么&后到优先&。&/u&上面提到的ARP和CAM表,就是遵循&后到优先&原则,而后面章节我们会讲到的DHCP表,则遵循&先到先得&原则。&/p&&p&&br&&/p&&p&那么问题来了,上面两个ARP回应包到底哪个先到哪个后到呢?&/p&&p&作为初学者,可能还在纠结前后这种naive的问题;而作为hacker,只要持续不停发出ARP欺骗包,就一定能够覆盖掉正常的ARP回应包。&b&稳健的ARP嗅探/渗透工具,能在短时间内高并发做网络扫描(例如1秒钟成千上百的数据包),能够持续对外发送欺骗包。&/b&&/p&&p&&br&&/p&&p&无论如何,当PC1和PC2这种&小白&用户遇到PC3(hacker)时,最终的结果一定是这样的:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-fa4f37272dfc31d2ecbaa55_b.jpg& data-rawwidth=&1342& data-rawheight=&698& class=&origin_image zh-lightbox-thumb& width=&1342& data-original=&https://pic2.zhimg.com/v2-fa4f37272dfc31d2ecbaa55_r.jpg&&&/figure&&p&&br&&/p&&p&小白 vs 黑客,很明显的较量,PC1最终记录的是虚假的ARP映射:IP2&-&MAC3,得到错误信息的PC1,接下来会发生什么情况呢?(我们以PC1 ping PC2为例)&/p&&figure&&img src=&https://pic1.zhimg.com/v2-bade17b91e12c9f9ad5536858abf1350_b.jpg& data-rawwidth=&1350& data-rawheight=&950& class=&origin_image zh-lightbox-thumb& width=&1350& data-original=&https://pic1.zhimg.com/v2-bade17b91e12c9f9ad5536858abf1350_r.jpg&&&/figure&&p&&br&&/p&&p&根据数据封装规则,当PC1要跟PC2进行通信时,无论是发生PING包还是发送其他数据,首先要查找ARP表,然后在网络层打上源目IP,在链路层打上源目MAC,然后将数据包发送给交换机。交换机收到之后对数据进行解封装,并且查看CAM表(基于目的MAC转发),由于目标MAC3对应Port3,所以交换机自然而然将其转发给PC3。&/p&&p&&br&&/p&&p&就这样,PC1本来要发给PC2的数据包,落到了PC3(Hacker)手里,这就完成了一次完整的ARP攻击。反过来,&b&如果PC2要将数据包发送给PC1,PC3仍然可以以同样的ARP欺骗实现攻击&/b&,这就有了下面这张图(PC3既欺骗了PC1,也欺骗了PC2)。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-badeaeda6d3fd_b.jpg& data-rawwidth=&1346& data-rawheight=&944& class=&origin_image zh-lightbox-thumb& width=&1346& data-original=&https://pic2.zhimg.com/v2-badeaeda6d3fd_r.jpg&&&/figure&&p&此时,PC1和PC2的通信数据流被PC3拦截,形成了典型的&&b&中间人攻击&/b&&。那么,一旦被攻击并拦截,攻击者能做什么,普通用户又会遭受什么损失?这里给大家举几个常见的例子=&&/p&&p&&br&&/p&&p&①攻击者既然操控了数据流,那么直接断开通信是轻而易举的,即&b&&断网攻击&&/b&,例如,PC1发给PC2的数据在PC3这里可以直接丢弃,而如果这里的PC2是一台出口路由器(无线路由器),那就意味着PC1直接无法连上互联网。&/p&&p&&br&&/p&&p&②&断网攻击&显然容易被发现,而且比较&残忍&,所以就有了更加常见的应用-&b&&限速&&/b&。例如,在宿舍上网突然很慢,在网吧上网突然打不开网页,如果这个网络没有安全防御,那么很有可能有&内鬼&。&/p&&p&&br&&/p&&p&③其实无论是&断网攻击&还是&限速&,整体还是比较&善良&,因为这里流量里面的核心数据还没有被&提取&出来。如果攻击者是一名真正的黑客,他的目的一定不会这么无聊,因为内网流量对于黑客是没有太大价值的,而只有&b&&用户隐私&&/b&,例如常见网站的登录账号密码,这些才是最有价值的。&/p&&p&&br&&/p&&p&&b&问:遭受ARP攻击之后,哪些账号可能被窃取?&/b&&/p&&p&答:&b&任何基于明文传输的应用,都可以被窃取。&/b&例如,如果一个网站不是HTTPS协议,而是基于HTTP明文传输,那么当你登录这个网站时,你的密码就会被窃取。除了http(web应用),常见的还有telnet、ftp、pop3/smtp/imap(邮箱)等应用,都很容易泄露密码。&/p&&p&&br&&/p&&p&&b&三、常见ARP渗透工具与底层原理分析&/b&&/p&&p&基于ARP欺骗原理设计出来的渗透/攻击工具非常多,而最终能实现什么功能则各有差异,简单举几个例子:&/p&&p&&br&&/p&&p&①无毒无害型的&b&仅具备ARP扫描&/b&功能,用来发现内网主机;例如Metasploit里面的arping/arpscan相关模块;&/p&&p&&br&&/p&&p&②&b&ARP扫描+流量控制&/b&(限速或限制能上哪些网站和应用);例如Windows下的P2P终结者;&/p&&p&&br&&/p&&p&③&b&ARP扫描+账号窃取&/b&(网站、邮箱、各种);最强的莫过于Windows下的Cain,当然还有跨平台的Ettercap(需配合其他工具);&/p&&p&&br&&/p&&p&当然,如果攻击者足够强悍,也可以基于协议底层原理,编写自己的ARP工具。这里我&b&通过wirehshark给大家还原真实网络中常见的ARP扫描和欺骗攻击&/b&(具体的软件使用这里暂时不出现,大家重点关注底层实现)。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-af3955ede46f22ea77c335_b.jpg& data-rawwidth=&1344& data-rawheight=&892& class=&origin_image zh-lightbox-thumb& width=&1344& data-original=&https://pic2.zhimg.com/v2-af3955ede46f22ea77c335_r.jpg&&&/figure&&p&&br&&/p&&p&在这张图里面,Hacker(就是我...)接入了一个WiFi网络,这个10.1.20.0/24便是所在的网段。刚进来一个陌生网络,Hacker只知道自己的IP信息,例如IP地址是10.1.20.253,网关地址是10.1.20.254,而这个局域网的其他设备是什么?有多少台?地址分布是多少?Hacker都不知道,接下来怎么办呢?是不是要直接发动ARP攻击了?&/p&&p&&br&&/p&&p&不用这么着急,咋们至少要先了解下这个网络,进行基本的&b&扫描和踩点&/b&。这个时候通过ARP工具对这个WiFi网络进行扫描,具体的数据包截图如下:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-4be8b9ec3_b.jpg& data-rawwidth=&1398& data-rawheight=&1030& class=&origin_image zh-lightbox-thumb& width=&1398& data-original=&https://pic4.zhimg.com/v2-4be8b9ec3_r.jpg&&&/figure&&p&&br&&/p&&p&上面的ARP扫描过程,大概的情况是这样的=&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bc0c22fcceafb_b.jpg& data-rawwidth=&1348& data-rawheight=&904& class=&origin_image zh-lightbox-thumb& width=&1348& data-original=&https://pic4.zhimg.com/v2-bc0c22fcceafb_r.jpg&&&/figure&&p&其实,这就是典型的&盲扫&或者&暴力扫描&:反正我不知道网络到底有多少主机,那我就尝试一下把整个网段全部问一遍得了。&b&好比老师上课点名,把每个学生的桌位号念一遍,谁举手就到勤,没举手就算逃课。&/b&&/p&&p&&br&&/p&&p&那么,这个实际网络里面,到底谁&举手&了呢?我们来看Wireshark抓包情况。&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c2b83eee5ca25d570c56_b.jpg& data-rawwidth=&1392& data-rawheight=&924& class=&origin_image zh-lightbox-thumb& width=&1392& data-original=&https://pic3.zhimg.com/v2-c2b83eee5ca25d570c56_r.jpg&&&/figure&&p&&br&&/p&&p&在ARP应答信息里面,除了IP地址和MAC信息,我们还能看到相关的设备厂商信息,例如cisco、meizu、apple、xiaomi等,这其实就是依靠MAC地址前面24位的&b&OUI(机构唯一标识符)&/b&来识别的。&/p&&p&&br&&/p&&p&Wireshark或扫描器能够帮我们将OUI转为对应的厂商(还有一些扫描器基于Netbios协议,还能找到电脑的主机名),所以,扫描之后可以得到下面这张图片=&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-0f25c1953baf27dee5d5972_b.jpg& data-rawwidth=&1350& data-rawheight=&900& class=&origin_image zh-lightbox-thumb& width=&1350& data-original=&https://pic3.zhimg.com/v2-0f25c1953baf27dee5d5972_r.jpg&&&/figure&&p&通过扫描,我们已经知道了整个网络的主机信息,例如20.254对应cisco,应该是路由器,20.248对应apple,是苹果手机,20.249对应xiaomi,是小米手机,以此类推.....&/p&&p&&br&&/p&&p&接下来,如何进行ARP欺骗攻击呢?这里将最重点的数据包截取出来=&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f7ee8af394dea99a5e732c_b.jpg& data-rawwidth=&1016& data-rawheight=&1212& class=&origin_image zh-lightbox-thumb& width=&1016& data-original=&https://pic1.zhimg.com/v2-f7ee8af394dea99a5e732c_r.jpg&&&/figure&&p&&br&&/p&&p&根据之前的信息,我们知道00:08:ca:86:f8:0f其实就是hacker的mac地址,并且对应的真正的IP地址应该是10.1.20.253。而这里很明显是&b&hacker在欺骗局域网其他主机,它对外声称:自己就是&所有人&&/b&。尤其是上面标红的主机,我们已经知道是小米、思科、苹果等设备,但是hacker都声明是自己!这样做的意义在于覆盖掉其他主机的ARP缓存表信息,并生成错误的ARP映射,最终将通信流量交给hacker。&/p&&p&&br&&/p&&p&当然,还有另外一种ARP欺骗的做法:&b&hacker告诉所有人,自己就是网关&/b&。因为其他主机访问互联网必经之路便是网关(出口路由器/无线路由器),通过这种方式,同样可以截取到用户数据流,这里给出另外一个网络的实现过程=&&/p&&p&&br&&/p&&p&&b&Hacker欺骗主机Honhai,告诉它:我就是网关(10.1.1.254)&/b&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c84bb53a020e66a771ecb_b.jpg& data-rawwidth=&1082& data-rawheight=&450& class=&origin_image zh-lightbox-thumb& width=&1082& data-original=&https://pic4.zhimg.com/v2-c84bb53a020e66a771ecb_r.jpg&&&/figure&&p&&br&&/p&&p&&b&Hacker欺骗主机Apple,告诉它:我就是网关(10.1.1.254)&/b& &/p&&figure&&img src=&https://pic1.zhimg.com/v2-ae6e5be13a78d917cec20_b.jpg& data-rawwidth=&1084& data-rawheight=&460& class=&origin_image zh-lightbox-thumb& width=&1084& data-original=&https://pic1.zhimg.com/v2-ae6e5be13a78d917cec20_r.jpg&&&/figure&&p&&br&&/p&&p&依此类推,Hacker会告诉局域网所有主机:自己就是网关,并且后续可以把数据都丢给我,我来转发到互联网。&/p&&p&&br&&/p&&p&&b&四、ARP攻击总结&/b&&/p&&p&①ARP缓存表基于&后到优先&原则,IP与MAC的映射信息能被覆盖;&/p&&p&②ARP攻击基于伪造的ARP回应包,黑客通过构造&错位&的IP和MAC映射,覆盖主机的ARP表(也被称为&ARP毒化&),最终截取用户的数据流;&/p&&p&③一旦遭受ARP攻击,账号密码都可能被窃取(如果通信协议不是加密的);&/p&&p&④通过Wireshark数据包分析,我们掌握了真实网络中ARP底层攻击原理及数据包组成。&/p&&p&&br&&/p&&p&&b&预告:ARP防御篇&/b&&/p&&p&如何防御ARP攻击?&/p&&p&有哪些ARP防御软件?&/p&&p&如果被ARP攻击了,如何揪出&内鬼&,应该如何&还手&?&/p&&p&企业网/家庭网的防御方法有什么区别?&/p&&p&&br&&/p&&p&&b&【相关推荐】&/b&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&图解ARP协议(一)&/a&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.pinginglab.net/course/164& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《TCP/IP协议栈视频教程》&/a&&/p&&p&新浪微博:&a href=&http://link.zhihu.com/?target=http%3A//www.weibo.com/jaykingchen& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@拼客学院陈鑫杰&/a&&/p&&p&微信公众号:拼客院长陈鑫杰&/p&&p&拼客学院:&a href=&http://link.zhihu.com/?target=http%3A//www.pinginglab.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&pinginglab.net&/span&&span class=&invisible&&&/span&&/a&&/p&
一、ARP攻击概述在上篇文章里,我给大家普及了ARP协议的基本原理,包括ARP请求应答、数据包结构以及协议分层标准,今天我们继续讨论大家最感兴趣的话题:ARP攻击原理是什么?通过ARP攻击可以做什么,账号是否可以被窃取?有哪些常见的ARP渗透(攻击)工具可…
&p&作者:oscarwin&/p&&p&链接:&a href=&https://link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/59394%3Ftype%3D0%26order%3D0%26pos%3D81%26page%3D1& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&nowcoder.com/discuss/59&/span&&span class=&invisible&&394?type=0&order=0&pos=81&page=1&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&来源:牛客网&/p&&p&&br&&/p&&p&从牛客获得太多的资源,来一发面经,纯技术干货。面试的技巧,心态,简历也都很重要,不过牛客有很多大佬总结的太好了,就不重复了。&/p&&p&主要是C++后台开发,基本总结了我自己面试常问到的,看别人的面经问到过的,分享出来交流一下。&/p&&h2&C++后台开发面试常见问题汇总&/h2&&p&&br&&/p&&h2&C和C++语言基础&/h2&&p&&br&&/p&&ul&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/yc_sunniwell/archive//1777431.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&extern关键字作用&/a&&/b&&/li&&/ul&&ol&&li&extern声明变量在在外部定义? &/li&&li&extern修饰函数? &/li&&li&extern C的作用?用法? &/li&&/ol&&p&&br&&/p&&ul&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/shanghairuoxiao/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&static关键字作用&/a&&/b&&/li&&/ul&&ol&&li&static修饰局部变量? &/li&&li&static全局变量?(限定变量在一个编译单元内,一个编译单元就是指一个cpp和它包含的头文件,这个回答可以结合编译需要经历的几个过程来答) &/li&&li&static修饰普通函数? &/li&&li&static修饰成员变量? &/li&&li&static修饰成员函数? &/li&&/ol&&p&&br&&/p&&ul&&li&&b&volatile是干啥的&/b&&/li&&/ul&&ol&&li&访问寄存器要比访问内存要块,因此CPU会优先访问该数据在寄存器中的存储结果,但是内存中的数据可能已经发生了改变,而寄存器中还保留着原来的结果。为了避免这种情况的发生将该变量声明为volatile,告诉CPU每次都从内存去读取数据。 &/li&&li&一个参数可以即是const又是volatile的吗?可以,一个例子是只读状态寄存器,是volatile是因为它可能被意想不到的被改变,是const告诉程序不应该试图去修改他。 &/li&&/ol&&p&&br&&/p&&ul&&li&&b&说说const的作用,越多越好&/b&&/li&&/ul&&ol&&li&const修饰全局变量; &/li&&li&const修饰局部变量; &/li&&li&const修饰指针,const int *; &/li&&li&const修饰指针指向的对象, int * const; &/li&&li&const修饰引用做形参; &/li&&li&const修饰成员变量,必须在构造函数列表中初始化; &/li&&li&const修饰成员函数,说明该函数不应该修改非静态成员,但是这并不是十分可靠的,指针所指的非成员对象值可能会被改变 &/li&&/ol&&p&&br&&/p&&ul&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/shanghairuoxiao/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&new与malloc区别&/a&&/b&&/li&&/ul&&ol&&li&new分配内存按照数据类型进行分配,malloc分配内存按照大小分配; &/li&&li&new不仅分配一段内存,而且会调用构造函数,但是malloc则不会。new的实现原理?但是还需要注意的是,之前看到过一个题说int&i& p = new int与int&/i& p = new int()的区别,因为int属于C++内置对象,不会默认初始化,必须显示调用默认构造函数,但是对于自定义对象都会默认调用构造函数初始化。翻阅资料后,在C++11中两者没有区别了,自己测试的结构也都是为0; &/li&&li&new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化; &/li&&li&new是一个操作符可以重载,malloc是一个库函数; &/li&&li&new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free则不会; &/li&&li&malloc分配的内存不够的时候,可以用realloc扩容。扩容的原理?new没用这样操作; &/li&&li&new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。因此对于new,正确的姿势是采用try...catch语法,而malloc则应该判断指针的返回值。为了兼容很多c程序员的习惯,C++也可以采用new nothrow的方法禁止抛出异常而返回NULL; &/li&&li&new和new[]的区别,new[]一次分配所有内存,多次调用构造函数,分别搭配使用delete和delete[],同理,delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n; &/li&&li&如果不够可以继续谈new和malloc的实现,空闲链表,分配方法(首次适配原则,最佳适配原则,最差适配原则,快速适配原则)。delete和free的实现原理,free为什么直到销毁多大的空间? &/li&&/ol&&p&&br&&/p&&ul&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/hackbuteer1/article/details/7475622& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++多态性与虚函数表&/a&&/b&&/li&&/ul&&ol&&li&C++多态的实现?&br&多态分为静态多态和动态多态。静态多态是通过重载和模板技术实现,在编译的时候确定。动态多态通过虚函数和继承关系来实现,执行动态绑定,在运行的时候确定。&br&动态多态实现有几个条件:&br&(1) 虚函数;&br&(2) 一个基类的指针或引用指向派生类的对象;&br&基类指针在调用成员函数(虚函数)时,就会去查找该对象的虚函数表。虚函数表的地址在每个对象的首地址。查找该虚函数表中该函数的指针进行调用。&br&每个对象中保存的只是一个虚函数表的指针,C++内部为每一个类维持一个虚函数表,该类的对象的都指向这同一个虚函数表。&br&虚函数表中为什么就能准确查找相应的函数指针呢?因为在类设计的时候,虚函数表直接从基类也继承过来,如果覆盖了其中的某个虚函数,那么虚函数表的指针就会被替换,因此可以根据指针准确找到该调用哪个函数。 &/li&&li&虚函数的作用?&/li&&ol&&li&虚函数用于实现多态,这点大家都能答上来 &/li&&li&但是虚函数在设计上还具有封装和抽象的作用。比如抽象工厂模式。 &/li&&/ol&&/ol&&p&&br&&/p&&ol&&ol&&li&动态绑定是如何实现的?&br&第一个问题中基本回答了,主要都是结合虚函数表来答就行。&/li&&/ol&&/ol&&p&&br&&/p&&ol&&ol&&li&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&静态多态和动态多态&/a&。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。&/li&&/ol&&/ol&&p&&br&&/p&&ol&&ol&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/haoel/article/details/1948051/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&虚函数表&/a&&/b&&/li&&li&虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的? &/li&&li&编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。 &/li&&/ol&&/ol&&p&&br&&/p&&ul&&li&&b&纯虚函数如何定义,为什么对于存在虚函数的类中析构函数要定义成虚函数&/b&&br&为了实现多态进行动态绑定,将派生类对象指针绑定到基类指针上,对象销毁时,如果析构函数没有定义为析构函数,则会调用基类的析构函数,显然只能销毁部分数据。如果要调用对象的析构函数,就需要将该对象的析构函数定义为虚函数,销毁时通过虚函数表找到对应的析构函数。&/li&&/ul&&p&1&/p&&p&2&code&//纯虚函数定义&/code&&/p&&p&&code&virtual ~myClass() = 0;&/code&&/p&&p&&br&&/p&&ul&&li&&b&析构函数能抛出异常吗&/b&&br&答案肯定是不能。 C++标准指明析构函数不能、也不应该抛出异常。C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持。那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源, 这就是调用这些对象的析构函数来完成释放资源的任务,所以从这个意义上说,析构函数已经变成了异常处理的一部分。&/li&&/ul&&p&&br&&/p&&blockquote&(1) 如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。&br&(2) 通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。&/blockquote&&p&&br&&/p&&ul&&li&&b&构造函数和析构函数中调用虚函数吗?&/b&&/li&&/ul&&p&&br&&/p&&ul&&li&&b&指针和引用的区别&/b&&/li&&/ul&&ol&&li&指针保存的是所指对象的地址,引用是所指对象的别名,指针需要通过解引用间接访问,而引用是直接访问; &/li&&li&指针可以改变地址,从而改变所指的对象,而引用必须从一而终; &/li&&li&引用在定义的时候必须初始化,而指针则不需要; &/li&&li&指针有指向常量的指针和指针常量,而引用没有常量引用; &/li&&li&指针更灵活,用的好威力无比,用的不好处处是坑,而引用用起来则安全多了,但是比较死板。 &/li&&/ol&&p&&br&&/p&&ul&&li&&b&指针与数组千丝万缕的联系&/b&&/li&&/ul&&ol&&li&一个一维int数组的数组名实际上是一个int* const 类型; &/li&&li&一个二维int数组的数组名实际上是一个int (*const p)[n]; &/li&&li&数组名做参数会退化为指针,除了sizeof &/li&&/ol&&p&&br&&/p&&ul&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/xiehongfeng100/p/4645555.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&智能指针是怎么实现的?什么时候改变引用计数?&/a&&/b&&/li&&/ul&&ol&&li&构造函数中计数初始化为1; &/li&&li&拷贝构造函数中计数值加1; &/li&&li&赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一; &/li&&li&析构函数中引用计数减一; &/li&&li&在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。 &/li&&li&share_prt&T&与weak_ptr&T&的区别? &/li&&/ol&&p&&br&&/p&&p&&code&//share_ptr可能出现循环引用,从而导致内存泄露&/code&&/p&&p&&code&class&/code& &code&A&/code&&/p&&p&&code&{&/code&&/p&&p&&code&public:&/code&&/p&&p&&code&share_ptr&B&&/code&&/p&&p&&code&};&/code&&/p&&p&&br&&/p&&p&&code&class&/code& &code&B&/code&&/p&&p&&code&{&/code&&/p&&p&&code&public:&/code&&/p&&p&&code&share_ptr&A&&/code&&/p&&p&&code&}&/code&&/p&&p&&br&&/p&&p&&code&int&/code& &code&main()&/code&&/p&&p&&code&{&/code&&/p&&p&&code&while(true)&/code&&/p&&p&&code&{&/code&&/p&&p&&code&share_prt&A& pa(new&/code& &code&A()); //pa的引用计数初始化为1&/code&&/p&&p&&code&share_prt&B& pb(new&/code& &code&B()); //pb的引用计数初始化为1&/code&&/p&&p&&code&pa-&p = //pb的引用计数变为2&/code&&/p&&p&&code&pb-&p = //pa的引用计数变为2&/code&&/p&&p&&code&}&/code&&/p&&p&&code&//假设pa先离开,引用计数减一变为1,不为0因此不会调用class A的析构函数,因此其成员p也不会被析构,pb的引用计数仍然为2;&/code&&/p&&p&&code&//同理pb离开的时候,引用计数也不能减到0&/code&&/p&&p&&code&return&/code& &code&0;&/code&&/p&&p&&code&}&/code&&/p&&p&&br&&/p&&p&&code&/*&/code&&/p&&p&&code&** weak_ptr是一种弱引用指针,其存在不会影响引用计数,从而解决循环引用的问题&/code&&/p&&p&&code&*/&/code&&/p&&p&&br&&/p&&ul&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//www.jellythink.com/archives/205& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++四种类型转换&/a&&/b&:&b&static_cast, dynamic_cast, const_cast, reinterpret_cast&/b&&/li&&/ul&&ol&&li&const_cast用于将const变量转为非const &/li&&li&static_cast用的最多,对于各种隐式转换,非const转const,void*转指针等, static_cast能用于多态想上转化,如果向下转能成功但是不安全,结果未知; &/li&&li&dynamic_cast用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。要深入了解内部转换的原理。 &/li&&li&reinterpret_cast几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用; &/li&&li&为什么不使用C的强制转换?C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。 &/li&&/ol&&p&&br&&/p&&ul&&li&&b&内存对齐的原则&/b&&/li&&/ul&&ol&&li&从0位置开始存储; &/li&&li&变量存储的起始位置是该变量大小的整数倍; &/li&&li&结构体总的大小是其最大元素的整数倍,不足的后面要补齐; &/li&&li&结构体中包含结构体,从结构体中最大元素的整数倍开始存; &/li&&li&如果加入pragma pack(n) ,取n和变量自身大小较小的一个。 &/li&&/ol&&p&&br&&/p&&ul&&li&&b&内联函数有什么优点?内联函数与宏定义的区别?&/b&&/li&&/ul&&ol&&li&宏定义在预编译的时候就会进行宏替换; &/li&&li&内联函数在编译阶段,在调用内联函数的地方进行替换,减少了函数的调用过程,但是使得编译文件变大。因此,内联函数适合简单函数,对于复杂函数,即使定义了内联编译器可能也不会按照内联的方式进行编译。 &/li&&li&内联函数相比宏定义更安全,内联函数可以检查参数,而宏定义只是简单的文本替换。因此推荐使用内联函数,而不是宏定义。 &/li&&li&使用宏定义函数要特别注意给所有单元都加上括号,#define MUL(a, b) a &i& b,这很危险,正确写法:#define MUL(a, b) ((a) &/i& (b)) &/li&&/ol&&p&&br&&/p&&ul&&li&&b&C++内存管理&/b&&/li&&/ul&&ol&&li&C++内存分为那几块?(堆区,栈区,常量区,静态和全局区) &/li&&li&每块存储哪些变量? &/li&&li&学会迁移,可以说到malloc,从malloc说到操作系统的内存管理,说道内核态和用户态,然后就什么高端内存,slab层,伙伴算法,VMA可以巴拉巴拉了,接着可以迁移到fork()。 &/li&&/ol&&p&&br&&/p&&ul&&li&&b&STL里的内存池实现&/b&&br&STL内存分配分为一级分配器和二级分配器,一级分配器就是采用malloc分配内存,二级分配器采用内存池。&/li&&/ul&&p&&br&&/p&&p&二级分配器设计的非常巧妙,分别给8k,16k,..., 128k等比较小的内存片都维持一个空闲链表,每个链表的头节点由一个数组来维护。需要分配内存时从合适大小的链表中取一块下来。假设需要分配一块10K的内存,那么就找到最小的大于等于10k的块,也就是16K,从16K的空闲链表里取出一个用于分配。释放该块内存时,将内存节点归还给链表。&br&如果要分配的内存大于128K则直接调用一级分配器。&br&为了节省维持链表的开销,采用了一个union结构体,分配器使用union里的next指针来指向下一个节点,而用户则使用union的空指针来表示该节点的地址。&/p&&p&&br&&/p&&ul&&li&&b&STL里set和map是基于什么实现的。红黑树的特点?&/b&&/li&&/ul&&p&&br&&/p&&ol&&ol&&li&set和map都是基于红黑树实现的。 &/li&&li&红黑树是一种平衡二叉查找树,与AVL树的区别是什么?AVL树是完全平衡的,红黑树基本上是平衡的。 &/li&&li&为什么选用红黑数呢?因为红黑数是平衡二叉树,其插入和删除的效率都是N(logN),与AVL相比红黑数插入和删除最多只需要3次旋转,而AVL树为了维持其完全平衡性,在坏的情况下要旋转的次数太多。&br&红黑树的定义:&br&(1) 节点是红色或者黑色;&br&(2) 父节点是红色的话,子节点就不能为红色;&br&(3) 从根节点到每个页子节点路径上黑色节点的数量相同;&br&(4) 根是黑色的,NULL节点被认为是黑色的。 &/li&&/ol&&/ol&&p&&br&&/p&&ul&&li&&b&STL里的其他数据结构和算法实现也要清楚&/b&&br&这个问题,把STL源码剖析好好看看,不仅面试不慌,自己对STL的使用也会上升一个层次。&/li&&/ul&&p&&br&&/p&&ul&&li&&b&必须在构造函数初始化式里进行初始化的数据成员有哪些&/b&&br&(1) 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面&br&(2) 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面&br&(3) 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化&/li&&/ul&&p&&br&&/p&&ul&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/thefutureisour/article/details/7964682/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&模板特化&/a&&/b&&br&(1) 模板特化分为全特化和偏特化,模板特化的目的就是对于某一种变量类型具有不同的实现,因此需要特化版本。例如,在STL里迭代器为了适应原生指针就将原生指针进行特化。&/li&&/ul&&p&&br&&/p&&ul&&li&&b&&a href=&https://link.zhihu.com/?target=http%3A//www.cnblogs.com/skynet/archive//1959162.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&定位内存泄露&/a&&/b&&br&(1)在windows平台下通过CRT中的库函数进行检测;&br&(2)在可能泄漏的调用前后生成块的快照,比较前后的状态,定位泄漏的位置&br&(3)Linux下通过工具valgrind检测&/li&&/ul&&p&&br&&/p&&p&&br&&/p&&ul&&li&&b&手写strcpy&/b&&br&```&br&char&i& strcpy(char&/i& dst, const char&i& src)&br&{&br&
assert(dst);&br&
assert(src);&br&
char&/i& ret =&br&
while((&i&dst++ = &/i&src++) != '\0');&br&&br&}&br&//该函数是没有考虑重叠的 &/li&&/ul&&p&char&i& strcpy(char&/i& dst, const char&i& src)&br&{&br&
assert((dst != NULL) && (src != NULL));&br&
char&/i& ret =&br&
int size = strlen(src) + 1;&br&
if(dst & src || dst & src + len)&br&
dst = dst + size - 1;&br&
src = src + size - 1;&br&
while(size--)&br&
{&br&&i&dst-- = &/i&src--;&br&
while(size--)&br&
{&br&&i&dst++ = &/i&src++;&br&
}&br&&br&}&/p&&p&&br&&/p&&p&1&code&- **手写memcpy函数**&/code&&/p&&p&void&i& memcpy(void&/i& dst, const void&i& src, size_t size)&br&{&br&
if(dst == NULL || src == NULL)&br&
return NULL;&br&
void&/i& res =&br&
char&i& pdst = (char&/i&)&br&
char&i& psrc = (char&/i&)&/p&&p&&br&&/p&&p&&code&if(pdst & psrc && pdst & psrc + size) //重叠&/code&&/p&&p&&code&{&/code&&/p&&p&&code&pdst = pdst + size - 1;&/code&&/p&&p&&code&psrc = pdst + size - 1;&/code&&/p&&p&&code&while(size--)&/code&&/p&&p&&code&{&/code&&/p&&p&&code&*pdst-- = *psrc--;&/code&&/p&&p&&code&}&/code&&/p&&p&&code&}&/code&&/p&&p&&code&else&/code& &code&//无重叠&/code&&/p&&p&&code&{&/code&&/p&&p&&code&while(size--)&/code&&/p&&p&&code&{&/code&&/p&&p&&code&*dst++ = *src++;&/code&&/p&&p&&code&}&/code&&/p&&p&&code&}&/code&&/p&&p&&code&return&/code& &code&&/code&&/p&&p&}&/p&&p&&br&&/p&&p&1&code&- **手写strcat函数**&/code&&/p&&p&char&i& strcat(char&/i& dst, const char&i& src)&br&{&br&
char&/i& ret =&/p&&p&&br&&/p&&p&&code&while(*dst != '\0')&/code&&/p&&p&&code&++&/code&&/p&&p&&br&&/p&&p&&code&while((*dst++ = *src) != '\0');&/code&&/p&&p&&code&return&/code& &code&&/code&&/p&&p&}&/p&&p&&br&&/p&&p&1&code&- **手写strcmp函数**&/code&&/p&&p&int strcmp(const char&i& str1, const char&/i& str2)&br&{&/p&&p&&br&&/p&&p&&code&while(*str1 == *str2 && *str1 != '\0')&/code&&/p&&p&&code&{&/code&&/p&&p&&code&++str1;&/code&&/p&&p&&code&++str2;&/code&&/p&&p&&code&}&/code&&/p&&p&&code&return&/code& &code&*str1 - *str2;&/code&&/p&&p&}&/p&&p&&code&# 数据结构与算法&/code&&/p&&p&&br&&/p&&p&&code&这一块考察范围太广,主要靠多刷题吧,牛客网,剑指OFFER,LeetCode等。&/code&&/p&&p&&br&&/p&&p&&code&### [**Hash表**](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&- Hash表实现(拉链和分散地址)&/code&&/p&&p&&code&- Hash策略常见的有哪些?&/code&&/p&&p&&code&- STL中hash_map扩容发生什么?&/code&&/p&&p&&code&(1) 创建一个新桶,该桶是原来桶两倍大最接近的质数(判断n是不是质数的方法:用n除2到$sqrt(n)$范围内的数) ;&/code&&/p&&p&&code&(2) 将原来桶里的数通过指针的转换,插入到新桶中(注意STL这里做的很精细,没有直接将数据从旧桶遍历拷贝数据插入到新桶,而是通过指针转换)&/code&&/p&&p&&code&(3) 通过swap函数将新桶和旧桶交换,销毁新桶。&/code&&/p&&p&&br&&/p&&p&&code&### [**树**](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&- 二叉树结构,二叉查找树实现;&/code&&/p&&p&&code&- 二叉树的六种遍历;&/code&&/p&&p&&code&- 二叉树的按层遍历;&/code&&/p&&p&&code&- 递归是解决二叉树相关问题的神级方法;&/code&&/p&&p&&code&- 树的各种常见算法题(http://blog.csdn.net/xiajun/article/details/);&/code&&/p&&p&&br&&/p&&p&&code&- **什么是红黑树?**&/code&&/p&&p&&code&- 节点为红色或者黑色;&/code&&/p&&p&&code&- 根节点为黑色;&/code&&/p&&p&&code&- 从根节点到每个叶子节点经过的黑色节点个数的和相同;&/code&&/p&&p&&code&- 如果父节点为红色,那么其子节点就不能为红色。&/code&&/p&&p&&br&&/p&&p&&code&- **红黑树与AVL树的区别**&/code&&/p&&p&&code&- 红黑树与AVL树都是平衡树,但是AVL是完全平衡的(平衡就是值树中任意节点的左子树和右子树高度差不超过1);&/code&&/p&&p&&code&- 红黑树效率更高,因为AVL为了保证其完全平衡,插入和删除的时候在最坏的情况下要旋转logN次,而红黑树插入和删除的旋转次数要比AVL少。&/code&&/p&&p&&br&&/p&&p&&code&- **[Trie树(字典树)](http://blog.csdn.net/hackbuteer1/article/details/7964147)**&/code&&/p&&p&&code&- 每个节点保存一个字符&/code&&/p&&p&&code&- 根节点不保存字符&/code&&/p&&p&&code&- 每个节点最多有n个子节点(n是所有可能出现字符的个数)&/code&&/p&&p&&code&- 查询的复杂父为O(k),k为查询字符串长度&/code&&/p&&p&&br&&/p&&p&&code&### **链表**&/code&&/p&&p&&code&- 链表和插入和删除,单向和双向链表都要会&/code&&/p&&p&&code&- 链表的问题考虑多个指针和递归&/code&&/p&&p&&code&(1) 反向打印链表(递归)&/code&&/p&&p&&code&(2) 打印倒数第K个节点(前后指针)&/code&&/p&&p&&code&(3) 链表是否有环(快慢指针)等等。b ggg&/code&&/p&&p&&br&&/p&&p&&code&### **栈和队列**&/code&&/p&&p&&code&- **队列和栈的区别**?(从实现,应用,自身特点多个方面来阐述,不要只说一个先入先出,先入后出,这个你会别人也会,要展现出你比别人掌握的更深)&/code&&/p&&p&&code&- 典型的应用场景&/code&&/p&&p&&br&&/p&&p&&code&### **海量数据问题**&/code&&/p&&p&&code&- 十亿整数(随机生成,可重复)中前K最大的数&/code&&/p&&p&&code&类似问题的解决方法思路:首先哈希将数据分成N个文件,然后对每个文件建立K个元素最小/大堆(根据要求来选择)。最后将文件中剩余的数插入堆中,并维持K个元素的堆。最后将N个堆中的元素合起来分析。可以采用归并的方式来合并。在归并的时候为了提高效率还需要建一个N个元素构成的最大堆,先用N个堆中的最大值填充这个堆,然后就是弹出最大值,指针后移的操作了。当然这种问题在现在的互联网技术中,一般就用map-reduce框架来做了。&/code&&/p&&p&&code&大数据排序相同的思路:先哈希(哈希是好处是分布均匀,相同的数在同一个文件中),然后小文件装入内存快排,排序结果输出到文件。最后建堆归并。&/code&&/p&&p&&br&&/p&&p&&code&- **十亿整数(随机生成,可重复)中出现频率最高的一千个**&/code&&/p&&p&&br&&/p&&p&&code&### [**排序算法**](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&- 排序算法当然是基础内容了,必须至少能快速写出,快排,建堆,和归并&/code&&/p&&p&&code&- 每种算法的时间空间复杂度,最好最差平均情况&/code&&/p&&p&&br&&/p&&p&&code&### [**位运算**](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&br&&/p&&p&&code&### 布隆过滤器&/code&&/p&&p&&code&几十亿个数经常要查找某一个数在不在里面,使用布隆过滤器,布隆过滤器的原理。布隆过滤器可能出现误判,怎么保证无误差?&/code&&/p&&p&&br&&/p&&p&&code&#网络与TCP/IP&/code&&/p&&p&&br&&/p&&p&&code&- [TCP与UDP之间的区别](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&(1) IP首部,TCP首部,UDP首部&/code&&/p&&p&&code&(2) TCP和UDP区别&/code&&/p&&p&&code&(3) TCP和UDP应用场景&/code&&/p&&p&&code&(4) 如何实现可靠的UDP&/code&&/p&&p&&br&&/p&&p&&code&- [TCP三次握手与四次挥手](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&br&&/p&&p&&code&- [详细说明TCP状态迁移过程](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&(1) 三次握手和四次挥手状态变化;&/code&&/p&&p&&code&(2) 2MSL是什么状态?作用是什么?&/code&&/p&&p&&br&&/p&&p&&code&- [TCP相关技术](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&1. TCP重发机制,Nagle算法&/code&&/p&&p&&code&2. TCP的拥塞控制使用的算法和具体过程&/code&&/p&&p&&code&3. TCP的窗口滑动&/code&&/p&&p&&br&&/p&&p&&code&- [TCP客户与服务器模型,用到哪些函数](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&br&&/p&&p&&code&- [UDP客户与服务器模型,用到哪些函数](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&br&&/p&&p&&code&- [域名解析过程,ARP的机制,RARP的实现](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&1. RARP用于无盘服务器,开机后通过发送RARP包给RARP服务器,通过mac地址得到IP地址&/code&&/p&&p&&br&&/p&&p&&code&- Ping和TraceRoute实现原理&/code&&/p&&p&(1) Ping是通过发送ICMP报文回显请求实现。&br&(2) TraceRoute通过发送UDP报文,设置目的端口为一个不可能的值,将IP首部中的TTL分别设置从1到N,每次逐个增加,如果收到端口不可达,说明到达目的主机,如果是因为TTL跳数超过,路由器会发送主机不可达的ICMP报文。&/p&&p&&br&&/p&&p&&code&## [HTTP](https://github.com/semlinker/awesome-http#bs-%E7%BB%93%E6%9E%84%E5%AE%9A%E4%B9%89)&/code&&/p&&p&&br&&/p&&p&&code&#### **http/https 1.0、1.1、2.0**&/code&&/p&&p&&code&1. http的主要特点:&/code&&/p&&p&&code&**简单快速:**当客户端向服务器端发送请求时,只是简单的填写请求路径和请求方法即可,然后就可以通过浏览器或其他方式将该请求发送就行了&/code&&/p&&p&&code&**灵活:** HTTP 协议允许客户端和服务器端传输任意类型任意格式的数据对象&/code&&/p&&p&&code&**无连接:**无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。(当今多数服务器支持Keep-Alive功能,使用服务器支持长连接,解决无连接的问题)&/code&&/p&&p&&code&**无状态:**无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即客户端发送HTTP请求后,服务器根据请求,会给我们发送数据,发送完后,不会记录信息。(使用 cookie 机制可以保持 session,解决无状态的问题)&/code&&/p&&p&&br&&/p&&p&&code&2. http1.1的特点&/code&&/p&&p&&code&a、默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求&/code&&/p&&p&&code&b、管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应&/code&&/p&&p&&code&c、断点续传ftghh&/code&&/p&&p&&br&&/p&&p&&code&3. [http2.0的特点](http://www.cnblogs.com/frankyou/p/6145485.html)&/code&&/p&&p&&code&a、HTTP/2采用二进制格式而非文本格式&/code&&/p&&p&&code&b、HTTP/2是完全多路复用的,而非有序并阻塞的——只需一个HTTP连接就可以实现多个请求响应&/code&&/p&&p&&code&c、使用报头压缩,HTTP/2降低了开销&/code&&/p&&p&&code&d、HTTP/2让服务器可以将响应主动“推送”到客户端缓存中&/code&&/p&&p&&br&&/p&&p&&code&#### **get/post 区别**&/code&&/p&&p&区别一:&br&get重点在从服务器上获取资源,post重点在向服务器发送数据;&br&区别二:&br&get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用&?&连接,多个请求数据间用&&&连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;&br&post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;&br&区别三:&br&Get传输的数据量小,因为受URL长度限制,但效率较高;&br&Post可以传输大量数据,所以上传文件时只能用Post方式;&br&区别四:&br&get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;&br&post较get安全性较高;&/p&&p&&br&&/p&&p&1&code&#### **返回状态码**&/code&&/p&&p&200:请求被正常处理&br&204:请求被受理但没有资源可以返回&br&206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。&br&301:永久性重定向&br&302:临时重定向&br&303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上&br&304:发送附带条件的请求时,条件不满足时返回,与重定向无关&br&307:临时重定向,与302类似,只是强制要求使用POST方法&br&400:请求报文语法有误,服务器无法识别&br&401:请求需要认证&br&403:请求的对应资源禁止被访问&br&404:服务器无法找到对应资源&br&500:服务器内部错误&br&503:服务器正忙&/p&&p&&code&#### **http 协议头相关**&/code&&/p&&p&&code&http数据由请求行,首部字段,空行,报文主体四个部分组成&/code&&/p&&p&&code&首部字段分为:通用首部字段,请求首部字段,响应首部字段,实体首部字段&/code&&/p&&p&&br&&/p&&p&&code&#### **https与http的区别?如何实现加密传输?**&/code&&/p&&p&&code&- https就是在http与传输层之间加上了一个SSL&/code&&/p&&p&&code&- 对称加密与非对称加密&/code&&/p&&p&&br&&/p&&p&&code&#### **浏览器中输入一个URL发生什么,用到哪些协议?**&/code&&/p&&p&&code&浏览器中输入URL,首先浏览器要将URL解析为IP地址,解析域名就要用到DNS协议,首先主机会查询DNS的缓存,如果没有就给本地DNS发送查询请求。DNS查询分为两种方式,一种是递归查询,一种是迭代查询。如果是迭代查询,本地的DNS服务器,向根域名服务器发送查询请求,根域名服务器告知该域名的一级域名服务器,然后本地服务器给该一级域名服务器发送查询请求,然后依次类推直到查询到该域名的IP地址。DNS服务器是基于UDP的,因此会用到UDP协议。&/code&&/p&&p&&br&&/p&&p&&code&得到IP地址后,浏览器就要与服务器建立一个http连接。因此要用到http协议,http协议报文格式上面已经提到。http生成一个get请求报文,将该报文传给TCP层处理。如果采用https还会先对http数据进行加密。TCP层如果有需要先将HTTP数据包分片,分片依据路径MTU和MSS。TCP的数据包然后会发送给IP层,用到IP协议。IP层通过路由选路,一跳一跳发送到目的地址。当然在一个网段内的寻址是通过以太网协议实现(也可以是其他物理层协议,比如PPP,SLIP),以太网协议需要直到目的IP地址的物理地址,有需要ARP协议。&/code&&/p&&p&&br&&/p&&p&&code&#### **安全相关**&/code&&/p&&p&&code&- SQL注入&/code&&/p&&p&&code&- XSS&/code&&/p&&p&&code&- RCFS&/code&&/p&&p&&code&- APR欺骗&/code&&/p&&p&&br&&/p&&p&&code&## [数据库](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&- SQL语言(内外连接,子查询,分组,聚集,嵌套,逻辑)&/code&&/p&&p&&code&- MySQL索引方法?索引的优化?&/code&&/p&&p&&code&- InnoDB与MyISAM区别?&/code&&/p&&p&&code&- 事务的ACID&/code&&/p&&p&&code&- 事务的四个隔离级别&/code&&/p&&p&&code&- 查询优化(从索引上优化,从SQL语言上优化)&/code&&/p&&p&&code&- B-与B+树区别?&/code&&/p&&p&&code&- MySQL的联合索引(又称多列索引)是什么?生效的条件?&/code&&/p&&p&&code&- 分库分表&/code&&/p&&p&&br&&/p&&p&&code&#Linux&/code&&/p&&p&&code&### [**进程与线程**](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&(1) 进程与线程区别?&/code&&/p&&p&&code&(2) 线程比进程具有哪些优势?&/code&&/p&&p&&code&(3) 什么时候用多进程?什么时候用多线程?&/code&&/p&&p&&code&(4) LINUX中进程和线程使用的几个函数?&/code&&/p&&p&&code&(5) 线程同步?&/code&&/p&&p&&code&在Windows下线程同步的方式有:互斥量,信号量,事件,关键代码段&/code&&/p&&p&&code&在Linux下线程同步的方式有:互斥锁,自旋锁,读写锁,屏障(并发完成同一项任务时,屏障的作用特别好使)&/code&&/p&&p&&code&知道这些锁之间的区别,使用场景?&/code&&/p&&p&&br&&/p&&p&&code&### [**进程间通讯方式**](http://www.cnblogs.com/CheeseZH/p/5264465.html)&/code&&/p&&p&&br&&/p&&p&&code&& **管道( pipe )**:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。&/code&&/p&&p&&code&& &/code&&/p&&p&&code&**命名管道 (FIFO) **: 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。&/code&&/p&&p&&code&&&/code&&/p&&p&&code&& **信号量**:信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据,有XSI信号量和POSIX信号量,POSIX信号量更加完善。&/code&&/p&&p&&code&& &/code&&/p&&p&&code&**消息队列( message queue )** : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。&/code&&/p&&p&&code&&&/code&&/p&&p&&code&**共享内存( shared memory ) **:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。(原理一定要清楚,常考)&/code&&/p&&p&&code&&&/code&&/p&&p&&code&&**信号 ( sinal ) **: 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生,常见的信号。&/code&&/p&&p&&code&&&/code&&/p&&p&&code&**套接字( socket ) **: 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。&/code&&/p&&p&&br&&/p&&p&&code&- **匿名管道与命名管道的区别**:匿名管道只能在具有公共祖先的两个进程间使用。&/code&&/p&&p&&code&- **共享文件映射mmap**&/code&&/p&&p&&code&mmap建立进程空间到文件的映射,在建立的时候并不直接将文件拷贝到物理内存,同样采用缺页终端。mmap映射一个具体的文件可以实现任意进程间共享内存,映射一个匿名文件,可以实现父子进程间共享内存。&/code&&/p&&p&&br&&/p&&p&&code&- **常见的信号有哪些?**:SIGINT,SIGKILL(不能被捕获),SIGTERM(可以被捕获),SIGSEGV,SIGCHLD,SIGALRM&/code&&/p&&p&&br&&/p&&p&&code&### [**内存管理**](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&1. 虚拟内存的作用?&/code&&/p&&p&&code&2. 虚拟内存的实现?&/code&&/p&&p&&code&3. 操作系统层面对内存的管理?&/code&&/p&&p&&code&4. 内存池的作用?STL里[内存池如何实现](https://github.com/oscarwin/MemoryPool)?&/code&&/p&&p&&code&5. 进程空间和内核空间对内存的管理不同?&/code&&/p&&p&&code&6. Linux的slab层,VAM?&/code&&/p&&p&&code&7. 伙伴算法&/code&&/p&&p&&code&8. 高端内存&/code&&/p&&p&&br&&/p&&p&&code&### 进程调度&/code&&/p&&p&&code&1. Linux进程分为两种,实时进程和非实时进程;&/code&&/p&&p&&code&2. 优先级分为静态优先级和动态优先级,优先级的范围;&/code&&/p&&p&&code&3. 调度策略,FIFO,LRU,时间片轮转&/code&&/p&&p&&code&4. 交互进程通过平均睡眠时间而被奖励;&/code&&/p&&p&&br&&/p&&p&&code&### [**死锁**](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&code&(1) 死锁产生的条件;&/code&&/p&&p&&code&(2) 死锁的避免;&/code&&/p&&p&&br&&/p&&p&&code&### 命令行&/code&&/p&&p&&code&- Linux命令 在一个文件中,倒序打印第二行前100个大写字母&/code&&/p&&p&cat filename | head -n 2 | tail -n 1 | grep '[[:upper:]]' -o | tr -d '\n'| cut -c 1-100 | rev&/p&&p&&br&&/p&&p&&code&- 与CPU,内存,磁盘相关的命令(top,free, df, fdisk)&/code&&/p&&p&&br&&/p&&p&&code&- 网络相关的命令netstat,tcpdump等&/code&&/p&&p&&br&&/p&&p&&code&- sed, awk, grep三个超强大的命名,分别用与格式化修改,统计,和正则查找&/code&&/p&&p&&br&&/p&&p&&code&- ipcs和ipcrm命令&/code&&/p&&p&&br&&/p&&p&&code&- 查找当前目录以及字母下以.c结尾的文件,且文件中包含&hello world&的文件的路径&/code&&/p&&p&&br&&/p&&p&&code&- 创建定时任务&/code&&/p&&p&&br&&/p&&p&&code&### IO模型&/code&&/p&&p&&code&- **五种IO模型:**阻塞IO,非阻塞IO,IO复用,信号驱动式IO,异步IO&/code&&/p&&p&&br&&/p&&p&&code&- **select,poll,epoll的区别**&/code&&/p&&p&&br&&/p&&p&&code&**select:**是最初解决IO阻塞问题的方法。用结构体fd_set来告诉内核监听多个文件描述符,该结构体被称为描述符集。由数组来维持哪些描述符被置位了。对结构体的操作封装在三个宏定义中。通过轮寻来查找是否有描述符要被处理,如果没有返回**&/code&&/p&&p&&code&存在的问题:&/code&&/p&&p&&code&1. 内置数组的形式使得select的最大文件数受限与FD_SIZE;&/code&&/p&&p&&code&2. 每次调用select前都要重新初始化描述符集,将fd从用户态拷贝到内核态,每次调用select后,都需要将fd从内核态拷贝到用户态; &/code&&/p&&p&&code&3. 轮寻排查当文件描述符个数很多时,效率很低;&/code&&/p&&p&&br&&/p&&p&&code&**poll:**通过一个可变长度的数组解决了select文件描述符受限的问题。数组中元素是结构体,该结构体保存描述符的信息,每增加一个文件描述符就向数组中加入一个结构体,结构体只需要拷贝一次到内核态。poll解决了select重复初始化的问题。轮寻排查的问题未解决。**&/code&&/p&&p&&br&&/p&&p&&code&**epoll:**轮寻排查所有文件描述符的效率不高,使服务器并发能力受限。因此,epoll采用只返回状态发生变化的文件描述符,便解决了轮寻的瓶颈。&/code&&/p&&p&&code&- 为什么使用IO多路复用,最主要的原因是什么?&/code&&/p&&p&&code&- epoll有两种触发模式?这两种触发模式有什么区别?编程的时候有什么区别?&/code&&/p&&p&&code&- 上一题中编程的时候有什么区别,是在边缘触发的时候要把套接字中的数据读干净,那么当有多个套接字时,在读的套接字一直不停的有数据到达,如何保证其他套接字不被饿死(面试网易游戏的时候问的一个问题,答不上来,印象贼深刻)。&/code&&/p&&p&&br&&/p&&p&&code&1. [select/poll/epoll区别](https://segmentfault.com/a/3859)&/code&&/p&&p&&code&2. [几种网络服务器模型的介绍与比较](https://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/index.html?ca=drs-)&/code&&/p&&p&&code&3. [epoll为什么这么快](http://www.jianshu.com/p/b5bc204da984)(搞懂这篇文章,关于IO复用的问题就信手拈来了)&/code&&/p&&p&&br&&/p&&p&&code&### 线程池&/code&&/p&&p&&br&&/p&&p&&code&### Linux的API&/code&&/p&&p&&code&- **fork与vfork区别**&/code&&/p&&p&&code&fork和vfork都用于创建子进程。但是vfork创建子进程后,父进程阻塞,直到子进程调用exit()或者excle()。&/code&&/p&&p&&code&对于内核中过程fork通过调用clone函数,然后clone函数调用do_fork()。do_fork()中调用copy_process()函数先复制task_struct结构体,然后复制其他关于内存,文件,寄存器等信息。fork采用写时拷贝技术,因此子进程和父进程的页表指向相同的页框。但是vfork不需要拷贝页表,因为父进程会一直阻塞,直接使用父进程页表。&/code&&/p&&p&&br&&/p&&p&&code&- **exit()与_exit()区别**&/code&&/p&&p&&code&exit()清理后进入内核,_exit()直接陷入内核。&/code&&/p&&p&&br&&/p&&p&&code&- 孤儿进程与僵死进程&/code&&/p&&p&&code&1. 孤儿进程是怎么产生的?&/code&&/p&&p&&code&2. 僵死进程是怎么产生的?&/code&&/p&&p&&code&3. 僵死进程的危害?&/code&&/p&&p&&code&4. 如何避免僵死进程的产生?&/code&&/p&&p&&br&&/p&&p&&code&- **Linux是如何避免内存碎片的**&/code&&/p&&p&&code&1. 伙伴算法,用于管理物理内存,避免内存碎片;&/code&&/p&&p&&code&2. 高速缓存Slab层用于管理内核分配内存,避免碎片。&/code&&/p&&p&&br&&/p&&p&&code&- **共享内存的实现原理?**&/code&&/p&&p&&code&共享内存实现分为两种方式一种是采用mmap,另一种是采用XSI机制中的共享内存方法。mmap是内存文件映射,将一个文件映射到进程的地址空间,用户进程的地址空间的管理是通过vm_area_struct结构体进行管理的。mmap通过映射一个相同的文件到两个不同的进程,就能实现这两个进程的通信,采用该方法可以实现任意进程之间的通信。mmap也可以采用匿名映射,不指定映射的文件,但是只能在父子进程间通信。XSI的内存共享实际上也是通过映射文件实现,只是其映射的是一种特殊文件系统下的文件,该文件是不能通过read和write访问的。&/code&&/p&&p&&br&&/p&&p&&code&二者区别:&/code&&/p&&p&&code&& 1、 系统V共享内存中的数据,从来不写入到实际磁盘文件中去;而通过mmap()映射普通文件实现的共享内存通信可以指定何时将数据写入磁盘文件中。注:前面讲到,系统V共享内存机制实际是通过映射特殊文件系统shm中的文件实现的,文件系统shm的安装点在交换分区上,系统重新引导后,所有的内容都丢失。&/code&&/p&&p&&br&&/p&&p&&code&& 2、 系统V共享内存是随内核持续的,即使所有访问共享内存的进程都已经正常终止,共享内存区仍然存在(除非显式删除共享内存),在内核重新引导之前,对该共享内存区域的任何改写操作都将一直保留。&/code&&/p&&p&&br&&/p&&p&&code&& 3、 通过调用mmap()映射普通文件进行进程间通信时,一定要注意考虑进程何时终止对通信的影响。而通过系统V共享内存实现通信的进程则不然。注:这里没有给出shmctl的使用范例,原理与消息队列大同小异。&/code&&/p&&p&&br&&/p&&p&&code&- 系统调用与库函数(open, close, create, lseek, write, read)&/code&&/p&&p&&br&&/p&&p&&code&- 同步方法有哪些?&/code&&/p&&p&&code&1. 互斥锁,自旋锁,信号量,读写锁,屏障&/code&&/p&&p&&code&2. 互斥锁与自旋锁的区别:互斥锁得不到资源的时候阻塞,不占用cpu资源。自旋锁得不到资源的时候,不停的查询,而然占用cpu资源。&/code&&/p&&p&&code&3. [死锁](http://blog.csdn.net/shanghairuoxiao/article/details/)&/code&&/p&&p&&br&&/p&&p&&code&### 其他&/code&&/p&&p&&br&&/p&&p&&code&- ++i是否是原子操作&/code&&/p&&p&&code&明显不是,++i主要有三个步骤,把数据从内存放在寄存器上,在寄存器上进行自增,把数据从寄存器拷贝会内存,每个步骤都可能被中断。&/code&&/p&&p&&br&&/p&&p&&code&- 判断大小端&/code&&/p&&p&union un&br&{&br&&br&&br&};&/p&&p&void fun()&br&{&br&&br&
test.i = 1;&br&
if(ch == 1)&br&
cout && &小端& &&&br&
cout && &大端& &&&br&}&br&```&/p&&h2&设计模式&/h2&&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.jellythink.com/archives/82& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&单例模式线程安全的写法&/a& &/li&&li&STL里的迭代器使用了迭代器模式 &/li&&li&MVC的理解 &/li&&/ul&&h2&分布式系统&/h2&&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//blog.jobbole.com/80619/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&map_reduce原理&/a&
(这篇文章讲的很通俗易懂) &/li&&li&负载均衡 &/li&&li&CDN&/li&&/ul&&p&&br&&/p&&p&&b&联系作者:&/b&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/59394%3Ftype%3D0%26order%3D0%26pos%3D81%26page%3D1& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&nowcoder.com/discuss/59&/span&&span class=&invisible&&394?type=0&order=0&pos=81&page=1&/span&&span class=&ellipsis&&&/span&&/a&&/p&
作者:oscarwin链接:来源:牛客网 从牛客获得太多的资源,来一发面经,纯技术干货。面试的技巧,心态,简历也都很重要,不过牛客有很多大佬总结的太好了,就不重复了。主要是C++后台开发,基本总结了我自己面试常问到的,看别人的面经…
&figure&&img src=&https://pic4.zhimg.com/v2-30bcef511f_b.jpg& data-rawwidth=&600& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-30bcef511f_r.jpg&&&/figure&&p&厨房是日常生活中使用频率较高的空间,厨房设计的是否合理,关系到日后使用的舒适性和便捷性,也许一个小的细节设计,就能发挥大能量,让厨房烹饪告别无序、无趣和疲劳。接下来就为大家分享几点实用性的厨房细节设计。&br&&/p&&p&1、开放式厨房固然美观,但油烟、收纳及整洁性等问题是不得不面对的,不妨考虑安装玻璃推拉门,不但空间更通透,而且推拉门相对于平开门而言还可以减少开关门占用的空间。&figure&&img src=&https://pic1.zhimg.com/v2-6a025f55bb98c8eebbc77060_b.png& data-rawwidth=&600& data-rawheight=&399& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-6a025f55bb98c8eebbc77060_r.jpg&&&/figure&&/p&&p&2、夏天厨房太热,是不是动过在厨房安空调的念头?但是混合油烟的空调过滤网多难洗你体验过么?如果条件允许,可以在吊顶安装凉霸。&figure&&img src=&https://pic1.zhimg.com/v2-63dbdfce2fd83ecb3edc_b.png& data-rawwidth=&600& data-rawheight=&380& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-63dbdfce2fd83ecb3edc_r.jpg&&&/figure&&/p&&p&3、厨房橱柜应预留空间,方便安装小厨宝,小厨宝水热得快无需等待即可使用热水,不会造成用水浪费,尤其是在冬天特别实用,比等热水器的热水要方便的多。&figure&&img src=&https://pic1.zhimg.com/v2-1cec83a6bd396bf527c3c_b.png& data-rawwidth=&600& data-rawheight=&385& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-1cec83a6bd396bf527c3c_r.jpg&&&/figure&&/p&&p&4、吸油烟机的烟道如果条件允许可以打出去,如果用公用烟道,油烟机的排烟管与公用烟道接口处一定要密封好,免得楼里只要有人烧菜,自家就满屋子的油烟味。 &/p&&p&5、厨房吊柜下面可以考虑安装操作灯,一般情况下厨房照明在吊顶中间,晚上洗菜切菜的时候,灯光从背后照过来容易形成操作台面上的阴影区,有了这个操作灯就方便多了。&figure&&img src=&https://pic3.zhimg.com/v2-46b2e0c5bc77b84f4ff6_b.png& data-rawwidth=&600& data-rawheight=&423& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-46b2e0c5bc77b84f4ff6_r.jpg&&&/figure&&/p&&p&6、洗碗机比消毒柜有用,用了洗碗机就和有洗衣机你不想再手洗一样,而且你手洗半天,和洗碗机洗的干净程度不在一个水平上。&/p&&p&7、厨房适当安装几个带开关插座,避免手湿手拔开关造成意外事故,有住百变加硬装套餐内也有很多类似的人性化设计。&figure&&img src=&https://pic4.zhimg.com/v2-09c6dd865b3f07791efee6a_b.jpg& data-rawwidth=&600& data-rawheight=&372& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-09c6dd865b3f07791efee6a_r.jpg&&&/figure&&/p&&p&8、根据厨房餐动线合理布局操作空间,洗涤、加工、烹饪一体式分布,方便各工序连续操作,减少了不必要的来回走动造成的体力消耗。&/p&&p&9、厨房除了地柜外一定要做吊柜,增加收纳空间,另外抽屉、拉篮也必不可少,使刀叉调料、锅碗瓢盆的收纳整齐有序,扩大空间使用效率。&figure&&img src=&https://pic1.zhimg.com/v2-beb3f1aff80933c_b.png& data-rawwidth=&600& data-rawheight=&399& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-beb3f1aff80933c_r.jpg&&&/figure&&/p&&p&10、橱柜最好要有可调节隔层板,让橱柜可根据物品大小自由调节,避免大件物品无法储纳的问题。&/p&&p&11、柜门最好选用阻尼铰链,减少开关门噪音,抽屉也宜选用阻尼静音抽屉,开关时安静、轻柔、平稳,避免出现噪音及关闭反弹现象。有住使用的奥地利Blum阻尼静音抽屉便是不错的选择。&figure&&img src=&https://pic4.zhimg.com/v2-5a8978ad0daa087bdc271eb_b.png& data-rawwidth=&600& data-rawheight=&365& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-5a8978ad0daa087bdc271eb_r.jpg&&&/figure&&/p&&p&12、橱柜要选用快装铰链,传统的普通铰链在装卸门板时需要将铰链底座拆下,费时费力,而快装铰链则只需要按两下相关按键就可以轻松卸下柜门,方便检修。&/p&&p&13、厨房菜盆双盆要比单盆更实用,可以分理生熟洗菜区,做到泡菜洗菜、洗鱼剪虾两不误,饮食更加安全卫生。&figure&&img src=&https://pic2.zhimg.com/v2-29fc5df1f6e7_b.png& data-rawwidth=&600& data-rawheight=&377& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic2.zhimg.com/v2-29fc5df1f6e7_r.jpg&&&/figure&&/p&&p&14、洗菜盆要安装台下盆,台下盆的设计使用时不会破坏台面的平整度,清洁起来更方便,易清理,没有卫生死角,视觉效果上也更美观。&/p&&p&15、橱柜最好配防尘角,防止灰尘落入死角,解决死角灰尘无法清除的难题。&figure&&img src=&https://pic1.zhimg.com/v2-bfbbddd8ce0_b.png& data-rawwidth=&600& data-rawheight=&378& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-bfbbddd8ce0_r.jpg&&&/figure&&/p&&p&16、厨房台面最好使用石英石台面,硬度高、防渗透、耐刮、耐磨并且环保无辐射,可与食物直接接触。而人造石台面不耐高低温,硬度低,使用一段时间后,表面会有划痕;大理石台面不易做造型,有一定的辐射,还容易吸油渗色,不易清洗。&/p&
厨房是日常生活中使用频率较高的空间,厨房设计的是否合理,关系到日后使用的舒适性和便捷性,也许一个小的细节设计,就能发挥大能量,让厨房烹饪告别无序、无趣和疲劳。接下来就为大家分享几点实用性的厨房细节设计。 1、开放式厨房固然美观,但油烟、收纳…
&p&&b&距离2017年春,已经一年过去了,而我靠着这点技能,也成功的从土木转行,拒掉了研究生面试,拒掉了好多个offer,选择了其中一个不错的工作。然而学习是无止境的,土木!再见!再尼玛的见!
24&/b&&/p&&p&&b&~~~~~~~~~~~~~~~~~&/b&&/p&&p&&b&以下原答案&/b&&/p&&p&&b&PS:没想到有人恶意对我的网页后台传数据,也是醉了,你到底有多无聊,我已经把后台上传成绩功能关了,其实我可以换个方式登录成绩来防止恶意登记成绩,不过我主要是让大家体验一下这矿工怎么样什么样,懒得改了,所以干脆就取消了这个功能&/b&&/p&&p&大兄弟和我很像,(知乎高手如云,我得提前说我只是一个小游戏爱好者,只是觉得我的经历可以给题主点帮助,也希望给大家一些初学者想自己制作游戏给朋友分享并获得快乐的人一点帮助)其实我一开始学语言也是想写游戏,觉得4399上的游戏很酷,但是一开始学控制台c++我是直接懵比了的,这是什么鬼!!!!这和我想学的编程完全不一样好吗!!!!!(后来才知道C++是一门深奥强大的语言,一步登天写华丽游戏,就是图形化界面真的是太难了)但是大神们都说开发游戏c++性能好,而且用的人比较多,大型游戏如lol都是c++,可是无奈于厚厚的书和教程让我望而却步,毕竟实在想体验一下自己快速开发游戏的感觉,网上那么长的教程最后写的竟然是些文字推理游戏。&/p&&p&&b&只到有一天,我遇到了HTML5,canvas标签让我看到了希望,于是等同于零基础的我开始了我的写小游戏之旅!!(在这里我推荐题主用html是有原因的,虽然题主问的是用c++但是我看的出来题主说想做出4399的那样的游戏,我觉得对于一个需要做出成果的人用html写是很有帮助的,用记事本就可以写,有浏览器就可以运行,包括手机!!当然这一点还有个很重要很重要的好处,就是便于分享,后面会说)&/b&&/p&&p&&b&一开始的我&/b&,从网上找到了一个贪吃蛇,我猜很多人一开始都是从贪吃蛇搞起,它大概长这个样子,&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-941eacc98d597f3d1116e4ded059f0de_b.jpg& data-rawwidth=&400& data-rawheight=&403& class=&content_image& width=&400&&&/figure&&p&像素游戏low爆了好吗&b&!!!但是他的源代码逻辑对初学者很有好处&/b&,而且对于一个初学者的我来说,这简直是&b&狂拽酷炫吊炸天&/b&!!儿时游戏机的游戏竟然自己开始着手研究怎么实现了,于是我硬着头皮开始学习如何看得懂源代码,经过了一个下午的奋战终于把每个语句都看的差不多了。自己对每一句都坐了标注。后来开始尝试着写自己的游戏,我问了朋友,他们想玩黄金矿工还是植物大战僵尸,他们随口一说说黄金矿工吧。于是我登录了4399,玩了几把,搞清楚了大概的逻辑,于是开始对他们的颜色采样,记录到自己的代码里,代码的逻辑,类什么的都走了很多路,问了好多人,好多帖子,读了html5底下canvas的每一个规范写法,终于在3天写了出来,自己当然是很高兴的,嘿嘿。界面大概是这样,知乎大神别吐槽丑了,我也很无奈啊。。。。。。链接(网址备案太麻烦,虽然没有域名不方便,但是无奈,只是用于发给朋友交流一下)
&b&无论你啥设备,基本上都可以玩,很小的游戏。&/b&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//182.254.220.103%3A8888/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&182.254.220.103:8888/&/span&&span class=&invisible&&&/span&&/a& 请勿在知乎手机客户端点开,无法兼容。。。。&/p&&p&老实说我对于我一个普通学生来说我是很自豪的,我对每一个石头和金子的位置都精心的调了,我甚至加了背景音乐,我没有直接参考任何别人的写好的游戏代码,都是一个个自己的为了实现的小创意,其实我知道,4399的源码肯定比我的简洁很多很多,期间参考了很多教程,而canvas规范都是在一个好像是火狐社区的里面找的,然后逻辑部分也是自己想的,我还很逗比的用暴漫表情,当勾到石头的时候甚至还会变更表情,哈哈哈。&b&欢迎大家去试玩&/b&&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-4ecca93ae2_b.jpg& data-rawwidth=&948& data-rawheight=&502& class=&origin_image zh-lightbox-thumb& width=&948& data-original=&https://pic1.zhimg.com/50/v2-4ecca93ae2_r.jpg&&&/figure&&p&在此期间遇到了一个很大很大的困难,我为了让我的qq高中同学的好友能直接在qq自带的手机浏览器上玩,就是在群里点一下别人说的网址那种玩,我自己测试了很多遍,有很大的延迟,&b&这tm什么鬼啊!!我是不是手机坏了?手机不该这么卡啊,这也不是网游,这到底是怎么了,后来我在万能的知乎上找到了答案,原来是移动端的浏览器自动设置了延迟,为了解决判断用户是否双击了页面,浏览器加了延迟,加了一个fastclick包就可以啦,哈哈(这个过程花了我俩小时。。。)。&/b&&/p&&p&这时候学html最重要的一点就出来了,可以及时的分享给别人,我先打个比方,一个初学者废了好大的劲写了一个游戏,假如是c++,exe,除了您要好的朋友,你用u盘或者qq单独发,谁会去玩玩,更不会有人给你评论的,更不用说你用python,人家怎么装运行环境啊。。。。。&b&但是,你用了html,js写了后,在qq群,说说,朋友圈发了个网址,人家立马就可以用手机点进去玩,然后给你反馈,好不好玩,哪里需要改进,这对一个初学者很重要的,改了代码ftp一传,人家点了网址就可以玩!不受时间空间限制!有手机就可以玩!流量也要不了几十k。&/b&&/p&&p&后来最让我不能忍的是,这个游戏就是个&b&单机游戏!!!你可能会想&/b&,难不成答主你要做网游,其实不是。。哈哈哈,我想做个小的排行榜,差不多是成绩统计系统,我要是能自动记录每个人玩了多少分,然后在qq群里贴出来,那不是更好,大家也更会有玩的积极性,就像网友那样大家互相比看谁的分数高。一个小小的排行榜我去百度发现可不是一般的难,好像还涉及到一门后端语言,于是我又开始了看了一些php,(毕竟中国的论坛教程php教程最多 )php本身还行不算太难,但是其中连接数据库又是一大难点,在这里感谢腾讯云,学生一元购买一个月的服务器,还可以一键安装环境。感谢百度里面各种的大神,于是我有拥有了一个可以计算大家勾矿成绩的后台啦!!(三个月后我发现了websocket这个东西,这可是可以真正的做网游的,发现用了这个技术的网页网游延迟不算太高,等日后有时间再细细研究)&/p&&p&我在做这个游戏的过程中学到了很多我自认为重要的东西和编程思想,面向对象,对象继承,操作dom,函数闭包,碰撞检测如何实现,动画竟然是用快速的重绘实现,各种障眼法!!我认为这个过程对我的帮助很大,欢迎大家交流,想和有同样的爱好的人一起开发小游戏!!&/p&&p&你以为这就完了,菜鸟之路终结了?&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-af9c80dd7f17b482aeddb54ff7da8bda_b.jpg& data-rawwidth=&700& data-rawheight=&668& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic4.zhimg.com/50/v2-af9c80dd7f17b482aeddb54ff7da8bda_r.jpg&&&/figure&&p&然而,不!!!我还想学3d!!!&b&3D啊,你问我我是不是疯了,你个菜鸡才学了几天小游戏你想做3D?在这里感谢github的three.js组,其实我看到网上各种webgl的效果我是震惊的,这是什么东西,浏览器玩3D,怎么可能?
多一句话,知乎的&/b&大神肯定都觉得是小儿科,而对于我们这些玩4399的小学生来说,这简直就是鬼斧神工,天工开物,无与伦比!!好不妙哉啊,就拿那个鱼缸来说&a href=&//link.zhihu.com/?target=http%3A//webglsamples.org/aquarium/aquarium.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WebGL Aquarium,&/a&
(&b&注意,webgl手机端支持的还不够好,手机看知乎的别点了,电脑端请用firefox或者chrome浏览器,网页较大哦&/b&)&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-8b43aaad0b171ff_b.jpg& data-rawwidth=&1243& data-rawheight=&619& class=&origin_image zh-lightbox-thumb& width=&1243& data-original=&https://pic3.zhimg.com/50/v2-8b43aaad0b171ff_r.jpg&&&/figure&&p&没多少人看啊,等看得人多了再讲讲我three.js的旅途,暂时就只写这么多&/p&
距离2017年春,已经一年过去了,而我靠着这点技能,也成功的从土木转行,拒掉了研究生面试,拒掉了好多个offer,选择了其中一个不错的工作。然而学习是无止境的,土木!再见!再尼玛的见! ~~~~~~~~~~~~~~~~~以下原答案PS:没想到有人恶意对我的…
个人见解。&br&&br&抛开算法的话。&br&&br&OOP三大项,封装继承多态。v func是怎么实现的,一般考到v table还能挺住的人不多。以前面pure storage被给了多重继承虚函数指针问在内存里是什么样的。这么用心艹的不多见,但v func有太多可以问的&br&&br&把所有const static的各种情况都看一遍。虽然有点可笑,但还是有很多人分不清const pointer和pointer to const以及两者合体的区别的。static放在不同的地方不是一回事。&br&&br&内存泄漏肯定是会被问的。rule of three是基础。exception safe是难点。解决方法其实都很简单,在工业界,smart pointer就完,没那么多花样。工业界基本见不到裸指针。别小看exception safe,很耗时间学的。&br&&br&然后就是stl,大多数自诩懂的C++的人,包括曾经的我,基本都讲不明白allocator是怎么回事。&br&&br&RAII,至少要听过。&br&&br&其他的想考你的太多了,但我觉得仅仅是应用C++的话,这些应该差不多重点了。&br&&br&OS作为考OS来说,那多深都有可能。如果问C++的话,取决于公司。大公司进去就是螺丝钉,框架都是好的,用而已。&br&&br&小公司会怎么考,无法预测。但os还是要好好看的,熟悉了你可以秒杀一切所谓系统设计的题,真的。现在大多数玩意其实都是六七十年代那帮大牛玩剩下的。&br&&br&OS学校出来的人基本会集中在两个知识点上,进程管理和文件系统。前者对非infra的开发类很重要,infra类两者都重要。基本知道进程是什么玩意,什么是context switch,现实中你干什么会触发它且cost是什么。virtual mem和physiccal mem分别是什么。理论上就好,这东西面试时面试官也只能用嘴问。当然你要是写过nachos或者mit那个累UnixV6这都是小case。&br&&br&分布式我不觉得本科会涉及,但说真的不难,当年我凭着GPU并行计算的一点功底和OS的知识也从来没倒在过这类问题上。总归talk is cheap嘛~&br&&br&后端的话,好好看看SOA和REST,你做后端逃不出这俩。以及js 的single page application的原理(很多应用需要这个理念去减小延迟),以及C++如何实现async。你对node和engine x多少要有点基础了解。&br&&br&看看MVC,所谓后端,就是M,前段无非是个C。&br&&br&Design Pattern初学者说能看懂比较难,大致扫扫知道点名词。&br&&br&弄明白进程,stack和heap。我给你个简单的程序,你能在内存里给我画出来从头到尾的经过。&br&&br&concurrent programming一般不会考到。也最需要实际经验成长。简单的例子最好能写出来。race condition有些很复杂的你看不出来但简单的要能说明白。&br&&br&明白cpu cache是怎么运作的。为什么很多数据结构或算法明明很好却很慢。Locality。&br&&br&如果你很好的明白concurrent,那instruction pipeline要是能讲明白就更好了。&br&&br&敏捷式开发你要明白是怎么回事。code review,测试流程多少要有个概念。&br&&br&template平时没用过太野性的方法,都是中规中矩。metaprogramming多少要明白好处在哪。这东西玩好了好厉害,美国在火星上那小车里面几乎都是metaprogramming。&br&&br&忘了讲了,static linking,dynamic linking,优缺点。&br&&br&你是老牌公司后段很可能会遇到sun

我要回帖

更多关于 华为交换机arp攻击 的文章

 

随机推荐