任播如何與 tcp 一起工作?
TCP 是有狀態的,應該要求後續數據包到達同一伺服器。(無狀態)HTTP 在 TCP 之上執行,CDN 可以使用任播。
那麼 TCP 如何與任播一起工作呢?如果 syn 和 ack 去不同的伺服器怎麼辦?我想我聽說Google對此有一些解決方案,但我不確定。
如果有任何區別,請同時回答 IPv4 和 IPv6。
這是眾多挑戰之一,可以通過許多不同的方式來解決。最簡單的方法是忽略它並希望最好。只要路由不改變中間連接,就可以了。但是當路由發生變化時,它會破壞所有受路由變化影響的連接。使用這種方法,其他答案已經更深入了。
另一種方法是跟踪連接路由到的位置。如果數據包被路由到錯誤的 POP,CDN 可以將數據包通過隧道傳送到正確的 POP 以進行進一步處理。這確實會引入額外的成本,一旦發生,客戶端將經歷增加的延遲。這種增加的延遲將在連接的整個生命週期內持續存在。但這對於使用者體驗來說可能比斷開連接更好。
在頻寬消耗方面,成本不是很大,因為它只影響一個方向的數據包,並且往往是頻寬使用最小的方向。
跟踪可以在連接級別完成,也可以通過跟踪哪個是為每個單獨的客戶端 IP 地址提供服務的首選 POP 來完成。用於跟踪連接的最明顯的資料結構是分佈式雜湊表。
如果客戶端支持 MPTCP,則可以使用另一種解決方案。建立連接後,伺服器將使用單播 IP 地址打開另一個子流。如果成功建立了這樣的子流,則連接可以通過在連接的剩餘生命週期內簡單地使用單播地址而在任播地址的路由更改中倖存下來。
原則上,上述所有方法對於 IPv4 和 IPv6 都是相同的。但在實踐中,由於 IP 地址不足,某些解決方案可能無法在 IPv4 上正常工作。
例如,MPTCP 方法確實要求每個伺服器都有一個公共 IP 地址才能正常工作。大型負載平衡設置可能有太多伺服器,無法為每個伺服器分配公共 IP 地址。此外,如果客戶端位於 NAT 之後,則伺服器無法啟動新子流的建立,這通常是 IPv4 的情況。這意味著伺服器將不得不發送單播 IP 地址作為初始子流的選項,並讓客戶端啟動額外的子流。
我不知道 CDN 使用了上述哪種方法。