tcp中的連線和斷開可以說是在面試中經常被問到的問題之一,正好有空就總結一下,首先回顧一下tcp的相關知識點
我們知道tcp是運輸層的面向連線的可靠的傳輸協議。面向連線的,指的就是在兩個程序傳送資料之前,必須先相互「握手」,確保兩程序可以進行連線。並且這個傳輸是點對點的,即乙個tcp連線中只有乙個傳送方和接收方;可靠的,指的是在任何網路情況下,在tcp傳輸中資料都將完整的傳送到接收方。
序號:乙個報文段的序號是整個傳送的位元組流序列,而不是該報文段的序列
資料偏移:指tcp首部的長度,可變。預設長度為20位元組
視窗:用於流量控制,用於指示接收方願意接受的位元組數量
標誌字段:
連線是資料傳輸雙方的契約,在設計上,連線是一種傳輸資料的行為,具體來說,資料收發雙方的記憶體中都建立乙個用於維護資料傳輸狀態的物件,比如tcp 的連線組成包括一台主機上的快取、變數和與程序連線的套接字,以及另外一台主機上的快取、變數和與程序連線的套接字。(由埠號和ip位址組成)所以連線是網路行為狀態的記錄
總結而言,會話是應用層的概念,連線是傳輸層的概念,正是因為如此,在 tcp 連線的時候需要握手建立連線。
也就是報文段的標誌欄位的含義和功能:
如圖,開始時,兩個埠都是出於closed狀態,當伺服器端口變成listen時,監聽埠,是否有資料傳來。
第一步:客戶端向服務端傳送乙個特殊的tcp報文段。客戶端進入syn_sent狀態這個報文段有以下特點:
第二步:伺服器端收到上步客戶端的報文段後,同時為該tcp連線分配tcp快取和變數,並向該客戶傳送允許連線的報文段。伺服器進入syn_rcvd狀態,這個報文段特點有:
第三步:客戶端收到上步服務端的報文段後,客戶端為該連線分配快取和變數,同時客戶端向伺服器端傳送報文段,這個報文端特點有:
兩端進入established狀態,連線建立
若客戶端決定要關閉該連線(伺服器端也可以發起關閉)
第一次:客戶端傳送帶有fin被置為1的報文段,進入fin_wait_1狀態,並等待乙個來自伺服器的帶有確認的tcp報文段。
第二次:伺服器端收到該報文段後,向客戶端傳送乙個確認ack報文段,進入close_wait狀態。
第三次:伺服器端處理完資料後向客戶端傳送fin被置為1的報文段,進入last_ack狀態。
第四次:客戶端收到伺服器端的fin報文段後,向伺服器端傳送乙個確認ack報文段,進入time_wait狀態,伺服器接收到該ack報文段後關閉,客戶端在經過2msl(與具體實現有關,典型值是20s、1分鐘或2分鐘)等待後關閉。
可以通過四個變數來確定唯一的tcp連線:源位址、源埠、目標位址、目標埠來唯一確定乙個tcp連線。其中源位址和目標位址的字段在ip頭部,作用是通過ip協議傳送報文給哪個主機;源埠和目標埠是在tcp首部,作用是通過tcp協議傳送主機中的哪個程序。
兩者的區別
應用場景
tcp用於需要保證可靠性資料交付的場景,比如ftp、http
為什麼tcp連線建立過程中不是兩次或者四次,三次就是最優解了嗎?首先來看看兩次握手建立連線會發生什麼。
兩次握手
如果連線過程是兩次握手來建立,在理想的網路環境下是可以完成通訊建立的,但是現實的網路環境很複雜,有時候會導致歷史的報文段比新的報文段先到達伺服器端,這時,如果沒有第三次握手,就會造成無法同步序列號情況的發生。舉個例子,客戶端傳送新syn報文段的序號是100,網路環境中有舊的syn報文端的序號是80,然而現在舊的先到達伺服器端,那麼伺服器端則會返回乙個確認號為81的syn+ack報文段,這個時候客戶端接收到的報文段和預期報文段會不一致,就會造成無法同步序列號,達不到tcp可靠運輸的效果,也會浪費資源。那麼如果有第三次握手,這時客戶端會反饋乙個rst報文段,終止這次連線,等待新的syn到來,這樣保證資料的可靠性傳輸。
四次握手
四次握手可以對比四次揮手,客戶端和伺服器端都要分別傳送syn和ack報文段,來表示之前的syn報文已經被成功接收。
然而四次握手可以簡化成三次,第
二、三次可以優化成一次。所以三次是保證可靠性傳輸連線的最優解。
syn泛洪攻擊通過傳送大量的tcp syn報文段,而不完成第三次握手的步驟。因為大量的syn報文段的傳送,伺服器不斷為這些半開連線分配資源,導致伺服器的連線資源被消耗殆盡。
如何避免,現在有一種有效的防禦系統,稱為syn cookie,它是這樣工作的:
四次揮手中雙方傳送了fin報文段,所以在客戶端傳送fin後,伺服器端接收到後首先會回乙個ack應答報文,因為此時伺服器端可能還有資料沒傳送完,所以在服務端資料處理完後,才傳送fin報文段給客戶端表示現在可以關閉連線。正是因為這個等待過程,使得比三次握手多一次。
tcp有乙個機制是保活機制:定義在乙個時間段內,如果沒有任何連線相關的活動,tcp保活機制則開始作用,每隔乙個時間間隔會傳送乙個探測報文,該探測報文包含的資料很少,如果連續幾個探測報文都沒有得到響應,說明該tcp連線已經死亡。
客戶端的故障也分為這幾種:
首先要說明,只有主動發起關閉連線的一方才會有time_wait狀態,那麼為什麼會有time_wait狀態,這時因為在服務端關閉後,可能還會有其他的資料報未到達客戶端,所以需要再等待一段時間。一般這個時間是2msl時間,也就是報文段在兩端傳輸的最大往返時間。
time_wait狀態太多也會導致占用過多的埠資源,會導致無法建立新的連線
tcp 四次揮手 TCP的三次握手和四次揮手
三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...
TCP三次握手和四次揮手
一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...
TCP三次握手和四次揮手
三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...