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