首頁(yè)技術(shù)文章正文

HTTP三次握手和四次揮手

更新時(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 。
HTTP 請(qǐng)求響應(yīng)常見狀態(tài)碼100~199:表示成功接收請(qǐng)求,要求客戶端繼續(xù)提交下一次請(qǐng)求才能完成整個(gè)處理過(guò)程。200~299:表示成功接收請(qǐng)求并已完成整個(gè)處理過(guò)程。常用200300~399:為完成請(qǐng)求,客戶需進(jìn)一步細(xì)化請(qǐng)求。例如:請(qǐng)求的資源已經(jīng)移動(dòng)一個(gè)新地址、常用302(意味著你請(qǐng)求我,我讓你去找別人),307和304(我不給你這個(gè)資源,自己拿緩存)400~499:客戶端的請(qǐng)求有錯(cuò)誤,常用404(意味著你請(qǐng)求的資源在web服務(wù)器中沒有)403(服務(wù)器拒絕訪問(wèn),權(quán)限不夠)500~599:服務(wù)器端出現(xiàn)錯(cuò)誤,常用500    

   


作者:黑馬程序員javaEE培訓(xùn)學(xué)院
首發(fā):http://java.itheima.com/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!