一,tcp-ip三次握手四次挥手
答:第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端接收到服务器的SNY+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
四次挥手:
主动方发送Fin+Ack报文,并置发送序号为X
被动方发送ACK报文,并置发送序号为Z,在确认序号为X+1
被动方发送Fin+ACK报文,并置发送序号为Y,在确认序号为X。
主动方发送ACK报文,并置发送序号为X,在确认序号为Y。
在关闭连接时,当服务器端收到Fin报文时,很可能并不会立即关闭socket,所以只能先回复一个ack报文,告诉client端,“你发的fin报文我收到了”。只有等到server端的所有报文都发送完了,才发送fin报文,因此不能fin和ack一起发送,所以需要四次挥手。
为什么会有Time_Wait状态,且需要经过2MSL才返回到ClOSE状态?
答案:因为网络原因,主动关闭的一方发送的ACK包可能延迟,从而触发被动连接一方重传FIN包。在极端的情况下,这一去一回,就是2倍的MSL时长。如果主动关闭的一方跳过TIME_WAIT直接进入CLOSED,或者在TIME_WAIT停留的时长不足两倍的MSL,那么当被动关闭的一方早先发出的延迟包到达后,就可能出现类似下面的问题:
1. 旧的TCP连接已经不存在了,系统此时只能返回RST包。
2. 新的TCP连接建立起来了,延迟包可能干扰新的连接。
TCP的三次握手可以明确连接请求的有效性,防止已过期的连接再次传到被连接的主机。
http://www.cppentry.com/bencandy.php?fid-56-id-2686-page-1.htm
二,操作系统的内存管理淘汰算法有哪些?
FIFO先进先出算法:这个算法总是选择在内存驻留时间最长的一页将其淘汰。
LRU 最近最少使用算法:当需要淘汰某页,选择离当前最近的一段时间内最近没有使用的页先淘汰。
OPT 最佳淘汰算法:这个算法淘汰在访问串中将来最不常用的页。
LFU 最少访问页面算法:这个算法首先淘汰到当前为止,被访问次数最少的那一页。
NUR 最近最不经常使用算法:这个算法从那些最近一个时期内未被访问的页中任选一页淘汰。
三,数据库设计时通常需要遵守哪些范式,请列出并说明?
第一范式1NF,确保每一列不可再分,即原子性。
例如,顾客表(姓名,编号,地址),其中“地址”列还可以细分为国家,省等.
第二范式2NF,确保每一列都需要和和主键相关,且是完全依赖。
例如,订单表(订单编号,产品编号,订购日期,价格,….),“订单编号“为主键,产品编号和主键列没有直接的关系,即“产品编号”列不依赖于主键列,应删除该列。
第三范式3NF,区别每一列与主键直接相关而不是间接相关,不存在传递依赖。
例如,假设A,B和C的关系R的三个属性,如果A->B且B->C,则这些依赖函数中可以得出A->C。
第二部分,算法与程序设计题
1. 寻找一个单向链表的中项(中间项),如果存在两个则返回前一个。请给出算法描述和代码。
(1)快慢指针
2. 在由N个正整数的集合S中,找出最大元素C,满足C=A+B,其中A,B都是集合S中的元素,请给出算法和描述。
(2)先对数组哈希,然后再查找
3. 使用堆栈来模拟队列的功能,要求数据必须存储在堆栈内部。需要完成入队,出队,判空三个功能。给出单元测试。
(3)两个栈模拟队列
第三部分,系统设计题目