摘自詳解tcp連線的「三次握手」與「四次揮手」(上)
客戶端與伺服器之間資料的傳送和返回的過程當中需要建立tcp連線。
由於tcp不存在連線的概念,只存在請求和響應,請求和響應都是資料報,它們之間都是經過由tcp建立的乙個從客戶端發起,伺服器接收的類似連線的通道,這個連線可以一直保持,http請求是在這個連線的基礎上傳送的。
1. 序號(sequence number):seq,(發起方)標識傳送的位元組流
2. 確認號(acknowledgement number):ack,值為接收到的報文seq+1
3. 標誌位(flags):有六個,具體含義如下
syn:發起乙個新連線
ack:確認序號有效
fin:釋放乙個連線
rst:重置連線
urg:緊急指標有效
psh:接收方應盡快提交報文到應用層
握手之前主動開啟連線的客戶端結束closed階段,被動開啟的伺服器端也結束closed階段,並進入listen階段。隨後開始「三次握手」:
伺服器收到來自客戶端的「確認收到伺服器資料」的tcp報文之後,明確了從伺服器到客戶端的資料傳輸是正常的。結束syn-sent階段,進入established階段。
在客戶端與伺服器端傳輸的tcp報文中,雙方的確認號ack和序號seq的值,都是在彼此ack和seq值的基礎上進行計算的,這樣做保證了tcp報文傳輸的連貫性。一旦出現某一方發出的tcp報文丟失,便無法繼續"握手",以此確保了"三次握手"的順利完成。
此後客戶端和伺服器端進行正常的資料傳輸。這就是「三次握手」的過程。
為了防止伺服器端開啟一些無用的連線增加伺服器開銷以及防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。
由於網路傳輸是有延時的(要通過網路光纖和各種中間**伺服器),在傳輸的過程中,比如客戶端發起了syn=1建立連線的請求(第一次握手)。
如果伺服器端就直接建立了這個連線並返回包含syn、ack和seq等內容的資料報給客戶端,這個資料報因為網路傳輸的原因丟失了,丟失之後客戶端就一直沒有接收到伺服器返回的資料報。
客戶端可能設定了乙個超時時間,時間到了就關閉了連線建立的請求。再重新發出建立連線的請求,而伺服器端是不知道的,如果沒有第三次握手告訴伺服器端客戶端收的到伺服器端傳輸的資料的話,
伺服器端是不知道客戶端有沒有接收到伺服器端返回的資訊的。
還有一種情況是已經失效的客戶端發出的請求資訊,由於某種原因傳輸到了伺服器端,伺服器端以為是客戶端發出的有效請求,接收後產生錯誤。
所以我們需要「第三次握手」來確認這個過程,讓客戶端和伺服器端能夠及時地察覺到因為網路等一些問題導致的連線建立失敗,這樣伺服器端的埠就可以關閉了不用一直等待。
也可以這樣理解:「第三次握手」是客戶端向伺服器端傳送資料,這個資料就是要告訴伺服器,客戶端有沒有收到伺服器「第二次握手」時傳過去的資料。若傳送的這個資料是「收到了」的資訊,接收後伺服器就正常建立tcp連線,否則建立tcp連線失敗,伺服器關閉連線埠。由此減少伺服器開銷和接收到失效請求發生的錯誤。
詳解tcp連線的「三次握手」與「四次揮手」(上)
詳解tcp連線的「三次握手」與「四次揮手」(下)
一文弄懂 C vector
c 標準模板庫的核心包括以下三個元件 元件描述 容器 containers 容器是用來管理某一類物件的集合。c 提供了各種不同型別的容器,比如 deque list vector map 等。演算法 algorithms 演算法作用於容器。它們提供了執行各種操作的方式,包括對容器內容執行初始化 排序...
一文弄懂Hbase基本架構
7 hbase的容錯性 注 一張hbase表在剛剛建立的時候,預設只有乙個region。所以多有關於這張表的請求都被路由到同乙個region server,不管集群中有多少region server。這也就是為什麼hbase表在剛剛建立的階段不能充分利用整個集群的吞吐量的原因。如果想開始就用到集群的...
一文總結HTTP快取
快取是乙個很大的話題,本文只是講述http快取。http 頭資訊控制快取 大致分為兩種 強快取和協商快取。強快取如果命中快取不需要和伺服器端發生互動,而協商快取不管是否命中都要和伺服器端發生互動,強制快取的優先順序高於協商快取。兩類快取規則的不同,強制快取如果生效,不需要再和伺服器發生互動,而對比快...