一,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)兩個棧模擬隊列
第三部分,系統設計題目