TCP三次握手和四次揮手
通過上面這張圖我們能夠知道幸撕。
在Http工作之前雪侥,Web瀏覽器通過網(wǎng)絡(luò)和Web服務(wù)器建立鏈連接彰亥,該連接是通過Tcp來完成的葱色,該協(xié)議和Ip共同組成了Internet卸伞,即著名的Tcp/Ip協(xié)議族抹镊,Http是比Tcp更高的應(yīng)用層協(xié)議,一般Tcp接口的端口好是80荤傲。
一
TCP(Transmission Control Protocol)傳輸控制協(xié)議
TCP是主機(jī)對主機(jī)層的傳輸控制協(xié)議垮耳,提供可靠的連接服務(wù),采用三次握手確認(rèn)建立一個(gè)連接:
位碼即tcp標(biāo)志位,有6種標(biāo)示:SYN(建立聯(lián)機(jī))? ACK(確認(rèn))? PSH(傳送)? FIN(結(jié)束)? RST(重置)? ? URG(緊急)? Sequence number(順序號碼)? ? Acknowledge number(確認(rèn)號碼).
二? TCP的三次握手
第一次握手:客戶端發(fā)送了一個(gè)帶有SYN(建立連接)的Tcp報(bào)文到服務(wù)器遂黍,這個(gè)三次握手中的開始终佛。表示客戶端想要和服務(wù)端建立連接。
第二次握手:服務(wù)端接收到客戶端的請求雾家,返回客戶端報(bào)文铃彰,這個(gè)報(bào)文帶有SYN(建立連接)和ACK(確認(rèn))標(biāo)志,詢問客戶端是否準(zhǔn)備好芯咧。
第三次握手:.客戶端再次響應(yīng)服務(wù)端一個(gè)ACK(確認(rèn))牙捉,表示我已經(jīng)準(zhǔn)備好竹揍。
三 TCP的四次握手
第一次揮手:TCP發(fā)送一個(gè)FIN(結(jié)束),用來關(guān)閉客戶到服務(wù)端的連接邪铲。
第二次揮手:服務(wù)端收到這個(gè)FIN芬位,他發(fā)回一個(gè)ACK(確認(rèn)),確認(rèn)收到序號為收到序號+1带到,和SYN一樣昧碉,一個(gè)FIN將占用一個(gè)序號。
第三次揮手:服務(wù)端發(fā)送一個(gè)FIN(結(jié)束)到客戶端揽惹,服務(wù)端關(guān)閉客戶端的連接被饿。
第四次揮手:客戶端發(fā)送ACK(確認(rèn))報(bào)文確認(rèn),并將確認(rèn)的序號+1永丝,這樣關(guān)閉完成锹漱。
為什么會采用三次握手箭养,若采用二次握手可以嗎慕嚷?
1. 采用三次握手是為了防止失效的連接請求報(bào)文段突然又傳送到主機(jī)B,因而產(chǎn)生錯(cuò)誤毕泌。失效的連接請求報(bào)文段是指:主機(jī)A發(fā)出的連接請求沒有收到主機(jī)B的確認(rèn)喝检,于是經(jīng)過一段時(shí)間后,主機(jī)A又重新向主機(jī)B發(fā)送連接請求撼泛,且建立成功挠说,順序完成數(shù)據(jù)傳輸。
2. 考慮這樣一種特殊情況愿题,主機(jī)A第一次發(fā)送的連接請求并沒有丟失损俭,而是因?yàn)榫W(wǎng)絡(luò)節(jié)點(diǎn)導(dǎo)致延遲達(dá)到主機(jī)B,主機(jī)B以為是主機(jī)A又發(fā)起的新連接潘酗,于是主機(jī)B同意連接杆兵,并向主機(jī)A發(fā)回確認(rèn),但是此時(shí)主機(jī)A根本不會理會仔夺,主機(jī)B就一直在等待主機(jī)A發(fā)送數(shù)據(jù)琐脏,導(dǎo)致主機(jī)B的資源浪費(fèi)。
為什么建立連接協(xié)議是三次握手缸兔,而關(guān)閉連接卻是四次握手呢日裙?
原因是因?yàn)門CP是全雙工模式,因此每個(gè)方向都需要一個(gè)FIN和ACK惰蜜,當(dāng)一端發(fā)送了FIN包之后昂拂,處于半關(guān)閉狀態(tài),此時(shí)仍然可以接收數(shù)據(jù)包抛猖。在建立連接時(shí)格侯,服務(wù)器可以把SYN和ACK放在一個(gè)包中發(fā)送路克。
但是在斷開連接時(shí),如果一端收到FIN包养交,但此時(shí)仍有數(shù)據(jù)未發(fā)送完精算,此時(shí)就需要先向?qū)Χ嘶貜?fù)FIN包的ACK。等到將剩下的數(shù)據(jù)都發(fā)送完之后碎连,再向?qū)Χ税l(fā)送FIN灰羽,斷開這個(gè)方向的連接。
因此很多時(shí)候FIN和ACK需要在兩個(gè)數(shù)據(jù)包中發(fā)送鱼辙,因此需要四次握手