国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【譯】 WebSocket 協議第七章——關閉連接(Closing the Connection)

Freeman / 2142人閱讀

摘要:狀態碼當關閉一個連接時如在開始握手已經完成后,發送一個關閉幀,終端可能會說明關閉的原因。表示終端由于協議錯誤中止了連接。這個狀態碼是為了給上層應用表示連接被異常關閉如沒有發送或者接受一個關閉幀這種場景的使用而設計的。

概述

本文為 WebSocket 協議的第七章,本文翻譯的主要內容為 WebSocket 連接關閉相關內容。

關閉連接(協議正文) 7.1 定義 7.1.1 關閉 WebSocket 連接

關閉 WebSocket 連接,終端需要關閉底層的 TCP 連接。終端需要使用一個方法來干凈的關閉TCP連接,還有 TLS 會話,如果可能的話,拋棄后面可能受到的任意字符。終端可能會在需要的時候,通過任何方式來關閉連接,例如在收到攻擊時。

在底層的 TCP 連接中,通常大多數情況下,服務端應該先關閉,所以是服務端而不是客戶端保持 TIME_WAIT 狀態(因為客戶端先關閉的話,這會阻止服務端在2 MSL 內重新打開這條連接,而如果服務器處于 TIME_WAIT 狀態下,如果收到了一個帶有更大序列號的新的 SYN 包時,也能夠立即響應重新打開連接,從而不會對服務器產生影響)。反常情況(例如在合理的時間后,服務端收到一個 TCP 關閉包)下,客戶端應該開始關閉 TCP 連接。像這樣的,當服務端進入關閉 WebSocket 連接狀態時,它應該立刻準備關閉 TCP 連接,然后當客戶端客戶端準備關閉連接時,他應該等待服務端的 TCP 關閉包。

用 C 語言的 Berkeley socket 作為例子來展示如何徹底的關閉連接,一端需要用 SHUP_WR 調用 shutdown() 方法,調用 recv() 直到獲得一個值為 0 的表示對面也準備有序關閉連接的返回值,然后最后調用 close() 來關閉 socket 通道。

7.1.2 開始進行 WebSocket 關閉握手

用一個狀態碼 code (第 7.4 節)和一個可選的關閉原因 reason (第 7.1.6 節)來開始 WebSocket 關閉握手,終端必須發送一個在第 5.5.1 節中描述的一樣的關閉幀,將狀態碼設置為 code 字段,將關閉原因設置為 reaons 字段。一旦終端已經發送和收到了關閉控制幀,那么終端應該像第 7.1.1 節中定義的一樣關閉 WebSocket 連接

7.1.3 已經開始 WebSocket 關閉握手

在發送或者收到了關閉幀時,我們可以說已經開始 WebSocket 關閉握手,并且 WebSocket 連接的狀態已經到了“關閉中”(CLOSING)狀態。

7.1.4 WebSocket 連接已關閉

當底層的 TCP 連接關閉后,我們可以說WebSocket 連接已關閉,并且 WebSocket 連接已經到了”關閉“(CLOSED)狀態。如果 TCP 連接在 WebSocket 關閉握手完成之后已經關閉,那么我們可以說 WebSocket 連接已經被徹底關閉。

如果 WebSocket 連接沒有被建立,我們也說WebSocket已經關閉,但是不徹底

7.1.5 WebSocket 關閉狀態碼

就像在第 5.5.1 和第 7.4 節中定義的一樣,關閉幀可以包含一個關閉的狀態碼和指定的原因。WebSocket 連接的關閉可能是同時由另一個終端發起。WebSocket 關閉狀態碼是在第 7.4 節中定義的在第一關閉幀中的由實現該協議的應用程序接收的狀態碼。如果關閉幀中沒有包含狀態碼,WebSocket 關閉狀態碼被默認為1005。如果WebSocket 已經關閉并且終端沒有收到任何的關閉幀(例如發生了可能底層的傳輸連接突然丟失的情況),那么WebSocket 關閉狀態碼被默認為1006。

注:兩個終端可能沒有就WebSocket 關閉狀態碼的值達成一致。例如:如果遠端發送一個關閉幀,但是本地應用沒有從它的 socket 緩沖區中讀到關閉幀的數據,同時本地應用多帶帶的決定關閉連接并且發送了一個關閉幀,那么兩個終端都發送了并且會收到一個關閉幀,同時不會發送更多的關閉幀。每一個終端會看到另一個終端發送過來的WebSocket 關閉狀態碼的狀態碼。像這樣的,在這個示例里面,有可能兩個終端都沒有協商過WebSocket 關閉狀態碼,兩個終端都幾乎在同一時間多帶帶開始 WebSocket 關閉握手

7.1.6 WebSocket 連接關閉原因

像第 5.5.1 節和第 7.4 節中定義的一樣,一個關閉幀可能包含一個用于關閉的表示原因的狀態碼,然后是 UTF-8 編碼的數據,數據的解析方式是留給終端來解釋,而不在這個協議中定義。一個正在關閉中的 WebSocket 連接可能是同時從另一端開始的。WebSocket 連接關閉原因是實現了該協議的應用收到的緊跟在狀態碼(第 7.4 節)之后的包含在第一個關閉控制幀中的 UTF-8 編碼數據。如果在關閉控制幀中沒有這些數據,那么WebSocket 連接關閉原因的值就是一個空字符串。

注:和在第 7.1.5 中被提到的邏輯一樣,兩個終端可能沒有協商過WebSocket 連接關閉原因

7.1.7 WebSocket 連接失效

某些算法和規范要求終端有WebSocket 連接失效。為了實現這些,客戶端必須關閉 WebSocket 連接,并且可以用一個合適的方式向用戶上報相關問題(尤其是對開發者有幫助的內容)。相似的,為了實現這個,服務端必須關閉 WebSocket 連接,并且應該用日志記錄這個問題。

如果在此之前WebSocket 已經建立連接,此時終端需要讓WebSocket 連接失效,那么在進行關閉 WebSocket 連接之前,終端需要發送一個包含恰當的狀態碼(第 7.4 節)。終端在確認另一端沒有能力接收或者處理關閉幀時,可能會選擇省略發送關閉幀,從而在一開始就進入正常錯誤流程導致 WebSocket 連接關閉。終端在接到WebSocket 連接失效的指令后,不能繼續嘗試處理來自另一端的數據(包括響應的關閉幀)。

除了上面說到的場景和應用層指定的場景(例如:腳本使用了 WebSocket 的 API)外,客戶端不應該關閉連接。

7.2 異常關閉 7.2.1 客戶端主動關閉

在開始握手中的某些特定算法,需要客戶端讓WebSocket 連接失效。為了實現這些,客戶端必須像第 7.1.7 節中定義的一樣讓WebSocket 連接失敗。

如果任意一端底層的傳輸連接意外丟失,客戶端必須讓WebSocket 連接失敗

除了上面指定的情況和應用層的約束(例如,腳本使用了 WebSocket 的 API)外,客戶端不應該關閉連接。

7.2.2 服務端主動關閉

在開始監建立連接握手時,有些算法要求或者推薦服務端終端 WebSocket 連接。為了實現這些,服務端必須關閉 WebSocket 連接(第 7.1.1 節)。

7.2.3 從異常關閉中恢復

導致異常關閉的原因有很多。例如是由于一個臨時的錯誤導致的關閉,在這種情況下能夠恢復就能夠帶來一個穩定的連接,恢復正常的操作。有些問題也有可能是一個非臨時的問題導致的,在這種情況下如果每個客戶端都遇到了異常的關閉,客戶端立刻重試連接并且不間斷情況下,服務端可能會收到由于大量客戶端重新連接帶來的拒絕服務攻擊。最終的結果就是這個方案可能會導致服務沒有辦法及時的恢復,或者讓服務恢復變得困難的多。

為了避免這個問題,客戶端應該在異常終端嘗試恢復連接時,使用在這一節中定義的一些備選策略。

第一次嘗試恢復連接應該在一個隨機長度時間后。隨機事件的參數如何選擇,這個交給客戶端來決定;選擇 0 到 5 秒之間的隨機值是一個合理的初始延時,但是客戶端可以根據自己的經驗和特定的應用來選擇不同長度的時間延時。

如果第一次重試連接失敗,接下來的連接的延時應該變大,使用如截斷二進制指數退避方法(譯者注:解決以太網碰撞算法,見截斷二進制質數退避算法)等來進行設置這個延時。

7.3 連接正常關閉

服務端可以在任意需要時關閉 WebSocket 連接。客戶端不應該任意關閉 WebSocket 連接。在任一情況中,終端要發起關閉都必須遵循開始 WebSocket 連接關閉的步驟。

7.4 狀態碼

當關閉一個連接時(如:在開始握手已經完成后,發送一個關閉幀),終端可能會說明關閉的原因。終端的這個原因的描述和終端應該采取的行動,在這個文檔中都沒有說明。這個文檔提前定義了一些可能用于擴展、框架和終端應用的狀態碼和狀態碼范圍。這些狀態碼和任何有關聯的的文本消息在關閉幀中都是可選的。

7.4.1 定義狀態碼

在發送一個關閉幀時,終端可以提前定義如下的狀態碼。

1000

1000 表示一個正常的關閉,意味著連接建立的目標已經完成了。

1001

1001 表示終端已經“走開”,例如服務器停機了或者在瀏覽器中離開了這個頁面。

1002

1002 表示終端由于協議錯誤中止了連接。

1003

1003 表示終端由于收到了一個不支持的數據類型的數據(如終端只能怪理解文本數據,但是收到了一個二進制數據)從而關閉連接。

1004

保留字段。這意味著這個狀態碼可能會在將來被定義。

1005

1005 是一個保留值并且不能被終端當做一個關閉幀的狀態碼。這個狀態碼是為了給上層應用表示當前沒有狀態碼。

1006

1006 是一個保留值并且不能被終端當做一個關閉幀的狀態碼。這個狀態碼是為了給上層應用表示連接被異常關閉如沒有發送或者接受一個關閉幀這種場景的使用而設計的。

1007

1007 表示終端因為收到了類型不連續的消息(如非 UTF-8 編碼的文本消息)導致的連接關閉。

1008

1008 表示終端是因為收到了一個違反政策的消息導致的連接關閉。這是一個通用的狀態碼,可以在沒有什么合適的狀態碼(如 1003 或者 1009)時或者可能需要隱藏關于政策的具體信息時返回。

1009

1009 表示終端由于收到了一個太大的消息無法進行處理從而關閉連接。

1010

1010 表示終端(客戶端)因為預期與服務端協商一個或者多個擴展,但是服務端在 WebSocket 握手中沒有響應這個導致的關閉。需要的擴展清單應該出現在關閉幀的原因(reason)字段中。

1001

1001 表示服務端因為遇到了一個意外的條件阻止它完成這個請求從而導致連接關閉。

1015

1015 是一個保留值,不能被終端設置到關閉幀的狀態碼中。這個狀態碼是用于上層應用來表示連接失敗是因為 TLS 握手失敗(如服務端證書沒有被驗證過)導致的關閉的。

7.4.2 保留狀態碼范圍

0-999

0-999 的狀態碼都沒有被使用。

1000-2999

1000-2999 的狀態碼是在這個文檔、將來的修訂和擴展中定義的保留字段,用于永久的可用的公共文檔。

3000-3999

3000-3999 的狀態碼是保留給庫、框架和應用使用的。這些狀態碼被IANA直接注冊了。這些狀態碼在這篇文檔中沒有進行解釋。

4000-4999

40000-4999 的狀態碼是保留下來私用的,因此這些狀態碼不能被注冊。這些狀態碼可以使用在 WebSocket 應用之前的協議上。這些狀態碼在這篇文檔中沒有進行解釋。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101850.html

相關文章

  • WebSocket 協議 RFC 文檔(全中文翻

    摘要:概述經過半年的搗鼓,終于將協議全篇翻譯完成。現在將所有章節全部整理到一篇文章中,方便大家閱讀。如果大家想看具體的翻譯文檔,可以去我的中查看。大家有相關類型的需要,建議大家可以嘗試下。 概述 經過半年的搗鼓,終于將 WebSocket 協議(RFC6455)全篇翻譯完成。現在將所有章節全部整理到一篇文章中,方便大家閱讀。如果大家想看具體的翻譯文檔,可以去我的GitHub中查看。 具體章節...

    ghnor 評論0 收藏0
  • WebSocket探秘

    摘要:最終形成服務器端的握手響應必需。出于安全考慮和避免網絡截獲,客戶端發送的數據幀必須進行掩碼處理后才能發送到服務器,不論是否是在安全協議上都要進行掩碼處理。服務器如果沒有收到掩碼處理的數據幀時應該關閉連接,發送一個的狀態碼。 首先 長連接:一個連接上可以連續發送多個數據包,在連接期間,如果沒有數據包發送,需要雙方發鏈路檢查包。 TCP/IP:TCP/IP屬于傳輸層,主要解決數據在網絡中的...

    Coding01 評論0 收藏0
  • WebSocket其實沒那么難

    摘要:服務端確認協議版本,升級為協議。自己寫了一個例子,服務端在開始連接后,利用定時器主動向客戶端發送隨機數,客戶端也可以發給服務器消息,然后服務器返回這條消息給客戶端。 寫在前面 webSocket是一項可以讓服務器將數據主動推送給客戶端的技術。前幾天寫了一個日志功能,日志數據需要實時更新。正好項目中有封裝好的WebSocket組件,且接口支持webSocket,就用它實現了。也是第一次用...

    CoderDock 評論0 收藏0
  • 用 Node 實現簡單 WebSocket 協議

    摘要:用實現簡單協議從瀏覽器說起瀏覽器提供的非常簡潔。創建連接連接建立時的回調收到消息時的回調連接出錯時的回調連接終止時的回調發送消息告訴我們也就是說,在創建對象時,瀏覽器嘗試與服務端建立連接發送請求建立個服務端一旦收到數據,就會觸發。 用 Node 實現簡單 WebSocket 協議 從瀏覽器 WebSocket API 說起 瀏覽器提供的 WebSocket API 非常簡潔。 let...

    chavesgu 評論0 收藏0
  • WebSocket就這么回事兒

    摘要:服務端確認協議版本,升級為協議。自己寫了一個例子,服務端在開始連接后,利用定時器主動向客戶端發送隨機數,客戶端也可以發給服務器消息,然后服務器返回這條消息給客戶端。做的事情就是給頁面的元素綁定事件。 寫在前面webSocket是一項可以讓服務器將數據主動推送給客戶端的技術。前幾天寫了一個日志功能,日志數據需要實時更新。正好項目中有封裝好的WebSocket組件,且接口支持webSock...

    ruicbAndroid 評論0 收藏0

發表評論

0條評論

Freeman

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<