在高並發短連線的server端,當server處理完client的請求後立刻closesocket此時會出現time_wait狀態然後如果 client再併發2000個連線,此時部分連線就連線不上了,用linger強制關閉可以解決此問題,但是linger會導致資料丟失,linger值 為0時是強制關閉,無論併發多少多能正常連線上,如果非0會發生部分連線不上的情況!(可呼叫setsockopt設定套接字的linger延時標誌,同時將延時時間設定為0。)
tcp/ip的rfc文件。time_wait是tcp連線斷開時必定會出現的狀態。
是無法避免掉的,這是tcp協議實現的一部分。
在windows下,可以修改登錄檔讓這個時間變短一些
time_wait的時間為2msl,預設為4min.
你可以通過改變這個變數:
tcptimedwaitdelay
把它縮短到30s
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...