1. 程式人生 > >TCP三次握手、四次揮手

TCP三次握手、四次揮手

序號 img 因此 連接重置 .com 也不會 tcp標誌位 失效 gem

TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接:

位碼即tcp標誌位,有6種表示:

SYN(synchronous建立連接)

ACK(acknowledgement 表示響應、確認)

PSH(push表示有DATA數據傳輸)

FIN(finish關閉連接)

RST(reset表示連接重置)

URG(urgent緊急指針字段值有效)

三次握手:

第一次握手:客戶端發送syn包(syn=x)到服務器,並進入SYN_SEND狀態,等待服務器確認;

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

握手過程中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。

確認號:其數值等於發送方的發送序號+1(即接收方期望接收的下一個序列號)。

四次揮手:

與建立連接的“三次握手”類似,斷開一個TCP連接則需要“四次揮手”。

第一次揮手:主動關閉方發送一個FIN,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發數據了(當然,在fin包之前發送出去的數據,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),但是,此時主動關閉方還可以接受數據。

第二次揮手:被動關閉方收到FIN包後,發送一個ACK給對方,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號)。

第三次揮手:被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,我的數據也發送完了,不會再給你發數據了。

第四次揮手:主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號為收到序號+1,至此,完成四次揮手。

TCP的四次揮手過程(簡言之):主動關閉方向被動關閉方發送不會再給你發數據了的信息;被動關閉方對收到的主動關閉方的報文段進行確認;被動關閉方向主動關閉方發送我也不會再給你發數據了的信息;主動關閉方再次對被動關閉方的確認進行確認。

TCP三次握手和四次揮手的全過程如下圖:

技術分享圖片

TCP的三次握手過程?為什麽會采用三次握手,若采用二次握手可以嗎?

答:建立連接的過程是利用客戶服務器模式,假設主機A為客戶端,主機B為服務器端。

1)TCP的三次握手過程:主機A向B發送連接請求;主機B對收到的主機A的報文段進行確認;主機A再次對主機B的確認進行確認。

2)采用三次握手是為了防止失效的連接請求報文段突然又傳送到主機B,因而產生錯誤。失效的連接請求報文段是指:主機A發出的連接請求沒有收到主機B的確認,於是經過一段時間後,主機A又重新向主機B發送連接請求,且建立成功,順序完成數據傳輸。考慮這樣一種特殊情況,主機A第一次發送的連接請求並沒有丟失,而是因為網絡節點導致延遲達到主機B,主機B以為是主機A又發起的新連接,於是主機B同意連接,並向主機A發回確認,但是此時主機A根本不會理會,主機B就一直在等待主機A發送數據,導致主機B的資源浪費。

3)采用兩次握手不行,原因就是上面說的失效的連接請求的特殊情況,因此采用三次握手剛剛好,兩次可能出現失效,四次甚至更多次則沒必要,反而復雜了。

TCP三次握手、四次揮手