1. 程式人生 > >簡單描述 TCP三次握手與四次揮手過程

簡單描述 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。

最簡單的理解一:建立TCP連線:三次握手協議客戶端:我要對你講話,你能聽到嗎;服務端:我能聽到;而且我也要對你講話,你能聽到嗎;客戶端:我也能聽到。…….互相開始通話……..    二:關閉TCP連線:四次握手協議客戶端:我說完了,我要閉嘴了;服務端:我收到請求,我要閉耳朵了;(客戶端收到這個確認,於是安心地閉嘴了。)…….    服務端還沒傾訴完自己的故事,於是繼續嘮嘮叨叨向客戶端說了半天,直到說完為止…….服務端:我說完了,我也要閉嘴了;客戶端:我收到請求,我要閉耳朵了;(事實上,客戶端為了保證這個確認包成功送達,等待了兩個最大報文生命週期後,才閉上耳朵。)(服務端收到這個確認,於是安心地閉嘴了。)