在三次握手和四次揮手協議中,客戶端和服務器端各用到什么函數?


三次握手與accept()函數的關系?

  1、客戶端發送SYN給服務器。

  2、服務器發送SYN+ACK給客戶端。

  3、客戶端發送ACK給服務器。

  4、連接建立,調用accept()函數獲取連接。

在三次握手和四次揮手協議中,客戶端和服務器端各用到什么函數?(這里涉及到底層的socket知識)

Socket server 和client通信流程圖:

        

Socket 三次握手連接圖:

       

  從圖中可以看出,當客戶端調用connect()函數時,觸發了連接請求,向服務器發送了SYN J 包,這時connect進入阻塞狀態(先調用connect()函數,然后發送SYN包);服務器監聽到連接請求,即收到SYN J包,調用accept()函數接收請求(先收到SYN包,然后調用accept()函數),向客戶端發送SYN K,ACK J+1,這時accept進入阻塞狀態;客戶端收到服務器的SYN K,ACK J+1之后,這時connect返回,並對SYN K進行確認;服務器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立。

  總結:客戶端的connect()函數在三次握手的第二次之后返回,而服務器端的accept()在三次握手的第三次后返回。

Socket 四次揮手斷開連接圖:

       

  注意,read()返回0就表明收到了FIN段。

函數:

socket() --創建套接字,它會創建一個結構體及收發緩沖區。此時並不指定該套接字在哪個IP和PORT口上。

bind() --用於將套接字綁定在特定的IP和PORT上。

listen(SOCKET s,int backlog) --用於為偵聽端口創建兩個隊列,用於接收用戶端的SYN請求,偵聽客戶端的socket連接請求。backlog指的就是已經完成握手了的隊列的大小。

accept() -- 將偵聽端口中的ESTABLISHED隊列中取出那些連接。accept函數返回的是已建立連接的套接字描述符,包括客戶端的IP和PORT信息,服務器的IP和PORT信息。

connect() -- 客戶端連接請求。

read() -- 負責從fd中讀取內容。當讀成功時,read返回實際所讀的字節數,如果返回的值是0表示已經讀到文件的結束了,小於0表示出現了錯誤。

write() -- 將buf中的nbytes字節內容寫入文件描述符fd。成功時返回寫的字節數。

listen的真正目的?

  listen的函數為偵聽端口創建兩個隊列:未完成隊列(SYN_RCV狀態)和已完成隊列。如果不調用listen,則客戶端過來的SYN請求無法入隊接受進一步的處理。因此,listen是服務器的必須過程。

如果客戶端發起握手請求,服務端無法立刻建立連接應該回應什么?

  RST報文,表示重置,重新建立連接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM