更新時間:2018-08-09 來源:黑馬程序員 瀏覽量:
每當建立一個TCP/IP連接的時候都要經歷3次握手,這是為了保證建立一個可靠的連接。
三次握手客戶端向服務器發請求,服務器接收請求,服務器接收請求之后發送一個連接標志,客戶端接收連接標志之后也向服務器發送一個連接標志,至此連接完成。
生活中的栗子: 小明和小麗的故事。話說有一天小麗給小明說我喜歡你(syn,一次握手) 小明聽到小麗的的表白后說知道了,我也喜歡你,也說了聲(ack, syn, 二次握手) ,小麗聽到小名說喜歡自己以后,說我知道了 (ack, 三次握手)
第一次握手:主機A發送位碼為syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求建立聯機;
第二次握手:主機B收到請求后要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三次握手:主機A收到后檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到后確認seq值與ack=1則連接建立成功。為什么有4次揮手呢,4次揮手的作用就是斷開連接,之所以要斷開連接是因為TCP/IP協議是要占用端口的,而計算機的端口是有限的,所以一次傳輸完成之后是要斷開連接的,斷開連接的方式就是4次揮手。
還是小明和小麗的故事:話說小名和小麗在一起后小明發現自己零花錢不夠花了,也沒有時間玩游戲了,然后就給小麗說我們分手把(FIN, 第一次揮手),這個時候小麗可能很難過說知道了(ack, 第二次揮手),,很久很久都沒有說話,過了很久小麗說我同意分手了(FIN, 第三次揮手),這個時候小明說,管你了,我早就和你分手了(ack,第四次揮手)
由于 TCP 連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務后就能發送一個FIN 來終止這個方向的發送通道。收到一個 FIN 只意味著這一方向上沒有數據流動,一個 TCP 連接在收到一個 FIN 后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
客戶端 A 發送一個 FIN ,用來關閉客戶 A 到服務器 B 的數據傳送。服務器 B 收到這個 FIN ,它發回一個 ACK ,確認序號為收到的序號加 1。和 SYN 一樣,一個FIN 將占用一個序號。服務器 B 關閉與客戶端 A 的連接,發送一個 FIN 給客戶端 A 。客戶端 A 發回 ACK 報文確認,并將確認序號設置為收到序號加 1 。