已拿腾讯offer分享面试经历(含解析答案、推荐书籍、资料分享)

独家:深圳腾讯总部大厦

秋招运气比较好,拿到百度、阿里、腾讯、华为、360、美团、小米的(准)offer,不过都是意向书。。。。非正式。攒波人品,等国庆后的结果吧。

本人本科211,硕士末流985。实力很渣,实验室项目也不行。全靠研二的时候,研三的师兄带路(他们工作确实找的好),他们分享他们的招聘经验、学习资料和方法等,还有就是研二的同实验室的同学的帮助也至关重要,所以研二这一年时间还算没有浪费,基本都花在学习、项目。算是给我们一个很大的指导作用,在这里真的很感谢他们。

我个人的简历、笔试、面试情况:(时间顺序 7-9月,我全是提前批,除了腾讯、美团)

1、多益网络(一面) offer (确实出乎意料,有点略水,就一面。。。)

2、oppo (一面、二面) hr面挂(估计跟着前面的人吼价格 吼高了, 跪了。。所以谈薪还是要慎重)

3、阿里巴巴(钉钉团队) (终面、附加编程面、交叉面、hr面) offer (之前拿到实习offer,人太怂没去。这里给后面投阿里的同学一个建议,一定要投实习,因为阿里秋招很喜欢从实习批的人录取,走绿色通道)

北京:阿里巴巴(北京总部)

4、百度(企业云团队) (一面、二面、三面、性格测试、hr面) offer (这个挺看运气,面试官人不错)

5、网易(云音乐) 笔试挂 (投网易的云音乐要慎重,头的人太多,不够出彩就别去尝试,浪费机会,个人看法)

6、网易互娱 笔试挂 (虽然三道全部AC了,但是估计全AC的也比较多,双非等限制,后面就没有面试的邀请了。。)

7、奇虎360(安全卫士后台团队) (一面、二面、hr面) (面试官人挺好的,我觉得我挺多的都不会,但是还让我过了。。。可能c++那一块答得不错,这个确实看运气)

8、华为(cloudbu团队,优招批)(业务面、技术加面、总裁面)(华为玄学面试,全看运气)

9、拼多多(基础平台,提前批挂) 校招批笔试通过,至今没面试,算挂了吧

10、小米(java的一个电商后台,做订单系统的) (一面、二面)(笔试没做,还是发意向了。。小米和头条差不多,强调手撕代码,我撕了4道,有道算法不会做的,面试官把算法和数据结构都给我说了,,,还好我写出来了。。这个面试官真的不错,我就喜欢这样的)

11、头条(笔试4.3AC) 一面挂 (一轮游,还是太菜,手撕了一个比较一般的题,写了25分钟,虽然跑过了所有测试用例,面试官还是把我挂了。。其他基础都没问题,所以。头条还是重code。如果想进头条,刷leetcode、剑指offer吧,这个是面试官给我的唯一的建议)

12、美团(餐饮链 java团队 一面、二面、三面、hr面,这个是校招批) 口头offer (一面code差点没写出来,估计没写出来就凉了。。。运气。美团主要是看个人思维、技术等,不限语言,所以是c++的伙伴也可以考虑美团)

13、腾讯(sng数据中心团队 一面、二面、hr面今天走完了 这是校招批) 等结果(hr给我说 每轮评价都很好,应该没问题) (之前腾讯提前批挂了,算上实习面试,我腾讯的面试记录都有4、5个了,大部分差评价,所以根据我的情况,有的小伙伴不用担心面试评价的问题,还是要简历要做好)

后面就没有面其他公司了。希望我今天的分享能给腾讯攒波人品,我最想进的就是tencent。。。。腾讯情结 -.-现已经在实习了。

下面是我个人的一些建议和面经吧,分为几个板块:(可能也不适用于一些人,当看着玩吧)

1、书籍推荐

2、学习氛围

3、简历修改

4、面试技巧

5、面经分享

---------------------------------------------------------------------------------------------------------------------------------------------------------------

书籍推荐

c++ : 《effictive C++》、《SGI STL源码解析》(侯捷)、《effictive STL》、《深入探索C++对象模型》、《c++ primer》等

网络:《计算机网络》、《图解tcp/ip》 、《tcp/ip详解》、《UNIX 网络编程》(想进腾讯的小伙伴最好看看这个)

***作系统:《深入理解计算机系统》、《***作系统-精髓与设计原理》、《UNIX 高级环境编程》

数据库:《高性能MySQL》、《Redis实战》(我没读)、《数据库原理及设计》

数据结构和算法:《剑指offer》、《数据结构及算法实现》(名字我可能记不太清)、leetcode(我就只刷了100道,算是我们实验室刷的最少的了)

实战:《Linux多线程服务器编程-使用muduo C++网络库》(陈硕) (这本书强烈推荐,从实战的角度分析处理问题,我们实验室都看了这本书的)

其他。。。。

学习氛围

主要说说我的情况吧,导师这边要做项目,我的项目比较少,所以有更多时间看书,看视频;其他同学有项目,但是他们也抽空闲时间看书,看视频。基本晚上9点半才从实验室回寝室吧。这里还是强调不要单兵作战,我们这届实验室的同学跟上届师兄一样,抱的比较紧,有什么问题可以互相问,解决的过程中就可以相互提高了,每本书和视频的学习,每个人的理解程度都不一样,理解的角度也不一样,我们一般都会进行交流,使得学到的知识更加全面吧,学习效率也比较高。在招聘这一块,我们一般有什么招聘信息出来了都相互传播一哈,大家能够第一时间了解到招聘信息,笔试面试都有同学一起去,没那么孤单。

简历修改

我个人的观点吧,看看就行。我觉得简历主要还是一页就好,简单明了,最好是第一时间就能让面试官知道你会什么。整个页面干净、有条理就行,不用彩色的条纹那些(尽量别在外观上浪费太多时间)。除了一般要写的个人基本信息、荣誉、学历、项目以外,做技术的同学,建议就是再弄一个 技术栈的模块出来,比如c++会哪些、网络会哪些、数据库会哪些。这样简单明了,我腾讯和美团现场面的,我看到的就是面试官其实就是一条一条的对着我的技术栈一个一个问的。此外在字眼的使用上,好好注意把握 “了解”、“熟悉”、“精通”,一般建议写“熟悉”,不太稳的写“了解”,高手都不建议写精通,一旦有一个不会,面试官的印象大打折扣,觉得不够谦虚。照片的话可贴可不贴。我就没贴,主要人太丑。。。很尴尬。

面试技巧

说实话,我个人的技术实力真的很一般,在实验室我都算排在后面的,实验室大佬太多,在技术上我就跟着学,偷学一波技能。我觉得我的优势在于面试技巧上,在面试的时候,我觉得要善于引导面试官,俗称“带节奏”,其实就是与人相处交流的一些方式方法了。

首先是自我介绍,我觉得自我介绍个人信息不用太详细,就说个名字 学校 专业 即可。其他信息面试官也看的到,没必要说。如果是计算机专业的 好学校的 建议说出来,突出一下,给面试官一个好印象。 然后下面应该直接简单明了的告诉面试官 个人的技术栈,给面试指方向。不然面试官真的有可能瞎问,问到会的还好,不会的就容易凉凉。在下面可以说你的项目,大概提一下即可。

技术栈介绍:首先主动引导面试官问那方面的问题,在回答问题的时候,故意带一点其他的你会的知识点,可能有的面试官就会心血来潮问你那个引子。比如我给面试官介绍我的项目框架的时候,提到了epoll,他就问我epoll 和select区别、lt et区别,这些都是准备好的,自然你也就会答得出来。这算是套路面试官吧。如果遇到面试官问道的问题不会答,也不要慌,可以用这样的语句:“不好意思,这个我没太了解,不过我知道与这个相近的xxx,你看我给你分享这个xxx的个人体会可以吗”,有的面试官就会同意的,这样不容易题目被带偏。 还有就是如果就是真的不知道的,就直接说不知道,这个没什么的。比如 面试官问我 你数据库怎么样? 我一般都说,不太会。 一般面试官就不会问了。如果你掌握的不好,你说还可以,那他问你结果都不会,就是一直吃 暴击伤害。。。面试官印象很差,还不如直接说不会。

项目:主要要分析清楚,条理清晰,面试官并不关心你的项目如何如何渣 如何如何叼,在于的是你对项目的思考和理解吧。

面经分享(内容不全,后面也没时间写面经了。格式不太好弄,笔记上copy过来的,将就看吧-。-)

可能也有些有错的地方。

多益网络

1、项目部分(似乎对muduo更感兴趣)

介绍了项目功能、架构

muduo有哪些精彩的地方,说一下。 吹了一下异步日志的双buf的实现、buf本身的readv 的性能

2、基础知识

1、linux IO模型(5种) 记不太清,说了几种,应该没说完。(应该是:同步阻塞、同步非阻塞、多路复用、信号驱动、异步IO)应该还要说细节

2、静态链接库和动态链接库的区别

3、什么是线程不安全

4、c++ 继承和组合 ,为何优先使用组合(这个我不知道理由)ps:应该是组合能实现和继承一样的功能,但是对于父类对象,在组合中是不会暴露细节的,相当于是黑盒,而继承是“白盒”。

5、什么时候使用链表或者队列?(增加、删除频率较高的场景)

6、c++ const的作用? (变量和函数两方面 mutable)

7、百度地图如何实现实时路况

8、快排算法 稳定性

9、函数指针的使用场景、好处。使用于回调函数 虚表指针就是例子

10、你会用什么结构来查询?(hash表、map、 set这些)

11、tcp udp的区别 使用场景

12、什么是缓冲区溢出

3、编程

数组循环右移 将一个长度为n的数组A的元素循环右移k位

比如 数组 1, 2, 3, 4, 5 循环右移3位之后变成 3, 4, 5, 1, 2

4、其他

1、如何看待加班?

2、你的爱好是什么?玩什么游戏?

3、你最近在看什么书?

4、你还有什么要问我的吗?

腾讯OMG团队(实习)

1、画出tcp头部的协议格式。

扩展: udp头部、ip头部、http头部

2、Http的报文头部

3、数组和指针的区别

(1)数组本身体现出来的就是一个 指针常量的 “特性”,即不能对数组的首地址进行修改,内存上的地址就已经是确定了的。而指针本身是一个变量,他指向了一个地址,这个是可以变化的,也就说他可以重新赋值指向新的地址;

(2)当调用sizeof函数时,对于数组,得到的是数组元素个数*数据类型的大小,而对于指针,得到的是指针类型的大小,这个取决于机器的位数,比如32位机,对应的指针就是4字节的大小;

(3)指针相比数组更加灵活。

相同之处:比如当作为形参的时候,定义成 指针还是数组都是一样的,因为这个时候传入的都是数组的首地址,也就是这个数组名,反映出来的就等于是一个指针。

4、参数传递的方式

值传递、引用传递、指针传

5、c++种struct和class的区别

(1)如果不申明访问权限,class的默认权限是private,而struct是public

(2)对于继承,如果也没有明确是public继承还是private继承或者是protected继承,class

默认是private的继承,而struct是public继承。

(3)从抽象上来说,class更像是对象的实现体,而struct更像是数据结构的实现体。

6、构造函数能不能是虚函数?

不能,因为类对象中占前4个字节的虚表指针 需要在构造函数完成之后才会生成,通过 虚表指针才能找到虚函数表,访问调用对应的虚函数。如果构造函数是虚函数,那么就只能通过虚表指针才能访问到,关键是此时就需要让构造函数产生出虚表指针。陷入了先有蛋还是现有鸡的问题

7、析构函数可不可以是虚函数?

可以,而且如果说这个类不是final的,也就是说他是某一个类的父类,那么该类的析构函数必须是虚函数,因为如果不是虚函数,那么其子类对象的父类组成部分将无法得到释放,造成资源泄露。

8、析构函数可不可以是纯虚函数?

我觉得不建议是,因为我们知道纯虚函数是没有实现体的,那么子类对象在析构的时候,父类组成部分就没办法释放,显然不行。但是对于大部分编译器来说,可以将析构函数申明为纯虚函数,然后在类外写纯虚函数的实现体,从语法上不会报错。

9、举例一种STL中的容器

答:比如vector(当时答得是这个),vector的的实现其实就是封装了一个动态数组,里面有3个内部迭代器,分别是start、finnish、end_of_storage。如果通过push_back或者insert插入元素造成超过容量,此时容量会扩展至2倍,这个过程分为:重新配置、移动拷贝元素、释放原空间,这3个大部,支持随机访问等

10、举例STL的一种算法

答:比如find、accumulate、next_permutation、unique、position等等

11、如何防止c++头文件被重复引用

答:可以使用ifndef或者program once,都可以。但是两者有一些区别。从兼容性上说,ifndfe更好,有些老的编译器可能不支持program once;此外,对于2个名字不同的头文件,但内容相同,ifndef还是可以鉴别出来,防止重复,program once 不行。

12、内联函数和宏的区别

答:内联函数的展开发生在编译期,而宏是在预处理阶段;内联函数本身是函数,而宏不是;最重要的一点:内联函数会对参数进行类型检查,而宏只是简单的替换,所以内联函数更加安全,所以往往宏需要对参数加括号,但是也不一定安全, 内联函数有自己明确的作用域或者访问权限,比如放在类里面的private,而宏是没有的。

13、linux下常用命令

答:(1)ls -al 显示当前目录下的所有文件目录信息,包括隐藏的

(2)mkdir 创建文件夹

(3)cat 查看文件内容

(4)cp 拷贝

(5)rm -rf 删除文件(夹)下所有文件

(6)find 查找文件

(7)grep 正则匹配

(8)pwd 显示当前文件路径

(9)ln 创建文件连接 -s 软连接

(10)chmod 修改文件权限

(11)netstat -a |grep 查看网络状态

(12)top

14、linux下进程管理的相关命令

(1)ps -e 查看所有的进程信息

(2)kill -9 pid 强行杀死进程

(3)top -p pid 查看进程信息

15、linux下如何查看内存、磁盘情况

(1)top

(2)df

(3)free

16、什么叫软连接和硬链接,他们的区别是什么

硬链接是以文件副本引用的形式存在的,他跟源文件拥有同一个inode节点;软连接是以路径的形式存在的,他的inode节点所对应的数据块存储的是源文件的路径。他们的区别的是:软连接可以跨文件系统创建,而且可以对目录进行创建,硬链接都不行,所以,相对来说,软连接更加灵活,删除软连接不会产生任何影响,但是如果源文件被删除了,那么所有的软连接就失效了,所以很像windows下的快捷方式。

17、什么叫相对路径什么叫绝对路径?

答:以/开头的就是绝对路径,因为他代表了从根目录出发的路径,反之就是相对路径

18、进程间通信的方式?

答:无名管道、有名管道FIFO,消息队列、共享内存、信号量、socket等,(应该进行简略阐述

19、c++下如何调用C的包?

答:extern “C”,通知编译器其所包含的代码用c的方式进行编译,这样连接的时候不会报错,否则会找不到函数符号。

20、找出去重后的数字的命令

$ sort test.txt | uniq

21、socket编程tcp客户端连接过程

建立套接字对象,connect、read/wirte

22\socket编程tcp服务器端连接过程

建立套接字对象、bind、listen、 accept、read/wirte

23、epoll和select的区别?

答:select能支持的文件描述符数是有限的,最大1024个,并且每次调用前都需要将其监听的读集、写集、错误集从用户态向内核态拷贝,返回后又拷贝回去,而且,select返回的时候是将所有的文件描述符返回,也就意味着一旦有个事件触发,只能通过遍历的方式才能找到具体是哪一个事件,效率比较低、开销也比较大,但是也有好处,就是他的超时的单位是微秒级别;

epoll能支持的文件描述符数很大,可以上万,他的高效由3个部分组成:红黑树、双向链表、回调函数,每次将监听事件拷贝到内核后就存放在红黑树种,以EventPoll的结构体存在,如果有相应的事件发生,对应的回调函数就会触发,进而就会将该事件拷贝至双向链表中返回,而且,epoll每次返回的都是有事件发生的事件,不是所有时间,所以比较高效,总的来说epoll适用于连接数较多,活跃数较少的场景、而select适用于连接数不多,但大多都活跃的场景。

24、同一个IP同一个端口可以同时建立tcp和udp的连接吗

答可以,同一个端口虽然udp和tcp的端口数字是一样的,但实质他们是不同的端口,所以是没有影响的,从底层实质分析,对于每一个连接内核维护了一个五元组,包含了源ip,目的ip、源端口目的端口、以及传输协议,在这里尽管前4项都一样,但是传输协议是不一样的,所以内核会认为是2个不同的连接,在ip层就会进行开始分流,tcp的走tcp,udp走udp。

25、mysql的建表、删除表、更新表、查询表用什么命令

答:Create|Drop|Update|Select TABLE [表名]

26、mysql的索引有哪几种?

答:(1)普通索引 CREAT INDEX [index_name] ON table(column(length))

(2)唯一索引

(3)全文索引

(4)单列、多列索引

(5)组合索引

27、索引的优缺点,索引是不是越多越好?

答:主要就是可以有效的缩短数据的检索时间,建立索引的列可以保证行的唯一性,可以加快表与表的连接;但是创建索引、维护索引需要时间和空间成本,每条索引都要占据数据库的存储空间,此外,每次的增删改都需要对索引进行动态的维护,也会导致时间变长。

28、索引的适用场景

答:(1)数据量大的并且查询频率高的应当使用索引

(2)表与表连接时的联合查询,约束条件的字段应该建立索引

(3)用于排序的字段可以使用索引

。。。。。

29、索引的原理

答:以空间换时间,建立索引之后,会将索引的KEY值放在一个BTree上,这个方式是一种n分法,btree适合在磁盘上动态查找表,每次以索引进行查找的时候,会根据key值进行搜索,logn级别的。

腾讯天美工作室(实习)

1、hash表使用开链,里面的链表过长说明了什么?

答:hash函数设计的不好,导致冲突严重,进而导致同一个“桶”内的链表数目增多。

2、c++不能被继承的类

答:(1)、可以将构造函数放入到private里面,这样是无法构造出子类对象的,同时增加一个static的 get instance的函数,来调用构造函数。(但是这样得不到一个栈上的对象)

(2)、让该类去虚继承一个模板类,传人的模板类型就是该类,使得该类成为模板类的友元,这样子类在构造时,他直接先构造祖先类的成分,显然他不是友元,所以失败。

(3)、使用c++11新增的final关键字,使得申明的类是一个最终类,无法被继承。

3、什么叫字长?

答:计算机在同一个时间能处理的一组二进制数称为计算机的一个字,这组二进制数的位数就是字长,所以现在计算机有16位、32位、64位等。

4、计算机的存储系统?

答:分为内存和外存,其中内存有主存、cache、寄存器等,外存分为磁盘、光盘等

5、static关键字的作用,存放位置

答:static关键字有隔离隐藏作用,比如多个cpp文件,如果将全局变量声明为static,那么该变量只对该文件可见;变量声明为static,可以使得这个值的生命期是整个程序结束;此外,c++类中的staitic 申明的变量和函数表示都是属于类的属性,而不是对象的成员。未初始化的放在bss段,初始化的放在data段中。

6、堆和栈的区别

答:

从管理方式上,

栈是由编译器自动管理,无需我们手动控制;

对于堆,开辟和释放工作由程序员控制,所以有内存泄漏等情况的发生。

从申请大小上,

栈是有高地址向低地址扩展的,是一块连续的内存区域,所以栈的栈顶地址或者大小 是一开始就分配好的。在使用过程中,比如递归调用层数过多,那么就有可能造成栈溢出,所以栈能获得的空间比较少;

堆是向高地址扩展的,是链表组织的方式,所以有可能是不连续的,他的大小只受限于有效的虚拟内存大小,所以堆能开辟的空间较大。

从碎片问题上,

栈是没有碎片的情况,因为他有严格的出栈入栈,不会存在一个内存块从栈的中间位置弹出;

堆有碎片的情况,频繁的调用new/delete分配释放内存,必然会造成内存碎片。

从分配方式上,

堆都是动态分配的

栈大多是静态分配的,也可以动态分配,可以由alloc函数分配。

从分配效率上,

计算机会在底层对栈提供支持,比如有专门的寄存器分配,用来存放栈的地址,压栈出栈的指令等;

堆是由c/c++函数库提供的,机制比较复杂(未了解)

7、struct和class的区别

答:这个在OMG面试中也出现过。

8、malloc和new的区别

答:最大的区别在于malloc只是简单的分配了内存空间,而new在分配了内存空间之后调用了对象的构造函数。详细的见:new和malloc的区别,或者delete和free.note

9、引用和指针的区别

答:引用是一个已有对象的别称,指针是一个地址,从非空性上说,引用不能为空,指针本身是个值,可以为空;在编码的时候,对引用我们不需要判断,但是对于指针,我们必须对其非空性进行判断;当指向的对象可能在发生变化的时候,往往使用指针,而引用一定固定的。

10、map的底层实现

答底层是红黑树实现的,它是一个比较平衡的搜索二叉树,内部有序,所以在查找和删除的时候比较高效,时间复杂度是logn

11、tcp的三次握手过程和四次挥手过程

答:这个建议将函数调用的情况添加进去说明。详细:TCP建立连接三次握手和释放连接四次握手.note

12、c++多态的实现原理

答:c++多态主要是通过虚函数表实现的,c++多态的体现,主要是通过父类指针指向一个子类对象,此时调用的函数就是子类的函数,体现了多态性,因为在调用过程中,通过钱4个字节的虚表指针找到了虚函数表,此时由于实际对象是子类对象,那么其虚函数表是子类的虚函数表,对于同一个虚函数,子类的虚函数将会覆盖掉父类的虚函数,构建出自己的虚函数表,所以此时通过虚表指针访问放的虚函数就是子类的虚函数,这就是c++的多态的体现。

13、c++对象的内存模型

答:在内存中,前4个字节代表了其虚表指针,指向的是子类的虚函数表,接下来存放的是父类的对象的成员,再是子类成员部分。

14c++的内存模型

答:内存分为5个段,从低地址往高地址,一次是代码段、数据段、bss段、堆、栈。然后balabala。。。。

15、滑动窗口的作用

答:主要就是为了实现流量控制,控制了发送包的速率,每次发送方只能发送滑动窗口内部的数据包,才能保证接收方不会因为发送过快造成流量淹没,数据包的丢失。他的大小是 拥塞窗口和通告窗口 两者的最小值。

项目

1、如何实现断点续传,如何提高上传速

算法

1、计算表达式 (改成后缀表达式进行处理)

2、朋友圈问题,求总共有多少个朋友圈 (使用并查集)

3、链表逆序 (剑指offer上有,但是如果不改变内存结构,那就只能改变值,使用栈进行存储)

4、一个数组找中位数(通过快排思想,常数级的若干次求position,直到恰好是中心,时间复杂度是O(n),如果是海量数据呢2g数据,500内存如何处理?->hash之后分成小文件,再外部排序,使用归并,可以使用最大堆,直到数据过半)

腾讯SNG(实习一面)

只持续了20分钟,似乎面试官很忙。

1、系统调用和库函数有什么区别和联系

2、epoll和select的区别

3、epoll的高效,有几种工作模式( LT、ET)

4、TCP 和 UDP的区别

5、TIMEWAIT是什么,为什么要设置TIMEWAIT状态

6、TCP的可靠性是如何实现的?(流量控制、拥塞控制、确认序号、校验???)

暂时记不起来了。

oppo(一面)

首先介绍项目,我给他介绍了一下这个项目的架构,功能。

问题1:你觉得这个项目的难点在于哪里?(懵逼了)

答:难点到不太多,可以说一下学到了什么,优化了什么,比如数据传输协议用到了protobuf,更快,更安全、数据量更小。

问题2:io复用和异步io有什么区别?

答:IO复用其实一种同步IO,他只是将事件通知统一交给了select或者epoll,所以,对于IO复用,其实Select或者epoll在检测可用时是阻塞的,里面的读写一般也是阻塞的,而异步IO是不会阻塞的,数据从内核态拷贝到用户态缓冲区完成后,***作系统会发送信号,通知进程处理,这个过程进程是可以继续执行的,这个就是异步io。

问题3:多进程和多线程有什么区别?如果给你一个业务场景,你是如何选择多进程还是多线程?

答:多线程共享同一个地址空间,带来的好处就是他们进行通信比较方便,可以通过全局变量等,但是也有隐患,需要处理好竞争问题,而且一旦一个线程崩掉了,整个进程就死了,影响其他进程。多进程相反。。此外,线程的创建开销更小。多进程的场景举例:比如你要进行主机迁移,多进程的话,你可以将某个进程迁移到另外的主机,不受影响,但是多线程没法迁移。

问题4:讲一讲c++的虚函数表呢?

答:c++的多态就是通过虚函数表来实现的,该表是在编译期生成,存放在rodata段,我们知道一个类的对象的内存结构是前4个字节是其虚表指针,即vptr,指向了其虚表,虚表中装的就是该类的虚函数。c++多态的体现,往往是通过父类指针,指向子类对象,我们发现调用的虚函数是子类的虚函数,而不是父类的就是因为此时的对象是子类对象,其虚表是子类的虚表,其中的同名虚函数早在编译期就已经被覆盖成子类的虚函数了,所以此时调用的是子类的虚函数,多态就是这么体现的。

问题5:构造函数、析构函数的顺序,为什么析构函数是反向的?

答:构造:先父类再子类; 析构:先子类再父类。 这是c++的规则。

中间 做了一套笔试题,各种各样的都有。

编程/算法

1、一个文件无序存放了1w个数字,每行1个。数字范围1-1w,现在随机删除2个数字。请把他们2个找出来。

答:使用hash数组,遍历文件,每遍历到一个数字,就以该数字为下标的数组元素置1,不用加1,因为数字不重复的。最后再遍历一遍数组,值为0的元素的下标就是所求数字。

2、如何对你申请的内存进行优化?

答:可以使用bitmap,每一bit可以代表一个数字,这样可以压缩内存。

3、压缩率是多少?

答:每个bit一个数字,而之前数组一个元素是int类型的,占32位,所以压缩率是32倍。

4、什么场景用bitmap?

答:我说数据较为密集,而且你这里数据是连续不重复,就符合,而且你的数据是有范围的。

5、如果数据有重复呢?

答:可以使用2-bitmap,00代表不出现,01代表出现1次,10代表出现2次,11表示无定义,这样遍历一遍就可以找到是哪几个数字

他回答:不是,比如数字3,具体有多少出现,这个这需要知道的。 我说:10bit可以表示的数是1024,而你每个数字不可能超过1w次。所以要记录次数的话,就还是用bitmap但是不是1位,大概1个数用14bit吧,但相比32位一个数要好些。

oppo二面

2、介绍usb的项目、功能、架构

3、这个io复用模型跟普通多线程、多进程的区别

答: io复用,多个链接复用一个线程,而普通多线程是一个链接一个线程,所以必然创建线程的数目就多,现成的创建是有开销的,所以io复用这种开销小。

4、网络传输的数据协议

主要有3个段,前8bit是数据type,中间是length,最后是具体的data。

5、如果协议是这样。如果两个数据包连在一起,怎么分开?

答:在首部再加几个bit,作为隔离位。

6、如何实现你的fd是负载均衡的

答:分类处理

7、多个用户访问同一个资源,如何加锁

答:不太明白他的意思,epoll内部处理事件是同步依次执行的,而且这里的锁是线程资源

8、tcp是如何处理粘包?

9、tcp是如何关闭的?就是说4次挥手过程

10、如果tcp关闭的第四个分节没有被收到,那么怎么办?

11、tcp的拥塞控制过程

12、delete和free的区别

13、STL的出现是为了什么

14、STL的迭代器的类型有哪几种?

15、STL hashmap的实现?

16、线程间同步的手段

17、进程间通信的方式

18、如何使用信号量制作出一个互斥锁

19、系统调用的返回有什么变化?

20、描述一下系统中断的过程

21、c++多态是如何实现的?

22、c++多继承是如何实现?如何处理同名变量

23、怎么实现无锁***作

24、你评价一下你自己。

25、你觉得你同学朋友如何评价你?

26、你对哪些技术感兴趣?

27、参加过哪些社团

28、你怎么协调与他人的关系的?

29、你有什么要问我的吗?

百度云一面

1、C++多态的实现

2、多重继承下,多个父类含有同一同名函数,子类对象调用会有问题吗?

答:首先 AB2个父类中的函数假设就是普通成员函数f(),那么子类C没有自己的f函数,其对象c.f()的时候就会报错,编译报错,存在二义性。如果C有自己的f函数,此时不会报错,调用的是自己c类的f()函数,也就是说此时父类的函数就被隐藏了。如果AB中的f()是虚函数,那么也不受影响,还是调c的。如果2个f的参数类型也不一样,也会报二义性错误。(为什么呢?)

3、static变量

4、tcp三次握手 、2次、4次?

5、tcp可靠性的实现原因

6、滑动窗口的作用

7、原子***作如何实现(锁、cas***作)

8、如何实现一个互斥锁,互斥锁的实现原理

想不起来了

笔试:

特殊链表(每个节点带一个随机指针),对该链表进行复制,输出复制后的新链表。(剑指offer原题)

百度云二面

1、socket和epoll的关系区别?(不太懂他意思,反正对epoll的底层进行了阐述)

2、红黑树是线程安全的吗

3、有哪些同步手段

4、用过哪种锁(mutex)

5、读写锁了解过吗,自己实现一下,提出思路即可(对读***作进行计数)

6、计数如何保证线程安全?(cas***作、***作系统底层指令支持)

7、vector的插入pushback的时间复杂度是多少(O(n))

8、如果vectorpushback的时候扩容了,比如pushback n个数,时间复杂度是多少?(我给他阐述了内存拷贝的过程,但是不知道怎么求,他回答说:其实是一个等差数列,最后求得还是O(n))

9、vector底层是几个指针实现的(3个 start、finish、end_of_storage)

10、vector扩容几倍 (SGI STL的vector是2倍)

11、c++多态的实现(run time的多态:指针或者引用 结合 虚函数表实现)

12、c++11 move语意解释一下

13、 move除了用于指针,还可以用于哪些?比如哪些数据结构 (vector)

14、拿过哪些offer

想不起来了。。。

360二面

1、使用stl如何保证线程安全(除了锁以外)

2、交给sub 线程的文件描述符如何回收的?

3、tcp粘包

4、linux下查看网络连接

5、linux下查看内存cpu (top)

6、linux下查看内核版本 uname-a

7、linux下查看发行版本 cat /etc/issue

8、IO和reactor模式 (吹的select和epoll)

9、linux下 进程cpu占用是怎么计算的(大致是:通过/proc/stat 读取CPU总的时间,再通过/proc/pid/stat下读取进程的占用时间,做除法。(比较粗略的阐述))

10、linux下 tmp目录里面的内容会被清除吗(会,系统会执行tmpwatch脚本,一般传入参数是时间,比如 tmpwatch 10 /tmp/ 表示的就是会删除10天内没有修改、访问的文件。)

11、怎么查动态依赖的库有哪些?(readelf -a [程序名] |grep library)

腾讯IEG魔方工作室(简历面)

tcp udp 游戏

容器线程安全

hashmap实现

新链接 何时注册写事件

主线程如何将fd交给sub线程?

为什么这个回调函数在本函数执行,是线程安全的?

rehash

多线程,多进程区别

切换的性能损耗

strncpy

总算写完了。下面分享一些我之前看的资料。

资料获取方式

转发后,加群:878249276,即可获取!

重要的事情说三遍,转发、转发、转发后再加,才可以拿到!

资料获取方式

转发后,加群:878249276,即可获取!

重要的事情说三遍,转发、转发、转发后再加,才可以拿到!

TCP/IP详解 卷1:协议 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 分层 1 1.3 TCP/IP的分层 4 1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行线路吞吐量计算 21 2.11 小结 22 第3章 IP:网际协议 24 3.1 引言 24 3.2 IP首部 24 3.3 IP路由选择 27 3.4 子网寻址 30 3.5 子网掩码 32 3.6 特殊情况的IP地址 33 3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的分组格式 40 4.5 ARP举例 41 4.5.1 一般的例子 41 4.5.2 对不存在主机的ARP请求 42 4.5.3 ARP高速缓存超时设置 43 4.6 ARP代理 43 4.7 免费ARP 45 4.8 arp命令 45 4.9 小结 46 第5章 RARP:逆地址解析协议 47 5.1 引言 47 5.2 RARP的分组格式 47 5.3 RARP举例 47 5.4 RARP服务器的设计 48 5.4.1 作为用户进程的RARP服务器 49 5.4.2 每个网络有多个RARP服务器 49 5.5 小结 49 第6章 ICMP:Internet控制报文协议 50 6.1 引言 50 6.2 ICMP报文的类型 50 6.3 ICMP地址掩码请求与应答 52 6.4 ICMP时间戳请求与应答 53 6.4.1 举例 54 6.4.2 另一种方法 55 6.5 ICMP端口不可达差错 56 6.6 ICMP报文的4.4BSD处理 59 6.7 小结 60 第7章 Ping程序 61 7.1 引言 61 7.2 Ping程序 61 7.2.1 LAN输出 62 7.2.2 WAN输出 63 7.2.3 线路SLIP链接 64 7.2.4 拨号SLIP链路 65 7.3 IP记录路由选项 65 7.3.1 通常的例子 66 7.3.2 异常的输出 68 7.4 IP时间戳选项 69 7.5 小结 70 第8章 Traceroute程序 71 8.1 引言 71 8.2 Traceroute 程序的操作 71 8.3 局域网输出 72 8.4 广域网输出 75 8.5 IP源站选路选项 76 8.5.1 宽松的源站选路的traceroute 程序示例 78 8.5.2 严格的源站选路的traceroute 程序示例 79 8.5.3 宽松的源站选路traceroute程序 的往返路由 80 8.6 小结 81 第9章 IP选路 83 9.1 引言 83 9.2 选路的原理 84 9.2.1 简单路由表 84 9.2.2 初始化路由表 86 9.2.3 较复杂的路由表 87 9.2.4 没有到达目的地的路由 87 9.3 ICMP主机与网络不可达差错 88 9.4 转发或不转发 89 9.5 ICMP重定向差错 89 9.5.1 一个例子 90 9.5.2 更多的细节 91 9.6 ICMP路由器发现报文 92 9.6.1 路由器操作 93 9.6.2 主机操作 93 9.6.3 实现 93 9.7 小结 94 第10章 动态选路协议 95 10.1 引言 95 10.2 动态选路 95 10.3 Unix选路守护程序 96 10.4 RIP:选路信息协议 96 10.4.1 报文格式 96 10.4.2 正常运行 97 10.4.3 度量 98 10.4.4 问题 98 10.4.5 举例 98 10.4.6 另一个例子 100 10.5 RIP版本2 102 10.6 OSPF:开放最短路径优先 102 10.7 BGP:边界网关协议 103 10.8 CIDR:无类型域间选路 104 10.9 小结 105 第11章 UDP:用户数据报协议 107 11.1 引言 107 11.2 UDP首部 107 11.3 UDP检验和 108 11.3.1 tcpdump输出 109 11.3.2 一些统计结果 109 11.4 一个简单的例子 110 11.5 IP分片 111 11.6 ICMP不可达差错(需要分片) 113 11.7 用Traceroute确定路径MTU 114 11.8 采用UDP的路径MTU发现 116 11.9 UDP和ARP之间的交互作用 118 11.10 最大UDP数据报长度 119 11.11 ICMP源站抑制差错 120 11.12 UDP服务器的设计 122 11.12.1 客户IP地址及端口号 122 11.12.2 目标IP地址 122 11.12.3 UDP输入队列 122 11.12.4 限制本地IP地址 124 11.12.5 限制远端IP地址 125 11.12.6 每个端口有多个接收者 125 11.13 小结 126 第12章 广播和多播 128 12.1 引言 128 12.2 广播 129 12.2.1 受限的广播 129 12.2.2 指向网络的广播 129 12.2.3 指向子网的广播 129 12.2.4 指向所有子网的广播 130 12.3 广播的例子 130 12.4 多播 132 12.4.1 多播组地址 133 12.4.2 多播组地址到以太网地址的转换 133 12.4.3 FDDI和令牌环网络中的多播 134 12.5 小结 134 第13章 IGMP:Internet组管理协议 136 13.1 引言 136 13.2 IGMP报文 136 13.3 IGMP协议 136 13.3.1 加入一个多播组 136 13.3.2 IGMP报告和查询 137 13.3.3 实现细节 137 13.3.4 生存时间字段 138 13.3.5 所有主机组 138 13.4 一个例子 138 13.5 小结 141 第14章 DNS:域名系统 142 14.1 引言 142 14.2 DNS基础 142 14.3 DNS的报文格式 144 14.3.1 DNS查询报文中的问题部分 146 14.3.2 DNS响应报文中的资源记录部分 147 14.4 一个简单的例子 147 14.5 指针查询 150 14.5.1 举例 151 14.5.2 主机名检查 151 14.6 资源记录 152 14.7 高速缓存 153 14.8 用UDP还是用TCP 156 14.9 另一个例子 156 14.10 小结 157 第15章 TFTP:简单文件传送协议 159 15.1 引言 159 15.2 协议 159 15.3 一个例子 160 15.4 安全性 161 15.5 小结 162 第16章 BOOTP: 引导程序协议 163 16.1 引言 163 16.2 BOOTP的分组格式 163 16.3 一个例子 164 16.4 BOOTP服务器的设计 165 16.5 BOOTP穿越路由器 167 16.6 特定厂商信息 167 16.7 小结 168 第17章 TCP:传输控制协议 170 17.1 引言 170 17.2 TCP的服务 170 17.3 TCP的首部 171 17.4 小结 173 第18章 TCP连接的建立与终止 174 18.1 引言 174 18.2 连接的建立与终止 174 18.2.1 tcpdump的输出 174 18.2.2 时间系列 175 18.2.3 建立连接协议 175 18.2.4 连接终止协议 177 18.2.5 正常的tcpdump输出 177 18.3 连接建立的超时 178 18.3.1 第一次超时时间 178 18.3.2 服务类型字段 179 18.4 最大报文段长度 179 18.5 TCP的半关闭 180 18.6 TCP的状态变迁图 182 18.6.1 2MSL等待状态 183 18.6.2 平静时间的概念 186 18.6.3 FIN_WAIT_2状态 186 18.7 复位报文段 186 18.7.1 到不存在的端口的连接请求 187 18.7.2 异常终止一个连接 187 18.7.3 检测半打开连接 188 18.8 同时打开 189 18.9 同时关闭 191 18.10 TCP选项 191 18.11 TCP服务器的设计 192 18.11.1 TCP服务器端口号 193 18.11.2 限定的本地IP地址 194 18.11.3 限定的远端IP地址 195 18.11.4 呼入连接请求队列 195 18.12 小结 197 第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成块数据流 209 20.1 引言 209 20.2 正常数据流 209 20.3 滑动窗口 212 20.4 窗口大小 214 20.5 PUSH标志 215 20.6 慢启动 216 20.7 成块数据的吞吐量 218 20.7.1 带宽时延乘积 220 20.7.2 拥塞 220 20.8 紧急方式 221 20.9 小结 224 第21章 TCP的超时与重传 226 21.1 引言 226 21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 快速重传与快速恢复算法 236 21.8 拥塞举例(续) 237 21.9 按每条路由进行度量 240 21.10 ICMP的差错 240 21.11 重新分组 243 21.12 小结 243 第22章 TCP的坚持定时器 245 22.1 引言 245 22.2 一个例子 245 22.3 糊涂窗口综合症 246 22.4 小结 250 第23章 TCP的保活定时器 251 23.1 引言 251 23.2 描述 252 23.3 保活举例 253 23.3.1 另一端崩溃 253 23.3.2 另一端崩溃并重新启动 254 23.3.3 另一端不可达 254 23.4 小结 255 第24章 TCP的未来和性能 256 24.1 引言 256 24.2 路径MTU发现 256 24.2.1 一个例子 257 24.2.2 大分组还是小分组 258 24.3 长肥管道 259 24.4 窗口扩大选项 262 24.5 时间戳选项 263 24.6 PAWS:防止回绕的序号 265 24.7 T/TCP:为事务用的TCP扩展 265 24.8 TCP的性能 267 24.9 小结 268 第25章 SNMP:简单网络管理协议 270 25.1 引言 270 25.2 协议 270 25.3 管理信息结构 272 25.4 对象标识符 274 25.5 管理信息库介绍 274 25.6 实例标识 276 25.6.1 简单变量 276 25.6.2 表格 276 25.6.3 字典式排序 277 25.7 一些简单的例子 277 25.7.1 简单变量 278 25.7.2 get-next操作 278 25.7.3 表格的访问 279 25.8 管理信息库(续) 279 25.8.1 system组 279 25.8.2 interface组 280 25.8.3 at组 281 25.8.4 ip组 282 25.8.5 icmp组 285 25.8.6 tcp组 285 25.9 其他一些例子 288 25.9.1 接口MTU 288 25.9.2 路由表 288 25.10 trap 290 25.11 ASN.1和BER 291 25.12 SNMPv2 292 25.13 小结 292 第26章 Telnet和Rlogin:远程登录 293 26.1 引言 293 26.2 Rlogin协议 294 26.2.1 应用进程的启动 295 26.2.2 流量控制 295 26.2.3 客户的中断键 296 26.2.4 窗口大小的改变 296 26.2.5 服务器到客户的命令 296 26.2.6 客户到服务器的命令 297 26.2.7 客户的转义符 298 26.3 Rlogin的例子 298 26.3.1 初始的客户-服务器协议 298 26.3.2 客户中断键 299 26.4 Telnet协议 302 26.4.1 NVT ASCII 302 26.4.2 Telnet命令 302 26.4.3 选项协商 303 26.4.4 子选项协商 304 26.4.5 半双工、一次一字符、一次 一行或行方式 304 26.4.6 同步信号 306 26.4.7 客户的转义符 306 26.5 Telnet举例 306 26.5.1 单字符方式 306 26.5.2 行方式 310 26.5.3 一次一行方式(准行方式) 312 26.5.4 行方式:客户中断键 313 26.6 小结 314 第27章 FTP:文件传送协议 316 27.1 引言 316 27.2 FTP协议 316 27.2.1 数据表示 316 27.2.2 FTP命令 318 27.2.3 FTP应答 319 27.2.4 连接管理 320 27.3 FTP的例子 321 27.3.1 连接管理:临时数据端口 321 27.3.2 连接管理:默认数据端口 323 27.3.3 文本文件传输:NVT ASCII 表示还是图像表示 325 27.3.4 异常中止一个文件的传输: Telnet同步信号 326 27.3.5 匿名FTP 329 27.3.6 来自一个未知IP地址的匿名FTP 330 27.4 小结 331 第28章 SMTP:简单邮件传送协议 332 28.1 引言 332 28.2 SMTP协议 332 28.2.1 简单例子 332 28.2.2 SMTP命令 334 28.2.3 信封、首部和正文 335 28.2.4 中继代理 335 28.2.5 NVT ASCII 337 28.2.6 重试间隔 337 28.3 SMTP的例子 337 28.3.1 MX记录:主机非直接连到 Internet 337 28.3.2 MX记录:主机出故障 339 28.3.3 VRFY和EXPN命令 340 28.4 SMTP的未来 340 28.4.1 信封的变化:扩充的SMTP 341 28.4.2 首部变化:非ASCII字符 342 28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 353 29.5.2 安装协议 353 29.5.3 NFS过程 354 29.5.4 UDP还是TCP 355 29.5.5 TCP上的NFS 355 29.6 NFS实例 356 29.6.1 简单的例子:读一个文件 356 29.6.2 简单的例子:创建一个目录 357 29.6.3 无状态 358 29.6.4 例子:服务器崩溃 358 29.6.5 等幂过程 360 29.7 第3版的NFS 360 29.8 小结 361 第30章 其他的TCP/IP应用程序 363 30.1 引言 363 30.2 Finger协议 363 30.3 Whois协议 364 30.4 Archie、WAIS、Gopher、Veronica和WWW 366 30.4.1 Archie 366 30.4.2 WAIS 366 30.4.3 Gopher 366 30.4.4 Veronica 366 30.4.5 万维网WWW 367 30.5 X窗口系统 367 30.5.1 Xscope程序 368 30.5.2 LBX: 低带宽X 370 30.6 小结 370 附录A tcpdump程序 371 附录B 计算机时钟 376 附录C sock程序 378 附录D 部分习题的解答 381 附录E 配置选项 395 附录F 可以免费获得的源代码 406 参考文献 409 缩略语 420 =================================== TCP/IP详解 卷2:实现 ================ 第一章 概述 1.1 引言 1.2 源代码表示 1.3 历史 1.4 应用编程接口 1.5 程序示例 1.6 系统调用和库函数 1.7 描述符 1.8 网络实现概述 1.9 mbuf与输出处理 1.10 输入处理 1.11 网络实现概述 1.12 中断级别与并发 1.13 源代码组织 1.14 测试网络 1.15 小结 第二章 mduf:存储器缓存 2.1 引言 2.2 代码介绍 2.3 mduf的定义 2.4 mduf结构 2.5 简单的mduf宏和函数 2.6 m_devget和m_pullup函数 2.7 mduf宏和函数的小结 2.8 Net/3联网数据结构小结 2.9 m_copy和簇引用记数 2.10 其他选择 2.11 小结 第三章 接口层 3.1 引言 3.2 代码介绍 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的专用化 3.7 网络初始化概述 3.8 以太网初始化 3.9 SLIP初始化 3.10 环回初始化 3.11 if_attach函数 3.12 ifinit函数 3.13 小结 第四章 接口:以太网 4.1 引言 4.2 代码介绍 4.3 以太网接口 4.4 ioctl系统调用 4.5 小结 第五章 接口:SLIP和环回 5.1 引言 5.2 代码介绍 5.3 SLIP接口 5.4 环回接口 5.5 小结 第六章 IP编址 6.1 引言 6.2 代码介绍 6.3 接口和地址小结 6.4 sockaddr_in结构 6.5 in_ifaddr结构 6.6 地址指派 6.7 接口ioctl处理 6.8 internet实用函数 6.9 ifnet实用函数 6.10 小结 第七章 域和协议 7.1 引言 7.2 代码介绍 7.3 domain结构 7.4 protosw结构 7.5 IP的domain和protosw结构 7.6 pffindproto和pffindtype函数 7.7 pfctlinput函数 7.8 IP初始化 7.9 sysctl系统调用 7.10 小结 第八章 IP:网际协议 8.1 引言 8.2 代码介绍 8.3 IP分组 8.4 输入处理:ipintr函数 8.5 转发:ip_forward函数 8.6 输出处理:ip_output函数 8.7 Internet检验和:in_cksum函数 8.8 setsockopt和getsockopt系统调用 8.9 ip_sysctl函数 8.10 小结 第九章 IP选项处理 9.1 引言 9.2 代码介绍 9.3 选项格式 9.4 ip_dooptions函数 9.5 记录路由选项 9.6 源站和记录路由选项 9.7 时间戳选项 9.8 ip_insertoptions函数 9.9 ip_pcbopts函数 9.10 一些限制 9.11 小结 第十章 IP的分片与重装 10.1 引言 10.2 代码介绍 10.3 分片 10.4 ip_optcopy函数 10.5 重装 10.6 ip_optcopy函数 10.7 ip_slowtimo函数 10.8 小结 第十一章 ICMP:Internet控制报文协议 11.1 引言 11.2 代码介绍 11.3 icmp结构 11.4 ICMP的protosw结构 11.5 输入处理:icmp_input函数 11.6 差别处理 11.7 请求处理 11.8 重定向处理 11.9 回答问题 11.10 输出处理 11.11 icmp_error函数 11.12 icmp_reflect函数 11.13 icmp_send函数 11.14 icmp_sysctl函数 11.15 小结 第十二章 IP多播 12.1 引言 12.2 代码介绍 12.3 以太网多播地址 12.4 ether_multi结构 12.5 以太网多播接收 12.6 in_multi结构 12.7 ip_moptions结构 12.8 多播的插口选项 12.9 多播的TTL值 12.10 ip_setmoptions函数 12.11 加入一个IP多播组 12.12 离开一个IP多播组 12.13 ip_getmoptions函数 12.14 多播输入处理:ipintr函数 12.15 多播输出处理:ip_output函数 12.16 性能的考虑 12.17 小结 第十三章 IGMP:Internet组管理协议 13.1 引言 13.2 代码介绍 13.3 igmp结构 13.4 IGMP的protosw结构 13.5 加入一个组:igmp_joingroup函数 13.6 igmp_fasttimo函数 13.7 输入处理:igmp_input函数 13.8 离开一个组:igmp_leavegroup函数 13.9 小结 第十四章 IP多播选路 14.1 引言 14.2 代码介绍 14.3 多播输出处理 14.4 mrouted守护程序 14.5 虚拟接口 14.6 IGMP 14.7 多播选路 14.8 多播转发:ip_mforward函数 14.9 清理:ip_mrouter_done函数 14.10 小结 第十五章 插口层 15.1 引言 15.2 代码介绍 15.3 socket介绍 15.4 系统调用 15.5 进程,描述符和插口 15.6 socket系统调用 15.7 getsock和sockargs函数 15.8 bind系统调用 15.9 listen系统调用 15.10 tsleep和wakeup函数 15.11 accept系统调用 15.12 sonewconn和soisconnected函数 15.13 connect系统调用 15.14 shutdown系统调用 15.15 close系统调用 15.16 小结 第十六章 插口I/O 16.1 引言 16.2 代码介绍 16.3 插口缓存 16.4 write,writev,sendto和sendmsg系统调用 16.5 sendmsg系统调用 16.6 sendit函数 16.7 sosend函数 16.8 read,readv,recvfrom和recvmsg系统调用 16.9 recvgsm系统调用 16.10 soreceive函数 16.11 recvit函数 16.12 soreceive代码 16.13 select系统调用 16.14 小结 第十七章 插口选项 17.1 引言 17.2 代码介绍 17.3 setsockopt系统调用 17.4 getsockopt系统调用 17.5 fcntl和ioctl系统调用 17.6 getsockname系统调用 17.7 getpeername系统调用 17.8 小结 第十八章 Radix树路由表 18.1 引言 18.2 路由表结构 18.3 选路插口 18.4 代码介绍 18.5 Radix结点数据结构 18.6 选路结构 18.7 初始化:route_init和rtable_init函数 18.8 初始化:rn_init和rn_inithead 18.9 重复键和掩码列表 18.10 rn_match函数 18.11 rn_search函数 18.12 小结 第十九章 选路请求和选路消息 19.1 引言 19.2 rtalloc和rtallocl函数 19.3 宏RTFREE和rtfree函数 19.4 rtrequest函数 19.5 rt_setgate函数 19.6 rtinit函数 19.7 rtredirect函数 19.8 选路消息的结构 19.9 rt_missmsg函数 19.10 rt_ifmsg函数 19.11 rt_newaddrmsg函数 19.12 rt_msg1函数 19.13 rt_msg2函数 19.14 sysctl_rtable函数 19.15 sysctl_dumpentry函数 19.16 sysctl_iflist函数 19.17 小结 第二十章 选路接口 20.1 引言 20.2 routedomain和protosw结构 20.3 选路控制块 20.4 raw_init函数 20.5 route_output函数 20.6 rt_xaddrs函数 20.7 rt_setmetrics函数 20.8 raw_input函数 20.9 route_usrreq函数 20.10 raw_usrreq函数 20.11 raw_attach,raw_detach和raw_disconnect函数 20.12 小结 第二十一章 ARP:地址解析协议 21.1 介绍 21.2 ARP和路由表 21.3 代码介绍 21.4 ARP结构 21.5 arpwhohas函数 21.6 arprequest函数 21.7 arpintr函数 21.8 in_arpinput函数 21.9 ARP定时器函数 21.10 arpresolve函数 21.11 arplookup函数 21.12 代理ARP 21.13 arp_rtrequest函数 21.14 ARP和多播 21.15 小结 第二十二章 协议控制块 22.1 引言 22.2 代码介绍 22.3 inpcb结构 22.4 in_pcballoc和in_pcbdetach函数 22.5 绑定,连接和分用 22.6 in_pcblookup函数 22.7 in_pcbbind函数 22.8 in_pcbconnect函数 22.9 in_pcbdisconnect函数 22.10 in_setsockaddr和in_setpeeraddr函数 22.11 in_pcbnotify,in_rtchange和in_losing函数 22.12 实现求精 22.13 小结 第二十三章 UDP:用户数据报协议 23.1 引言 23.2 代码介绍 23.4 UDP的protosw结构 23.5 udp_init函数 23.6 udp_output函数 23.7 udp_saveopt函数 23.8 udp_ctlinput函数 23.9 udp_usrreq函数 23.10 udp_sysctl函数 23.11 udp_input函数 23.12 实现求精 23.13 小结 第二十四章 TCP:传输控制协议 24.1 引言 24.2 代码介绍 24.3 TCP的protosw结构 24.4 TCP的首部 24.5 TCP的控制块 24.6 TCP的状态变迁图 24.7 TCP的序号 24.8 tcp_init函数 24.9 小结 第二十五章 TCP的定时器 25.1 引言 25.2 代码介绍 25.3 tcp_canceltimers函数 25.4 tcp_fasttimo函数 25.5 tcp_slowtimo函数 25.6 tcp_timers函数 25.7 重传定时器的计算 25.8 tcp_newtcpcb算法 25.9 tcp_setpersist函数 25.10 tcp_xmit_timer函数 25.11 重传超时:tcp_timers函数 25.12 一个RTT的例子 25.13 小结 第二十六章 TCP输出 26.1 引言 26.2 tcp_output概述 26.3 决定是否应发送一个报文段 26.4 TCP选项 26.5 窗口大小选项 26.6 时间戳选项 26.7 发送一个报文段 26.8 tcp_template函数 26.9 tcp_respond函数 26.10 小结 第二十七章 TCP的函数 27.1 引言 27.2 tcp_drain函数 27.3 tcp_drop函数 27.4 tcp_close函数 27.5 tcp_mss函数 27.6 tcp_ctlinput函数 27.7 tcp_notify函数 27.8 tcp_quench函数 27.9 TCP_REASS宏和tcp_reass函数 27.10 tcp_trace函数 27.11小结 第二十八章 TCP的输入 28.1 引言 28.2 预处理 28.3 tcp_dooptions函数 28.4 首部预测 28.5 TCP输入:缓慢的执行路径 28.6 完成被动打开或主动打开 28.7 PAWS:防止序号回饶 28.8 裁剪报文段使数据在窗口内 28.9 自连接和同时打开 28.10 记录时间戳 28.11 RST处理 28.12 小结 第二十九章 TCP的输入(续) 29.1 引言 29.2 ACK处理概述 29.3 完成被动打开和同时打开 29.4 快速重传和快速恢复的算法 29.5 ACK处理 29.6 更新窗口信息 29.7 紧急方式处理 29.8 tcp_pulloutofband函数 29.9 FIN处理 29.10 最后的处理 29.11 处理已接收的数据 29.12 实现求精 29.13 首部压缩 29.14 小结 第三十章 TCP的用户需求 30.1 引言 30.2 tcp_usrreq函数 30.3 tcp_attach函数 30.4 tcp_disconnect函数 30.5 tcp_usrclosed函数 30.6 tcp_ctloutput函数 30.7 小结 第三十一章 BPF:BSD分组过滤程序 31.1 引言 31.2 代码介绍 31.3 bpf_if结构 31.4 bpf_d结构 31.5 BPF的输入 31.6 BPF的输出 31.7 小结 第三十二章 原始IP 32.1 引言 32.2 代码介绍 32.3 原始IP的protosw结构 32.4 rip_init函数 32.5 rip_input函数 32.6 rip_output函数 32.7 rip_usrreq函数 32.8 rip_ctloutput函数 32.9 小结 结束语 附录A 部分习题的解答 附录B 源代码的获取 附录C RFC 1122的有关内容 参考文献 =================================== TCP/IP详解 卷3:TCP事务协议HTTPNNTP和UNIX域协议 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1.1 概述 1.2 UDP上的客户-服务器 1.3 TCP上的客户-服务器 1.4 T/TCP上的客户-服务器 1.5 测试网络 1.6 时间测量程序 1.7 应用 1.8 历史 1.9 实现 1.10 小结 第2章 T/TCP协议 2.1 概述 2.2 T/TCP中的新TCP选项 2.3 T/TCP实现所需变量 2.4 状态变迁图 2.5 T/TCP的扩展状态 2.6 小结 第3章 T/TCP使用举例 3.1 概述 3.2 客户重新启动 3.3 常规的T/TCP事务 3.4 服务器收到过时的重复SYN 3.5 服务器重启动 3.6 请求或应答超出报文段最大长度MSS 3.7 向后兼容性 3.8 小结 第4章 T/TCP协议(续) 4.1 概述 4.2 客户的端口号和TIME_WAIT状态 4.3 设置TIME_WAIT状态的目的 4.4 TIME_WAIT状态的截断 4.5 利用TAO跳过三次握手 4.6 小结 第5章 T/TCP协议的实现:插口层 5.1 概述 5.2 常量 5.3 sosend函数 5.4 小结 第6章 T/TCP的实现:路由表 6.1 概述 6.2 代码介绍 6.3 radix_node_head结构 6.4 rtentry结构 6.5 rt_metrics结构 6.6 in_inithead函数 6.7 in_addroute函数 6.8 in_matroute函数 6.9 in_clsroute函数 6.10 in_rtqtimo函数 6.11 in_rtqkill函数 6.12 小结 第7章 T/TCP实现:协议控制块 7.1 概述 7.2 in_pcbladdr函数 7.3 in_pcbconnect函数 7.4 小结 第8章 T/TCP实现: TCP概要 8.1 概述 8.2 代码介绍 8.3 TCP的protosw结构 8.4 TCP控制块 8.5 tcp_init函数 8.6 tcp_slowtimo函数 8.7 小结 第9章 T/TCP实现:TCP输出 9.1 概述 9.2 tcp_output函数 9.2.1 新的自动变量 9.2.2 增加隐藏的状态标志 9.2.3 在SYN_SENT状态不要重传SYN 9.2.4 发送器的糊涂窗口避免机制 9.2.5 有RST或SYN标志时强制发送报文段 9.2.6 发送MSS选项 9.2.7 是否发送时间戳选项 9.2.8 发送T/TCP的CC选项 9.2.9 根据TCP选项调整数据长度 9.3 小结 第10章 T/TCP实现:TCP函数 10.1 概述 10.2 tcp_newtcpcb函数 10.3 tcp_rtlookup函数 10.4 tcp_gettaocache函数 10.5 重传超时间隔的计算 10.6 tcp_close函数 10.7 tcp_msssend函数 10.8 tcp_mssrcvd函数 10.9 tcp_dooptions函数 10.10 tcp_reass函数 10.11 小结 第11章 T/TCP实现:TCP输入 11.1 概述 11.2 预处理 11.3 首部预测 11.4 被动打开的启动 11.5 主动打开的启动 11.6 PAWS:防止序号重复 11.7 ACK处理 11.8 完成被动打开和同时打开 11.9 ACK处理(续) 11.10 FIN处理 11.11 小结 第12章 T/TCP实现:TCP用户请求 12.1 概述 12.2 PRU_CONNECT请求 12.3 tcp_connect函数 12.4 PRU_SEND和PRU_SEND_EOF请求 12.5 tcp_usrclosed函数 12.6 tcp_sysctl函数 12.7 T/TCP的前景 12.8 小结 第二部分 TCP的其他应用 第13章 HTTP:超文本传送协议 13.1 概述 13.2 HTTP和HTML概述 13.3 HTTP 13.3.1 报文类型:请求与响应 13.3.2 首部字段 13.3.3 响应代码 13.3.4 各种报文头举例 13.3.5 例子:客户程序缓存 13.3.6 例子:服务器重定向 13.4 一个例子 13.5 HTTP的统计资料 13.6 性能问题 13.7 小结 第14章 在HTTP服务器上找到的分组 14.1 概述 14.2 多个HTTP服务器 14.3 客户端SYN的到达间隔时间 14.4 RTT的测量 14.5 用listen设置入连接队列的容量 14.6 客户端的SYN选项 14.7 客户端的SYN重传 14.8 域名 14.9 超时的持续探测 14.10 T/TCP路由表大小的模拟 14.11 mbuf的交互 14.12 TCP的PCB高速缓存和首部预测 14.13 小结 第15章 NNTP:网络新闻传送协议 15.1 概述 15.2 NNTP 15.3 一个简单的新闻客户 15.4 一个复杂的新闻客户 15.5 NNTP的统计资料 15.6 小结 第三部分 Unix域协议 第16章 Unix域协议:概述 16.1 概述 16.2 用途 16.3 性能 16.4 编码举例 16.5 小结 第17章 Unix域协议:实现 17.1 概述 17.2 代码介绍 17.3 Unix domain和protosw结构 17.4 Unix域插口地址结构 17.5 Unix域协议控制块 17.6 uipc_usrreq函数 17.7 PRU_ATTACH请求和unp_attach函数 17.8 PRU_DETACH请求和unp_detach函数 17.9 PRU_BIND请求和unp_bind函数 17.10 PRU_CONNECT请求和unp_connect函数 17.11 PRU_CONNECT2请求和unp_connect2函数 17.12 socketpair系统调用 17.13 pipe系统调用 17.14 PRU_ACCEPT请求 17.15 PRU_DISCONNECT请求和unp_disconnect函数 17.16 PRU_SHUTDOWN请求和unp_shutdown函数 17.17 PRU_ABORT请求和unp_drop函数 17.18 其他各种请求 17.19 小结 第18章 Unix域协议:I/O和描述符的传递 18.1 概述 18.2 PRU_SEND和PRU_RCVD请求 18.3 描述符的传递 18.4 unp_internalize函数 18.5 unp_externalize函数 18.6 unp_discard函数 18.7 unp_dispose函数 18.8 unp_scan函数 18.9 unp_gc函数 18.10 unp_mark函数 18.11 性能(再讨论) 18.12 小结 附录A 测量网络时间 附录B 编写T/TCP应用程序 参考文献 缩略语
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值