TCP三次握手

有兩臺機器,A是客戶端(主動發起請求的人),B是服務器端(被動接受請求的人),客戶端A剛開始沒有人和他通訊,所以客戶端A的狀態是CLOSDE(關閉的),服務器端B剛開始的狀態也是CLOSDE,但是總有人去訪問他,所以服務器端B開啟了LISTEN(收聽)狀態。
(1)假設A機器想鏈接B機器了,他就會向B機器發送一個建立鏈接的請求,這個建立鏈接請求叫SYN=1,因為要發送一個數據包給B,這個包在A機器里的編號為X,所以seq=x,發送過去之后,A從CLOSED狀態轉換為SYN-SENT(同步已發送)狀態。
(2)A發送過去,B立馬就會回應,也會發送一個建立鏈接的請求,SYN=1(因為B和A以前也沒通訊過,要請求和A通訊),B同意了A的建立鏈接,所以ACK=1,因為B要向A發送一個數據包,這個數據包在B機器里的編號剛好是y,所以seq=y,又因為B確認收到A發送的第X個包,所以B希望收到的下一個包是第x+1個包,所以ack=x+1。發送之后B有LISTEN狀態轉換為SYN-RCED(同步已收到)狀態。
(3)B向A發送了請求,A也會立馬回應,同意了B的建立鏈接,所以ACK=1,A向B發送的是第x+1個包,所以seq=x+1,而A確認收到了B發送的第y個包,希望收到第y+1個包,所以ack=y+1。之后A,B就建立了連接,可以進行數據通訊了,AB的狀態也都轉換為ESTAB-LISHED(已建立鏈接)狀態。
即使三次握手也有安全隱患,假如A向B發送一個請求,正常來說,B立刻回應,B回應之后并不會馬上釋放資源,他要等著A回第三次回應,B在等待的過程中會在計算機的內存中記錄A發來的請求和自己的回應,假如A發來的是個惡意的請求,一直發第一次請求,而不去發第三次回應,結果造成B把資源都浪費在記錄A發送來的第一次請求和自己的回應上面,而遲遲等不來A的第三次回應,導致最終系統所有的資源耗盡,那么B機器對外就不能進行正常訪問了。
TCP四次揮手

客戶端和服務器端通訊完之后,雙方要結束通訊,這就要進行TCP的四次揮手。揮手請求,客戶端和服務器端都可以發出。
(1)假如客戶端A發出揮手請求(關閉連接),這個揮手請求就是FIN=1,seq=u表示A向B發送一個數據包,這個數據包在A機器里編號為u。A發送完之后就會進入FIN-WAIT1(終止等待)狀態。
(2)B接收到A發送的揮手請求之后會立刻回應,確認收到A發送來的揮手請求ACK=1,seq=v表示B向A發送一個數據包,這個數據包在B機器里的編號為v。B確認收到了A發來的第u個包,希望收到的下一個包為第u+1個包,所以ack=u+1。一旦B發送了這個回應之后就馬上進入CLOSE-WAIT(關閉等待)狀態。而A收到了B的回應之后就會進入TIN-WAIT2(終止等待)狀態。
(3)B發出回應只是說明收到了A的揮手請求并不代表同意A揮手請求,有可能B還沒傳完數據,接著B會傳送一些后續的數據包,傳送完之后,B也覺得通訊該結束了,就同意了A的揮手請求,接著B也會給A發送一個揮手請求FIN=1,并且同意了A的揮手請求ACK=1,seq=w表示B向A發送一個數據包,這個數據包在B機器里的編號為w。B確認收到了A發來的第u個包,希望收到的下一個包為第u+1個包,所以ack=u+1。B發送揮手請求之后,就會進入LAST-ACK(最后確認)狀態。
(4)A收到B發送的揮手請求之后馬上回應B,確認收到了B的揮手請求ACK=1,向B發送的數據包編號為u+1,確認收到了B發送的第w個包,希望收到下一個包為第w+1個包。A發送完之后就會進入TIME-WAIT(時間等待)狀態,要等待2MSL(最長數據的傳輸時間),之后就會進入CLOSED狀態。而B收到了A的回應之后就會進入CLOSED狀態。
有限狀態機FSM:Finite State Machine
CLOSED 沒有任何連接狀態
LISTEN 偵聽狀態,等待來自遠方TCP端口的連接請求
SYN-SENT 在發送連接請求后,等待對方確認
SYN-RECEIVED 在收到和發送一個連接請求后,等待對方確認
ESTABLISHED 代表傳輸連接建立,雙方進入數據傳送狀態
FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認
FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求
TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失
CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,并已確認
LAST-ACK 被動關閉,等待最后一個關閉傳輸連接確認,并等待所有分組消失
CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認
原創文章,作者:fuming,如若轉載,請注明出處:http://www.www58058.com/85723