網路程式設計一些重要的面試題

2021-09-16 13:18:18 字數 1072 閱讀 8617

為什麼需要三次握手?

答:三次握手的目的是「為了防止已經失效的連線請求報文段突然又傳到服務端,因而產生錯誤」,這種情況是:一端(client)a發出去的第乙個連線請求報文並沒有丟失,而是因為某些未知的原因在某個網路節點上發生滯留,導致延遲到連線釋放以後的某個時間才到達另一端(server)b。本來這是乙個早已失效的報文段,但是b收到此失效的報文之後,會誤認為是a再次發出的乙個新的連線請求,於是b端就向a又發出確認報文,表示同意建立連線。如果不採用「三次握手」,那麼只要b端發出確認報文就會認為新的連線已經建立了,但是a端並沒有發出建立連線的請求,因此不會去向b端傳送資料,b端沒有收到資料就會一直等待,這樣b端就會白白浪費掉很多資源。如果採用「三次握手」的話就不會出現這種情況,b端收到乙個過時失效的報文段之後,向a端發出確認,此時a並沒有要求建立連線,所以就不會向b端傳送確認,這個時候b端也能夠知道連線沒有建立。

問題的本質:通道是不可靠的,但是我們要建立可靠的連線傳送可靠的資料,也就是資料傳輸是需要可靠的。在這個時候三次握手是乙個理論上的最小值,並不是說是tcp協議要求的,而是為了滿足在不可靠的通道上傳輸可靠的資料所要求的。

為什麼需要四次揮手?

先了解什麼是tcp的socket程式設計中「全雙工的位元組流」?

全雙工:意味著tcp的收發是可以同時進行的。即接收的時候可以傳送,傳送的時候也可以接收,兩者互不衝突,可同時進行。

位元組:意味著,無論物理層或鏈路層收到的資料是否為乙個個二進位制位的資料,在tcp層接收到的資料一定是乙個個位元組。也就是說,我們在進行socket程式設計時,只需要考慮接收乙個個位元組,而不是乙個個位的資料。

流:意味著,socket的資料無頭無尾,就像流水一樣,如果從中間任意位置起,你無法知道乙個訊息包確切的開始或結束位置,除非從tcp的頭開始算起。

答:tcp是全雙公的,要實現可靠的連線關閉,a發出結束報文fin,收到b確認後a知道自己沒有資料需要傳送了,b知道a不再傳送資料了,自己也不會接收資料了,但是此時a還是可以接收資料,b也可以傳送資料;當b發出fin報文的時候此時兩邊才會真正的斷開連線,讀寫分開。

四次揮手牽扯到的狀態裝換。

待補充。。。

C C 程式設計 一些面試題

1 如何判斷程式是c程式還是cpp程式 根據巨集 cplusplus include using namespace std void main 2 c 和c的不同 3 引用和指標的區別 4 int id sizeof int const int a 5 int b a int c 5 const ...

一些面試題

q 您在什麼情況下會用到虛方法?它與介面有什麼不同?a 當在繼承類中想重寫某一方法時會用到虛方法 虛方法是類的成員函式,介面相當於抽象類.q override與過載有什麼區別?a override 就是覆蓋的意思,覆蓋父類的同名方法,而過載則是通過參數列來呼叫方法.q 值型別與引用型別有什麼區別?a...

一些面試題

1.如何檢視埠8080的程序 netstat anp grep 8080 lsof i 8080 2.在 tmp目錄下建立test.txt檔案,內容為 hello,world 用乙個命令寫出來。echo hello,world tmp test.txt 3.敘述下列服務的預設埠號。ftp 20,21...