百度面试2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、自我介绍
二、项目介绍及解答
三、知识问答
1、三次握手是什么回事
传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。

是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的。

每一次TCP连接都需要三个阶段:连接建立、数据传送和连接释放。

“三次握手”就发生在连接建立阶段。

1. TCP连接建立过程中为什么需要“三次握手”
目的是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

“已失效的连接请求报文段”的产生在这样一种情况下:
client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。

本来这是一个早已失效的报文段。

但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。

于是就向client发出确认报文段,同意建立连接。

若不采用“三次握手”,那么只要server发出确认,新的连接就建立了。

由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server 发送数据。

但server却以为新的运输连接已经建立,并一直等待client 发来数据。

这样,server的很多资源就白白浪费掉了。

采用“三次握手”的办法可以防止上述现象发生。

例如刚才那种情况,client不会向server的确认发出确认。

server由于收不到确认,就知道client并没有要求建立连接。


2. TCP三次握手
三次握手(Three-way Handshake)是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

(1)第一次握手
客户端发送一个TCP的SYN标志位置1的包,指明客户打算连接的服务器的端口,以及初始序号X, 保存在包头的
序列号(Sequence Number)字段里。

(2)第二次握手
服务器发回确认包(ACK)应答。

即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)
设置为客户的I S N加1以.即X+1。

(3)第三次握手
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段
中发送给对方.并且在数据段放写ISN的+1
3. SYN攻击
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处
于Syn_RECV状态. 当收到ACK后,服务器转入ESTABLISHED状态.
Syn攻击就是攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

Syn攻击是一个典型的DDOS攻击。

检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV
一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。

主要方法有SynAttackProtect保护机制、SYN cookies 技术、增加最大半连接和缩短超时时间等.但是不能完全防范syn攻击。

4. TCP四次挥手
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。

客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

2、链表与数组的区别?什么时候用数组什么时候用链
表?
数组,在内存上给出了连续的空间。

链表,内存地址上可以是不连续的,每个链表的节点包括原来的内存和下一个节点的信息(单向的一个,双向链表的话,会有两个)
数组优于链表的:
A. 内存空间占用的少,因为链表节点会附加上一块或两块下一个节点的信息。

但是数
组在建立时就固定了。

所以也有可能会因为建立的数组过大或不足引起内存上的问题。

B. 数组内的数据可随机访问,但链表不具备随机访问性。

这个很容易理解,数组在内存
里是连续的空间,比如如果一个数组地址从100到200,且每个元素占用两个字节,那么100-200之间的任何一个偶数都是数组元素的地址,可以直接访问链表在内存地址可能是分散的。

所以必须通过上一节点中的信息找能找到下一个节点。

C. 查找速度上。

这个也是因为内存地址的连续性的问题。

链表优于数组的
A. 插入与删除的操作。

如果数组的中间插入一个元素,那么这个元素后的所有元素的
内存地址都要往后移动。

删除的话同理。

只有对数据的最后一个元素进行插入删除操作时,才比较快。

链表只需要更改有必要更改的节点内的节点信息就够了。

并不需要更改节点的内存地址。

B. 内存地址的利用率方面。

不管你内存里还有多少空间,如果没办法一次性给出数组所
需的要空间,那就会提示内存不足,磁盘空间整理的原因之一在这里。

而链表可以是分散的空间地址。

C. 链表的扩展性比数组好。

因为一个数组建立后所占用的空间大小就是固定的,如果
满了就没法扩展,只能新建一个更大空间的数组;而链表不是固定的,可以很方便的扩展。

3、列出你知道的排序算法?时间复杂度?时间复杂度相
同的前提下,比较两种算法的优越性?适用场合?
4、线程与进程的区别?介绍所做项目中所用到的线程和
进程的例子
进程是程序的一次执行,也是占用系统资源的一个基本单位,
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

可以理解为进程中执行的一段程序片段
区别:
1、线程是进程的一部分,线程隶属于某个进程。

2、进程是程序的一种动态形式,是cpu、内存等资源占用的基本单位,而线程是不能独立的占有这些资源的。

3、进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便
4、进程在执行过程中,包含比较固定的入口、执行顺序和出口,而线程的这些过程会被应用程序所控制。

5、Hadoop相关知识,MapReduce底层原理?任务提交
过程?
6、给定一个矩阵,编写程序找到矩阵中在该行是最大值,
在该列是最小值的数,并输出其位置?
1、找到所有行的最大值,并标记其位置
2、将最大值与最大值所在列的元素进行比较,若存在一个数比该最大值小,则不符合
要求,停止比较
3、重复2,直到找到符合要求的数字输出。

相关文档
最新文档