1. 程式人生 > >tcp connect函式的解釋

tcp connect函式的解釋

    如果是tcp套接字,呼叫connect函式將激發tcp的三路握手過程,而且僅在
連線成功或出錯時返回,其中出錯返回可能有以下幾種情況。
    1、若tcp客戶沒有收到SYN分節的響應,則返回ETIMEDOUT錯誤,舉例來說,呼叫
connect函式時,BSD核心傳送一個SYN,若無響應則等待6s在傳送一個,若仍無響應則等待
24s後再發送一個,若總共等了75s後仍未收到響應則返回本錯誤。
    2、若對客戶的SYN的響應是RST(表示復位),則表明該伺服器主機在我們指定的埠上
沒有程序在等待與之連線(例如伺服器程序也許沒在執行),這是一種硬錯誤(hard error),客戶
一接收到RST就馬上返回ECONNREFUSED錯誤。
       RST是TCP在發生錯誤時傳送的一種TCP分節,產生RST的三個條件是:目的地為某埠的SYN
到達,然而該埠沒有正在監聽的伺服器;tcp取消一個已有連線;tcp接收到一個根本不存在的連線
上的分節。
    3、若客戶發出的SYN在中間某個路由器上引發了一個"destination unreachable"(目的地不可達)
ICMP錯誤,則認為是一種軟錯誤,客戶主機核心儲存該訊息,並按照第一種情況中所述的時間間隔
繼續傳送SYN,若在某個規定的時間後仍未收到響應,則把儲存的訊息作為EHOSTTUNREACH錯誤返回給
程序。
    connect連線一個不存在的ip時,會超時返回,錯誤碼ETIMEDOUT
    connect連線一個存在的ip,但是並沒有一個相應的服務程序存在,則立即返回
    connect連線一個因特網不可達的ip地址,也是超時返回,錯誤碼ETIMEDOUT

    按照TCP狀態轉換圖,connect函式導致當前套接字從CLOSE狀態(該套接字從由socket函式建立以來
一直所處的狀態)轉移到SYN_SENT狀態,若成功則在轉移到ESTABLISHED狀態,若connect失敗則該套接字
不再可用,必須關閉,我們不能對這樣的套接字再次呼叫CONNECT函式,當迴圈呼叫函式connect為給定
主機嘗試各個ip地址有一個成功是,在每次connect失敗後,都必須close當前的套接字描述符並重新呼叫
socket。