tcp 重發 應用層重傳

2021-09-08 19:07:33 字數 964 閱讀 7043

需要,原因如下:

1 tcp的超時控制不是你能設定的,所有的tcp超時都是用系統的時間設定,而且這個時間很長,超時的結果就是斷開連線。

和你應用要達到的目的顯然差很遠

2send的返回ok != 資料被對方成功收到 ,且,資料被對方成功受到 != 資料被對方邏輯成功處理

舉個極端的例子:

對方收到包,但是還沒來的及處理,程式崩掉了,這個時候你的網路層顯示的顯然是對方收到了(確實也是對方收到了),但是對方並沒有正確處理這個包,這個時候從邏輯上講,你應該需要重發的,保證對方正確處理完畢。

3 如果底層通訊質量不好,tcp可能會斷鏈重連,或者序號檢測發現異常重置序號。這些情況下tcp層都會丟幀,應用層如果有重要的訊息還是要自己做重傳。

tcp協議本身是可靠的,它的重傳機制保證了訊息的可送達性(如果沒有收到對端的ack確認,它會在等待一定時間後,嘗試再次傳送,且這是乙個迴圈過程,上限是9分鐘。超過9分鐘,則認為連線已經斷開,關閉socket)。

雖然有了tcp的可靠性保證,但是很多基於tcp的應用間通訊依然會採用retry機制:傳送訊息後,如果在一定時間內沒有收到對端的確認訊息,則重發訊息。明明tcp已經可以保證訊息的可送達,為什麼還要在應用層加這麼一層實現呢?

1. 有些服務程序,基於效能或是記憶體容量方面的考慮,使用了限長的訊息佇列:如果收到的瞬時訊息過多,超過了訊息佇列的可處理個數,所有超出的訊息會被它丟棄。注意,在這種情況下,tcp確實是將訊息成功送達了,只是應用層不接受而已。客戶程序等待一小段時間,嘗試再次傳送,有可能此時服務端的處理壓力已經降下來了,訊息就能被處理了。

2. 進入了弱網環境的移動應用,傳送超時往往意味著已經斷連。此時的retry,在底層意味著重新連線,然後再次傳送訊息。

其他:進入了弱網環境的移動應用,可能會給使用者帶來不大順暢的使用體驗。當使用者傳送了一條訊息,與其讓使用者等待9分鐘才得知訊息未能送達,不如在應用層設定超時重傳,一旦超過規定時間(比如20s),則直接告知使用者,當前網路狀況不佳,不妨晚些時候再嘗試傳送。

基於tcp的應用層協議還原

基於tcp的應用層協議還原技術是網路安全每個領域都需要的一種基礎技術。首先,我們需要認識到tcp協議的兩個特徵 tcp是一種流協議。傳送者以位元組流的形式傳遞給接收者。tcp協議本身沒有固有的 報文 或 報文邊界 的概念。參考 tcp協議的特徵1意味著,在還原應用層協議之前,我們需要首先將乙個個的t...

表示層 應用層

表示層 功能 為異種機通訊提供一種公共語言,以便能進行互操作。這種型別的服務之所以需要,是因為不同的計算機體系結構使用的資料表示法不同。例如,ibm主機使用ebcdic編碼,而大部分pc機使用的是ascii碼。在這種情況下,便需要表示層來完成這種轉換。應用層 包含了通常要使用的協議 http協議 超...

應用層協議

應用層協議定義了執行在不同端系統上的應用程式程序如何相互傳遞訊息。特別是定義了 交換的訊息型別,如請求訊息和響應訊息。各種訊息型別的語法,如訊息中的各個字段及其詳細描述。欄位的語義,即包含在字段中的資訊的含義。程序何時 如何傳送訊息及對訊息進行響應的規則。有些應用層協議是由rfc文件定義的,因此它們...