socket中的TIME WAIT狀態

2021-09-30 15:02:39 字數 1172 閱讀 9842

tcp要保證在所有可能的情況下使得所有的資料都能夠被投遞。當你關閉乙個socket時,主動關閉一端的socket將進入time_wait狀態,而 被動關閉一方則轉入closed狀態,這的確能夠保證所有的資料都被傳輸。當乙個socket關閉的時候,是通過兩端互發資訊的四次握手過程完成的,當一 端呼叫close()時,就說明本端沒有資料再要傳送了。這好似看來在握手完成以後,socket就都應該處於關閉closed狀態了。但這有兩個問題, 首先,我們沒有任何機制保證最後的乙個ack能夠正常傳輸,第二,網路上仍然有可能有殘餘的資料報(wandering duplicates),我們也必須能夠正常處理。

通過正確的狀態機,我們知道雙方的關閉過程如下:

假設最後乙個ack丟失了,伺服器會重發它傳送的最後乙個fin,所以客戶端必須維持乙個狀態資訊,以便能夠重發ack;如果不維持這種狀態,客戶端在接 收到fin後將會響應乙個rst,伺服器端接收到rst後會認為這是乙個錯誤。如果tcp協議能夠正常完成必要的操作而終止雙方的資料流傳輸,就必須完全 正確的傳輸四次握手的四個節,不能有任何的丟失。這就是為什麼socket在關閉後,仍然處於 time_wait狀態,因為他要等待以便重發ack。

如果目前連線的通訊雙方都已經呼叫了close(),假定雙方都到達closed狀態,而沒有time_wait狀態時,就會出現如下的情況。現在有乙個 新的連線被建立起來,使用的ip位址與埠與先前的完全相同,後建立的連線又稱作是原先連線的乙個化身。還假定原先的連線中有資料報殘存於網路之中,這樣 新的連線收到的資料報中有可能是先前連線的資料報。為了防止這一點,tcp不允許從處於time_wait狀態的socket建立乙個連線。處於 time_wait狀態的socket在等待兩倍的msl時間以後(之所以是兩倍的msl,是由於msl是乙個資料報在網路中單向發出到認定丟失的時間, 乙個資料報有可能在傳送圖中或是其響應過程中成為殘餘資料報,確認乙個資料報及其響應的丟棄的需要兩倍的msl),將會轉變為closed狀態。這就意味 著,乙個成功建立的連線,必然使得先前網路中殘餘的資料報都丟失了。

由於time_wait狀態所帶來的相關問題,我們可以通過設定so_linger標誌來避免socket進入time_wait狀態,這可以通過傳送rst而取代正常的tcp四次握手的終止方式。但這並不是乙個很好的主意,time_wait對於我們來說往往是有利的。

socket中so error的處理

當套介面上發生錯誤時,源自berkeley的核心中的協議模組將此套介面的名為so error的變數設為標準的unix e 值中的乙個,它稱為此套介面的待處理錯誤 pending error 核心可立即以以下兩種方式通知程序 1.如果程序阻塞於次套介面的select呼叫,則無論是檢查可讀條件還是可寫條...

C 中Socket的運用

原文 http hi.baidu.com eleven 5f2020 blog item 8217de2e8a8c093a359bf763.html c 中socket的運用 2010 08 31 12 01 流的說明 資料的傳輸都會用到流,一般的檔案如文字 等,可以運用filestream類來完成...

VC中的socket程式設計

基於tcp的socket程式設計 伺服器端程式 1 建立socket 2 將套接字繫結到乙個本地位址和埠上 bind 3 將套接字設為監聽模式,準備接受客戶請求 listen 4 等待客戶請求到來 當請求到來後,結合搜此次連線的套接字 accept 5 用返回的套接字和客戶端進行通訊 send re...