?
目錄
一. 由進程崩潰引起的連接斷開
二. 由關機引起的連接斷開
三. 由斷電引起的連接斷開
四. 由網線斷開引起的連接斷開
一. 由進程崩潰引起的連接斷開
?在一般情況下,進程無論是正常結束,還是異常崩潰,都會觸發回收文件資源,關閉文件的操作(四次揮手)
也就是說即使進程崩潰了,但是操作系統內核還在運行,會執行后續的關閉行為(四次揮手)
進程崩潰,實際上和正常的四次揮手正常結束,沒有區別,操作系統內核中保存著連接信息,完成后續的揮手過程
二. 由關機引起的連接斷開
?當執行關機操作,就會強制終止所有的進程(強殺進程),終止進程那么就會觸發四次揮手
關機操作,不會立即殺死進程,而是有一個很短暫的過程,在這個過程中,會執行四次揮手,可能四次揮手執行完,也可能沒有執行完,但是最起碼能發送一個FIN數據報給服務器
1)完成四次揮手
如果在這個短暫的時間內,四次揮手執行完畢,那么客戶端和服務器都能正確的刪除保存的連接信息
2)只發送了FIN報文
如果客戶端只發送了FIN報文,意味著告訴了對方,這邊要結束了,服務器返回ACK報文,客戶端接收不到,并且發送FIN報文,但是發送的FIN報文等不到ACK應答報文,服務器收不到ACK報文,肯定會進行重傳(超時重傳),當重傳幾次之后,發現還是接受不到,那么就會單方面釋放連接信息
客戶端關機清除了對端的連接信息,服務器持續接收不到ACK報文,單方面釋放連接信息
三. 由斷電引起的連接斷開
?由斷電原因,電腦瞬間關機,肯定連發送FIN報文的機會都沒有,這時候就要分類討論
1)斷電方是接收方
?如果斷電方是服務器,發送方在發送數據的時候,會發現接收方沒有返回ACK應答報文,這時候會進入超時重傳狀態,重傳幾次之后,發現沒有用,那么就會嘗試“復位連接”(RST置為1),會清除原來TCP連接中的數據,重新嘗試建立連接,多次嘗試,沒有用,最后徹底丟棄掉對方的信息
2)斷電方是發送方
?由于接收方本身就是處于阻塞等待,等待發送方發送數據,如果長時間沒有接收到消息,接收方需要判斷發送方是沒有消息發送,還是掛了?如果掛了,還處于阻塞等待,就是浪費資源
所以如果長時間沒有收到消息,接收方會發送一個“心跳包”,判斷接收方的狀態
?心跳包:不攜帶載荷的特殊數據包,具有周期性的特點,如果沒有返回ACK那么就認為掛了,本端也會嘗試復位,如果沒用會徹底丟棄對端信息
四. 由網線斷開引起的連接斷開
由于網線斷開,客戶端服務器都無法發送或接收任何數據包,這種情況就是斷電兩種情況的結合
這時候雙方都會以為是自己的問題,都會嘗試發送數據,但是都收不到ACK應答報文,都會進入超時重傳狀態,嘗試幾次,還是無法收到消息,會嘗試復位連接,一直嘗試沒有用,最后會徹底丟棄掉對方的信息
TCP和UDP的應用場景?
- 如果追求可靠傳輸,那么首選TCP
- 如果傳輸的數據包很大,那么首選TCP
- 如果追求傳輸速率,對可靠性要求不高,那么首選UDP