一、tcp協議
1、tcp協議是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,採用全雙工通訊(full-duplex)。
2、雙工通訊(full-duplex):指通訊雙方都能在同一時刻進行傳送和接收操作,目前所有的交換機都支援雙工模式。
3 、半雙工方式( half duplex ) :指通訊雙方都能在同一時刻只能進行傳送或接收操作。
4、tcp狀態:syn, fin, ack, psh, rst, urg。
syn:表示建立連線
fin:表示關閉連線
ack:表示響應
psh:表示有 data資料傳輸
rst:表示連線重置
二、tcp的半開啟連線、半關閉狀態
tcp連線還有兩種特殊場景分別是半開啟(half-open)連線和半關閉(half-close)連線。由於tcp是乙個全雙工(full-duplex)協議,因此這裡的半連線"半"字就是相對於全雙工的"全"來說的。
1、半開啟連線
從協議定義的角度來說,tcp的半開連線是指tcp連線的一端異常崩潰,或者在未通知對端的情況下關閉連線,這種情況下不可以正常收發資料,否則會產生rst。比如乙個常見的情況是tcp連線的一端異常斷電,就會導致tcp的半開連線。如果沒有資料傳輸,對端就不會知道本端的異常而一直處於established狀態。
另外從linux實現的角度來說,因為linux內部有個半連線佇列(syns queue),tcp半開連線是指傳送了tcp連線請求,等待對方應答的狀態,此時連線並沒有完全建立起來,雙方還無法進行通訊互動的狀態,此時就稱為半連線。由於乙個完整的tcp連線需要經過三次握手才能完成,這裡把三次握手之前的連線都稱之為半連線。
2、半關閉連線
tcp的半關連線是指tcp連線只有一方傳送了fin,另一方沒有發出fin包,仍然可以在乙個方向上正常傳送資料。這種場景並不常見,一般來說berkeley sockets api呼叫shutdown()介面時候就會進入半關閉狀態(呼叫常規的close()一般是期待完整的雙向關閉這個tcp連線),shutdown()介面相當指示程式,本端已經沒有資料待傳送,所以我傳送乙個fin到對端,但是我仍然想要從對端接收資料,直到對端傳送乙個fin指示關閉連線為止。如下圖所示,在紅色背景文字框標註的資料傳輸場景下就是tcp的半關連線
三、三次握手和四次揮手
1、三次握手過程:
1、第一次握手:客戶端傳送syn包(syn=j)到伺服器,並進入syn_send狀態,等待伺服器確認
2、第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=j+1),同時也傳送乙個syn包(syn=k),即syn+ack包,此時伺服器進入syn_recv狀態;
3、第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=k+1),此包傳送完畢,客戶端和伺服器進入established狀態,完成三次握手。
2、為什麼三次握手:
因為最少可以通過三次握手檢測出接收和傳送端的是否能正常工作(還有一種說法是保證連線是雙工的)。客戶端簡稱為c,服務端簡稱為s,再次複習三次握手過程。
c向s發起建立連線請求:c——>s ,說明c的傳送是正常的
s收到c的傳送訊號,並且向c傳送確認資訊:s——>c,說明s的收和發均是正常的
c收到s的確認訊號,並向s傳送確認訊號:c——>s,說明c的傳送是正常的
這樣通過三次握手就可以保證連線是正常的。注意這裡並不能保證tcp連線的可靠性,可靠性與tcp的重連機制有關。
3、四次揮手
第一次揮手:主動關閉方傳送乙個fin,用來關閉主動方到被動關閉方的資料傳送,也就是主動關閉方告訴被動關閉方:我已經不 會再給你發資料了(當然,在fin包之前傳送出去的資料,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些資料),但是,此時主動關閉方還可 以接受資料。
第二次揮手:被動關閉方收到fin包後,傳送乙個ack給對方,確認序號為收到序號+1(與syn相同,乙個fin占用乙個序號)。
第三次揮手:被動關閉方傳送乙個fin,用來關閉被動關閉方到主動關閉方的資料傳送,也就是告訴主動關閉方,我的資料也傳送完了,不會再給你發資料了。
第四次揮手:主動關閉方收到fin後,傳送乙個ack給被動關閉方,確認序號為收到序號+1,至此,完成四次揮手。
那為什麼需要四次揮手呢?請看如下過程:
a向b發起請求,表示a沒有資料要傳送了:a——>b;
b向a傳送訊號,確認a的斷開請求請求:b——>a;
b向a傳送訊號,請求斷開連線,表示b沒有資料要傳送了:b——>a;
a向b傳送確認訊號,同意斷開:a——>b。
b收到確認訊號,斷開連線,而a在一段時間內沒收到b的訊號,表明b已經斷開了,於是a也斷開了連線。至此,完成揮手過程。
可能有捧油會問,為什麼2、3次揮手不能合在一次揮手中?那是因為此時a雖然不再傳送資料了,但是還可以接收資料,b可能還有資料要傳送給a,所以兩次揮手不能合併為一次。
揮手次數比握手多一次,是因為握手過程,通訊只需要處理連線。而揮手過程,通訊需要處理資料+連線。
TCP IP 三次握手和四次揮手
作用 建立tcp連線 1.三次握手是客戶端先發起請求到伺服器,此時伺服器處於listen監聽狀態,a會先傳送乙個連線請求的報文 syn 1,ack 0,seq x 這個包也稱為syn包,當客戶端傳送完syn包後,就進入syn sent狀態。2.伺服器b收到報文後,如果確認要與a建立tcp連線,要回覆...
TCP IP三次握手 四次揮手
一 tcp ip三次握手原理 建立連線協議 三次握手 1 客戶端向伺服器端傳送連線請求包syn syn j 等待伺服器回應 2 伺服器端收到客戶端連線請求包syn syn j 後,將客戶端的請求包syn syn j 放入到自己的未連線佇列,此時伺服器需要傳送兩個包給客戶端 1.向客戶端傳送確認自己收...
TCP IP三次握手 四次揮手
我們在使用網際網路和別的 進行通訊的時候,都要依賴tcp ip協議。甚至有時候網不太好,瀏覽器會顯示當前狀態 正在與某某 握手.當網路狀態很好的時候,就會一閃而過。本文將詳細總結筆者在學習三次握手四次揮手時的各個狀態以及過程。首先,狀態圖如下。初始時,客戶端和服務端都是closed狀態。這時,客戶端...