一、tcp連線關閉的幾種方式:
1、「正常」關閉:呼叫close()關閉socket、沒close但程序正常結束(當然這是不應該的做法)、程序core掉、在shell命令列中kill掉程序,都可抽象成「正常」關閉。因為即使core掉,核心也會馬上幫應用程式**(close)socket檔案描述符。二、so_linger套介面選項「正常」關閉,預設情況下(非預設即設定linger下面會介紹),關閉端即客戶端tcp層會發fin包,對端即伺服器tcp層收到後,回ack,客戶端進入fin_wait2狀態。此時,tcp終止連線的4個分組中伺服器應該發的第3個分組fin包,其tcp層是不會主動發的,只有伺服器端socket「正常」關閉,才會發出這個fin包。至此,客戶端進入time_wait狀態。
2、「非」正常關閉:客戶端崩潰了,此時肯定發不出fin包了(當然啦,核心都沒機會幫應用程式**資源了)。這種情況,伺服器端有如下兩種情況:
a、伺服器send資料,因為客戶端已經崩潰,伺服器收不到ack自然會不停的重傳。源自
berkeley的重傳機制,重傳8次,相對第一次傳的15分鐘後仍沒收到ack,則返回
etimedout或ehostunreac錯誤。如果伺服器不理會這個錯誤,再次呼叫send,則
立馬返回broken pipe錯誤。
注:15分鐘超時可以在 /proc/sys/net/ipv4/tcp_retries2 中修改
b、 伺服器不發任何資料了,那只有靠應用層心跳檢測機制或keepalive,來發覺tcp斷連了。
a、l_onoff設定為0,這也是預設情況,函式close()是立即返回的,然後tcp連線雙方是通過
fin、ack4分組來終止tcp連線的。當然,傳送緩衝區還有資料的話,系統將試著將這些資料
傳送到對方。
b、l_onoff非0,l_linger設定0,函式close()立即返回,並傳送rst終止連線,傳送緩衝區的資料丟棄。
c、l_onoff非0,l_linger非0,函式close()不立即返回,而是在(a)傳送緩衝區資料傳送完並得到確認
(b)l_linger延遲時間到,l_linger時間單位為微妙。兩者之一成立時返回。如果在傳送緩衝區資料傳送
完並被確認前延遲時間到的話,close返回ewouldblock(或eagain)錯誤。
三、客戶端tcp連線「正常」關閉,伺服器的幾種情況:
情形客戶端l_onoff設定為0,
「正常」關閉
客戶端l_onoff非0,l_linger設定0,「正常」關閉
伺服器阻塞模式send,正阻塞在send函式未返回
客戶端tcp傳送fin,伺服器send函式返回成功(返回位元組數是實際拷貝到傳送緩衝區的位元組數)。客戶端傳送rst。如果伺服器再次呼叫send,將返回errno[32]:broken pipe
客戶端tcp傳送rst,伺服器函式返回成功(返回位元組數是實際拷貝到傳送緩衝區的位元組數)。若伺服器再次呼叫send,則返回-1,errno[104]:connection reset by peer。若再次呼叫send,則返回-1,errno[32]:broken pipe
伺服器空閒
客戶端tcp傳送fin,若伺服器沒理會而呼叫send,客戶端傳送rst,send返回-1,errno[32]:broken pipe
客戶端tcp傳送rst,若伺服器沒理會而呼叫send,send返回-1,errno[104]:connection reset by peer。若再次呼叫send,則返回-1,errno[32]:broken pipe
總之,1、收到對端rst後,仍然調入send(),則返回connection reset by peer,再次呼叫send(),則返回broken pipe
2、收到對端fin後,仍然調研哪個send(),直接返回broken pipe
關閉tcp連線
luolei localhost sudo netstat a grep ssh tcp 0 0 192.168.1.10 40278 com ssh established unix 2 acc stream listening 7565 tmp ssh uyvolk4882 agent.4882...
關閉TCP連線
從tcp協議角度來看,乙個已建立的tcp連線有兩種關閉方式,一種是正常關閉,即四次揮手關閉連線 還有一種則是異常關閉,我們通常稱之為連線重置 reset 首先說一下正常關閉時四次揮手的狀態變遷,關閉連線的主動方狀態變遷是fin wait 1 fin wait 2 time wait,而關閉連線的被動...
TCP 連線與關閉
一.tcp 協議 傳輸控制協議 transmission control protocol,tcp 是種面向連線 確保資料在端到端間可靠傳輸的協議。面向連線是插在傳送資料前,需要先建立一條虛擬的鏈路,然後讓資料在這條鏈路上 流動 完成傳輸。1 tcp 協議的報文頭 2 協議六個狀態位 連線協議相關的...