TCP如何能正常關閉連線?

2021-08-14 01:51:20 字數 1883 閱讀 5963

一、tcp連線關閉的幾種方式:

1、「正常」關閉:呼叫close()關閉socket、沒close但程序正常結束(當然這是不應該的做法)、程序core掉、在shell命令列中kill掉程序,都可抽象成「正常」關閉。因為即使core掉,核心也會馬上幫應用程式**(close)socket檔案描述符。

「正常」關閉,預設情況下(非預設即設定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斷連了。

二、so_linger套介面選項

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 協議六個狀態位 連線協議相關的...