三次握手與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報文,表示重置,重新建立連接,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/27641.html
標籤:其他
上一篇:TCP三次握手有哪些漏洞?
下一篇:說下TCP的黏包?
