1. 程式人生 > >面試題之------三次握手與四次揮手過程

面試題之------三次握手與四次揮手過程

客戶端 服務 但是 到來 重新 因此 同步 等待 上一個

首先,客戶端與服務器均處於未連接狀態,並且是客戶端主動向服務器請求建立連接:


客戶端將報文段中的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。

面試題之------三次握手與四次揮手過程