1. 求教高手計算機網路題:tcp協議是採用三次握手的方式來建立和撤銷連接的,判斷對錯
對!
三次握手,四次揮手
在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。 第一次握手:建立連接時,客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認; 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態; 第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
2. 計算機網路——TCP三次握手四次揮手
用戶進程和伺服器進程需要完成一次通信都需要完成 三個階段 : 連接建立、數據傳送、連接釋放
參考:三次握手和四次揮手
首先先明確幾個概念:
序列號seq(4B) :用來標記數據段的順序,TCP把連接中發送的所有數據位元組都編上一個序號,第一個位元組的編號由本地隨機產生,給位元組編上序號後,就給每一個報文段指派一個序號, 序列號seq就是這個報文段中的第一個位元組的數據編號 。
確認號ack(4B) : 期待收到對方下一個報文段的第一個數據位元組的序號 ,序列號表示報文段攜帶數據的第一個位元組的編號,而確認號指的是期望接受到下一個位元組的編號,因此擋牆報文段最後一個位元組的編號+1即是確認號。
確認ACK(1bit) :僅當ACK=1,確認號欄位才有效。ACK=0,確認號無效。
同步SYN : 連接建立時 用於同步序號。SYN=1表示這是一個連接請求,或連接接收報文,SYN這個標志位只有在TCP建立連接才會被置為1,握手完成後SYN標志位被置為0.當SYN=1,ACK=0表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使用SYN=1,ACK=1
終止FIN :用來釋放一個連接。
B的TCP伺服器進程先創建傳輸控制塊TCB,准備接受客戶進程的連接請求。然後伺服器進程就處於LISTEN(收聽)狀態,等待客戶的連接請求。若有,則作出響應。
1)第一次握手:A首先向B發一個SYN (Synchronize) 標記的包,告訴B請求建立連接,一個 SYN包就是僅SYN標記設為1的TCP包(參見TCP包頭Resources), SYN=1的報文段不能攜帶數據 ,但要 消耗掉一個序號, 此時TCP客戶進程進入SYN-SENT(同步已發送)狀態。
2)第二次握手:B收到後會發一個對SYN包的確認包(SYN/ACK)回去,表示對第一個SYN包的確認,並繼續握手操作.注意: SYN/ACK包是僅SYN 和 ACK 標記為1的包。在確認報文段中,測試TCP伺服器進程進入SYN-RCVD(同步收到)狀態;
3)第三次握手:TCP客戶進程收到B的確認後,要向B給出確認報文段,ACK報文段可以攜帶數據,不攜帶數據則不消耗序號。TCP連接已經建立,A進入ESTABLISHED(已建立連接)。
當B收到A的確認後,也進入建立連接狀態。
序列號和確認號的關系:
第一次握手序列號seq=x;
第二次握手序列號seq=y,確認號ack=x+1;
第三次握手序列號seq=x+1,確認號ack=y+1;
序列號seq是上一次的確認號,而確認號是上一次的序列號+1;這是因為SYN=1的報文段不能攜帶數據,但要消耗掉一個序號,所以下一個報文段要+1;
為了防止已經失效的連接請求報文段突然又傳到服務端,因而產生錯誤」,這種情況是:一端(client)A發出去的第一個連接請求報文並沒有丟失,而是因為某些未知的原因在某個網路節點上發生滯留,導致延遲到連接釋放以後的某個時間才到達另一端(server)B。本來這是一個早已失效的報文段,但是B收到此失效的報文之後,會誤認為是A再次發出的一個新的連接請求,於是B端就向A又發出確認報文,表示同意建立連接。如果不採用「三次握手」,那麼只要B端發出確認報文就會認為新的連接已經建立了,但是A端並沒有發出建立連接的請求,因此不會去向B端發送數據,B端沒有收到數據就會一直等待,這樣B端就會白白浪費掉很多資源。如果採用「三次握手」的話就不會出現這種情況,B端收到一個過時失效的報文段之後,向A端發出確認,此時A並沒有要求建立連接,所以就不會向B端發送確認,這個時候B端也能夠知道連接沒有建立。(知乎上對上面的解釋的評論:這個解答不是問題的本質,這個課本很多知識比較片面。問題的核心在於保證信道數據傳輸的可靠性,避免資源浪費僅僅是一個小的弱原因,不重要。)
從客戶端到服務端釋放連接的過程中,需要四次報文傳輸。
TCP四次揮手過程
1)A的應用進程先向其TCP發出連接釋放報文段(FIN=1,序號seq=u),並停止再發送數據,主動關閉TCP連接,進入FIN-WAIT-1(終止等待1)狀態,等待B的確認。
2)B收到連接釋放報文段後即發出確認報文段,(ACK=1,確認號ack=u+1,序號seq=v),B進入CLOSE-WAIT(關閉等待)狀態,此時的TCP處於半關閉狀態,A到B的連接釋放。
3)A收到B的確認後,進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文段。
4)B沒有要向A發出的數據,B發出連接釋放報文段(FIN=1,ACK=1,序號seq=w,確認號ack=u+1),B進入LAST-ACK(最後確認)狀態,等待A的確認。
5)A收到B的連接釋放報文段後,對此發出確認報文段(ACK=1,seq=u+1,ack=w+1),A進入TIME-WAIT(時間等待)狀態。此時TCP未釋放掉,需要經過時間等待計時器設置的時間2MSL後,A才進入CLOSED狀態。
大概就是A和B:
A:「我不和你說話了」
B:「知道了」
此時A單方面不和B說話,當B也沒有話對A說的時候
B:「我也不和你說話了」
A:「好的」
兩個人互相不說話了
TCP四次揮手總結
客戶端發送FIN後,進入終止等待狀態,伺服器收到客戶端連接釋放報文段後,就立即給客戶端發送確認,伺服器就進入CLOSE_WAIT狀態,此時TCP伺服器進程就通知高層應用進程,因而從客戶端到伺服器的連接就釋放了。此時是「半關閉狀態」,即客戶端不可以發送給伺服器,伺服器可以發送給客戶端。
此時,如果伺服器沒有數據報發送給客戶端,其應用程序就通知TCP釋放連接,然後發送給客戶端連接釋放數據報,並等待確認。客戶端發送確認後,進入TIME_WAIT狀態,但是此時TCP連接還沒有釋放,然後經過等待計時器設置的2MSL後,才進入到CLOSE狀態。