簡單描述 TCP三次握手與四次揮手過程
首先,客戶端與伺服器均處於未連線狀態,並且是客戶端主動向伺服器請求建立連線:
客戶端將報文段中的SYN=1,並選擇一個seq=x,(即該請求報文的序號為x) 將這個報文傳送到伺服器。此時,客戶端進入同步已傳送狀態(SYN-SEND).SYN報文段不能攜帶資料,但是要消耗掉一個序號。
伺服器收到請求報文後,若同意建立連線,則回覆報文中,SYN=1,ACK=1,並選擇一個seq = y,且報文中確認號為x+1,序號為y .此時伺服器進入同步已接收狀態(SYN-RCVD)
客戶端收到伺服器的同步確認後,對伺服器傳送確認的確認。將ACK=1,確認號為y+1,而報文首部的序號為x+1,將該報文發出後,客戶端進入已連線狀態(ESTABLISHED)。
伺服器收到客戶端的確認後,也進入已連線狀態。
以上即三次握手
為何使用三次握手機制:
假設如下異常情況:
客戶端向伺服器傳送了第一條請求報文,但是該報文並未在網路中被丟棄,而是長時間阻滯在某處,而客戶端收不到伺服器確認,以為該報文丟失,於是重新發送該報文,這次的報文成功到達伺服器,如果不使用三次握手,則伺服器只需對該報文發出確認,就建立了一個連線。而在這個連線建立,並釋放後,第一次傳送的,阻滯在網路中的報文到達了伺服器,伺服器以為是客戶端又重新發送了一個連線請求(實際上在客戶端那裡,該連線早已失效),就又向客戶端傳送一個確認,但客戶端認為他沒有傳送該請求報文,因此不理睬伺服器傳送的確認,而伺服器以為又建立了一個新的連線,於是一直等待A發來資料,造成了伺服器資源的浪費,並且會產生安全隱患。因此,若使用三次握手機制,伺服器傳送了該確認後,收不到客戶端的確認,也就知道並沒有建立連線,因此不會將資源浪費在這種沒有意義的等待上。
TCP連線的釋放(四次揮手)
連線的釋放較連線的建立複雜。
現假設客戶端與伺服器均處於連線建立狀態,客戶端主動斷開連線:
1.客戶端向伺服器傳送FIN報文:FIN=1,序號seq=上一個最後傳輸的位元組序號+1=u,傳送後,客戶端進入FIN-WAIT-1狀態。
2.伺服器接收到該報文後,傳送一個確認報文:令ACK=1,確認序號ack = u+1,自己的報文序號seq=v,傳送後,伺服器進入CLOSE-WAIT狀態。
3.此時TCP連線進入連線半關閉狀態,伺服器可能還會向客戶端傳送一些資料。
4.客戶端收到來自伺服器的確認之後,進入FIN-WAIT-2狀態。等待伺服器傳送連線釋放報文。
5.如果伺服器已經沒有要傳送的資料,則釋放TCP連線,向客戶端傳送報文:令FIN=1,ACK=1,確認號ack =u+1,自己的序號seq = w(w可能等於v也可能大於v),伺服器進入LAST-ACK狀態。
6.客戶端收到伺服器的連線釋放報文後,對該報文發出確認,令ACK=1,確認號ack=w+1,自己的序號seq=u+1,傳送此報文後,等待2個msl時間後,進入CLOSED狀態。
7.伺服器收到客戶端的確認後,也進入CLOSED狀態並撤銷傳輸控制塊。
客戶端狀態變化:未連線----->SYN-SEND----->ESTABLISHED----->FIN-WAIT-1----->FIN-WAIT-2----->TIME-WAIT----->CLOSED
伺服器狀態變化:未連線----->SYN-RCVD----->ESTABLISHED----->CLOSE-WAIT----->LAST-ACK----->CLOSED
通俗描述3次握手就是
A對B說:我的序號是x,我要向你請求連線;(第一次握手,傳送SYN包,然後進入SYN-SEND狀態)
B聽到之後對A說:我的序號是y,期待你下一句序號是x+1的話(意思就是收到了序號為x的話,即ack=x+1),同意建立連線。(第二次握手,傳送ACK-SYN包,然後進入SYN-RCVD狀態)
A聽到B說同意建立連線之後,對A說:與確認你同意與我連線(ack=y+1,ACK=1,seq=x+1)。(第三次握手,A已進入ESTABLISHED狀態)
B聽到A的確認之後,也進入ESTABLISHED狀態。
描述四次揮手就是:
1.A與B交談結束之後,A要結束此次會話,對B說:我要關閉連線了(seq=u,FIN=1)。(第一次揮手,A進入FIN-WAIT-1)
2.B收到A的訊息後說:確認,你要關閉連線了。(seq=v,ack=u+1,ACK=1)(第二次揮手,B進入CLOSE-WAIT)
3.A收到B的確認後,等了一段時間,因為B可能還有話要對他說。(此時A進入FIN-WAIT-2)
4.B說完了他要說的話(只是可能還有話說)之後,對A說,我要關閉連線了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次揮手)
5.A收到B要結束連線的訊息後說:已收到你要關閉連線的訊息。(seq=u+1,ack=w+1,ACK=1)(第四次揮手,然後A進入CLOSED)
6.B收到A的確認後,也進入CLOSED。