三次握手和四次揮手以及對應實現的API

2021-08-21 13:22:54 字數 2546 閱讀 2030

一、三次握手

圖1  tcp的三次握手

在上圖中需要注意幾點:

1、序列號:其範圍在0~(2**32-1)之內,並且可迴圈利用,用以確定資訊是安全且有序的傳送。

2、ack存在的意義在於:確定是安全連線,序號未被劫持。

圖2  網路變成核心api

結合圖一和圖二,有以下幾點需要注意:

1、connect觸發三次握手

#include#includeint connect(int sockfd, const struct sockaddr*serv_addr,socklen_t  addrlen);
第乙個引數 int sockfd確定了自身的ip和port,第二個引數 const struct sockaddr*serv_addr 告訴客戶端伺服器的ip和port。

2、能否自定義ip/port?

通過bind函式,可以進行ip和port的設定。

3、阻塞與非阻塞的區別?

阻塞與非阻塞的產生都需要兩個條件:一是系統呼叫;二是資源沒有準備好。不同之處在於非阻塞在產生系統系統呼叫之後直接返回錯誤,而阻塞情況會一直在等待,直到資源準備好為止。

4、api 阻塞與否的原因分析。

(1)listen():為普通函式。原因在於核心為任何乙個給定的監聽套接字維護兩個佇列,即半連線佇列(syn請求連線的報文已有某個客戶傳送到達伺服器,而伺服器正在等待完成相應的tcp三次握手過程,這些套接字處於syn_rcvd狀態)和全連線佇列(每個已經完成tcp三次握手的客戶,這些套接字處於established狀態)。因此,沒有等待資源的過程,所以屬於普通函式。除此之外,該函式完成三次握手的第二次回包過程。

圖3  tcp三次握手和監聽套接字的兩個佇列

q1:listen函式是否能實現非阻塞或阻塞函式,若能,論述其優缺點?

a:若listen為阻塞函式,則回包過程需要不斷的在核心態和使用者臺之間切換,對於伺服器而言是很大的開銷。若listen為非阻塞函式,該函式完成三次握手的第二次回包過程。回包的過程是由核心來做,避免了使用者態和核心態的切換,減輕伺服器的開銷。

q2:socket()、bind()、listen()在tcp協議棧內能否實現為乙個api?

(2)accept():用於從已完成連線佇列頭部返回下乙個已完成連線,如果已完成連線隊列為空,那麼程序就投入睡眠(假定套接字為預設的阻塞方式)。如果accept成功,那麼其返回值是由核心自動生成的乙個全新描述符,代表與所返回客戶的tcp連線。

q:accept為阻塞函式的原因?

a:若accept()為非阻塞函式的話,每出現乙個連線,就會進行一次呼叫,在多次呼叫中這些連線並未全部建立好,會造成資源的浪費。

二、四次揮手

圖4  四次揮手

q1:觸發四次揮手的函式及其執行邏輯?

a:close()觸發四次揮手。close 乙個套接字的預設行為是把套接字標記為已關閉,然後立即返回到呼叫程序,該套接字描述符不能再由呼叫程序使用,也就是說它不能再作為read或write的第乙個引數,然而tcp將嘗試傳送已排隊等待傳送到對端的任何資料,傳送完畢後發生的是正常的tcp連線終止序列。

在多程序併發伺服器中,父子程序共享著套接字,套接字描述符引用計數記錄著共享著的程序個數,當父程序或某一子程序close掉套接字時,描述符引用計數會相應的減一,當引用計數仍大於零時,這個close呼叫就不會引發tcp的四路握手斷連過程。    

q2:connect()是否為阻塞函式?

a:connect()為阻塞函式,其等待三次握手。

q3:accept(sockfd,struct sockaddr *addr,addrlen)第二個引數的作用?

q4:accept返回的fd與listen返回的fd是否為乙個fd?

a:首先,listen後,是肯定占用了對應的埠號的,任何別的嘗試使用該埠的操作肯定會報錯,accept返回的fd若占用新的埠號,則接下來的讀寫操作無法進行。而這兩個fd的五元組是通過遠端的客戶端的ip和port不同而加以區分的。

q5:返回的檔案描述符上限是多少,如何調整上限。

a:為系統能達到的檔案描述符的上限(預設是1024)減3,(0,1,2為系統占用,分別代表標準輸入,標準輸出和標準錯誤檔案),該最大值可以通過命令ulimit來實現調整。

q6:accept()返回的檔案描述符的上限取決於全連線佇列的上限?

a:並不是。(待解決)

q7:處理百萬連線必須準備的有哪些?

a:1、listen的兩個連線佇列盡可能大;2、accept返回的個數盡可能多;3、連線五元組盡量使核心記憶體消耗到最低、。

三次握手和四次揮手

三次握手和四次揮手如圖所示 為什麼是三次握手而不是兩次 因為當客戶端第傳送syn到服務端的時候,如果有幾次請求是因為網路等原因延時等情況的時候,如果沒有第三次握手的確定。服務端就會認為客戶端重寫傳送請求了,就會去開啟連線相應。為什麼關閉連線的時候是四次握手而不是三次?當客戶端傳送請求關閉連線的時候,...

三次握手和四次揮手

tcp三次握手和四次揮手的全過程 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線 位碼即tcp標誌位,有6種表示 syn synchronous建立連線 ack acknowledgement 表示響應 確認 psh push表示有data資料傳輸 fin fi...

三次握手和四次揮手

1.在學習tcp協議的時候,總是在強調三次握手,那麼為什麼是三次?而不是兩次或者四次?強迫症表示黑人問號?今天我們就來分析一下為什麼是三次,下圖是一次tcp通訊的時序 在這個例子中,首先客戶端主動發起連線 傳送請求,然後伺服器端響應請求,然後客戶端主動關閉連線。兩條豎線表示通訊的兩端,從上到下表 示...