三次握手和http協議有什么關系嗎?
TCP/IP是一種籠統的稱呼,實際上是兩種不同層次的協議。
網絡通信拓撲結構包含8層(由于個人疏忽,這句認真講是錯誤的。更正為:OSI/RM參考模型為七層,因為過于復雜/龐大,引入了現在更為常用的TCP/IP四層模型),IP屬于網絡層協議(不同于電腦Ip),TCP屬于傳輸層協議(UDP也在這層),TCP/IP 構成了現代網絡通信的基礎。
TCP 建立連接需要"三次握手"的過程,是為了保證連接的安全可靠性(實際情況可能不一定),所以說TCP 是可靠連接。
為什么需要三次而不是兩次?如果是兩次會發生什么?舉個栗子,客戶端一次請求因為各種原因(如網絡延遲),隔了很長時間才發送到服務器,服務器一看,咦,生意上門!馬上給個回復:可以招呼!然后滿懷期待的等客戶端發送信息。而實際上客戶端早已認為這次請求已失效,根本就不想理服務端了,不再發送有效信息給服務端。但服務端此時已確認連接建立,只能苦苦等消息。這樣子服務端資源就被無情的占用了,多了可能導致服務端過載之類的情況。
回到問題。HTTP協議實際屬于應用層協議,也就是說是基于TCP 的,所以每次完整的HTTP請求都會有TCP的"三次握手"用來建立連接。另外,連接結束后也會由一端請求終止連接,也就是TCP的"四次揮手"。
這兩天正好在復習TCP/IP,剛剛下載了個wareshark抓包幾遍完整的過程,希望對你有幫助。
上廁所純手打,腳都蹲麻了…
回到電腦旁。。。
既然感覺自己用心了,那就再用點心好好補充一下。下面是HTTP一次請求的建立到終止(瀏覽器一次網頁請求)。
三次握手:
可以看到,在HTTP請求之前有三次TCP的連接建立過程,這就是所謂的"三次握手"。
客戶端請求建立連接,SYN位--置1,Seq=0
服務端收到請求,允許建立連接,并發送"通知"給客戶端,SYN位--置1、ACK位--置1,Seq=0客戶端收到服務端響應,返回消息給服務端,ACK位--置1四次揮手:
請求端(可能是客戶端也可能是服務器,這里是服務端發起)發送終止信號,FIN位(連接中斷位)--置1、ACK位(此處是應答標識,不是Ack。一個是響應標識,一個是應答碼)--置1。Seq=19815,ACK=443
響應端收到信號,先返回一條信息(可以理解為:我收到你的分手消息,但是我可能還有點事),ACK位--置1。Seq=443,Ack=19816(可以看到接收方的Seq為請求方的Ack,接收方的Ack為請求方Seq+1)
響應端覺得自己也沒啥留戀的了!也發送終止信號,FIN位--置1、ACK位--置1。Seq=443、Ack=19816
請求端收到響應端信號,返回消息。ACK位--置1。Seq=19816、Ack=444
再來解釋一下前面說的(此處是應答標識,不是Ack。一個是響應標識,一個是應答碼)標識位(FIN、ACK)以紅色方框與箭頭標識,應答碼(Ack)以紅色圓框標識。
這樣費大把勁說一下發現對自己的知識鞏固也是有效果的,哈哈哈哈,所以說程序員要寫技術博客,作為菜鳥也要往這方面發展。
來這個看看吧:http://www.techeffic.com:5193/article/ff808081598c94b201598c94b2410000