我無法在我的腦海中解決這三個事實(??):
知道連接是否失效的唯一方法是通過它發送資料是否失敗
知道發送資料是否失敗的唯一方法是您沒有收到確認
服務器發送的事件沒有確認。他們是單向推動
那么,服務器如何知道連接是否斷開?
如果我導航到一個網站并啟動一個 WebSocket / SSE 連接(一個永久資料流),如果我隨后離開該頁面,服務器如何知道連接是否斷開?
這些技術是否確實對發送的每條訊息都有確認,但用戶無法訪問?
如果是這樣,那為什么不呢?在服務器代碼中知道訊息是否成功發送不是很有用嗎?
但是,如果根本沒有確認,服務器怎么知道連接是否斷開?
uj5u.com熱心網友回復:
很簡單,當它不再從客戶端接收任何訊息時。例如,如果服務器在確定的時間內沒有接收到資料包,則會發生超時事件,使 Web 服務器關閉該連接/套接字。面向連接的協議(例如 TCP )就是這種情況。
其他協議,例如 UDP,是無連接的,這意味著它們沒有確認事件。資料包被發送,客戶端不關心服務器是否接收到它。
回答您的以下問題:
如果我導航到一個網站并啟動一個 WebSocket / SSE 連接(一個永久資料流),如果我隨后離開該頁面,服務器如何知道連接是否斷開?
當您離開站點時,客戶端(您的瀏覽器)很可能會開始一個連接終止階段,在該階段它將向服務器發送大量資料包,服務器將通過關閉連接來確認該請求。
這些技術是否確實對發送的每條訊息都有確認,但用戶無法訪問?
請參閱上一個答案。HTTP,最流行的網路協議確實有確認資料包,既可以啟動連接也可以終止連接(也可以確保服務器/客戶端獲取資料)。
如果是這樣,那為什么不呢?在服務器代碼中知道訊息是否成功發送不是很有用嗎?
只要是基于連接的協議,服務器就知道訊息是否發送成功。
但是,如果根本沒有確認,服務器怎么知道連接是否斷開?
如果不使用確認,則沒有建立連接。它是一種無連接協議(例如 UDP)。在這種情況下,服務器將接收(或不接收)訊息并在不建立連接的情況下發送資料。發送資料后,套接字將立即關閉。
最后,您似乎混淆了事實。這完全取決于使用的協議。有些建立連接,要求客戶端/服務器明確終止連接,否則將超時。其他人只會發送資料并希望得到回應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/443168.html
