簡體   English   中英

自定義協議的應用程序數據是否需要校驗和?

[英]Is a checksum needed for application data of a custom protocol?

由於通過網絡傳輸的數據包在不同的層具有校驗和,因此以太網和 IPv4的標頭具有校驗和,因此TCP的校驗和甚至覆蓋了整個段。

我知道,從應用程序層的角度來看,損壞的數據包可以滑入而不會被以太網/ IP / TCP丟棄是不可能的,因為它們的校驗和有可能是正確的,只有概率很小。

我正在為IM應用程序設計自定義二進制協議。 我的問題是我需要添加校驗和以確保我的應用程序數據的完整性嗎? 在實踐中真的需要校驗和嗎?

在這個問題上有實際的研究。 它很舊,但是與手頭的問題非常相關。

喬納森·斯通和克雷格·帕特里奇(Jonathan Stone)和克雷格·帕特里奇(Craig Partridge)於2000年發表的論文被稱為“當CRC和TCP校驗和不一致時”,該論文調查數據包和幀錯誤,並查看TCP校驗和有多錯誤,但以太網CRC很好。 您可以在此處找到PDF。 這是重要的位。

從摘要:

過去兩年中對Internet數據包的跟蹤顯示,即使在鏈路級CRC應該捕獲除40億個錯誤之外的所有錯誤的鏈接上,1100個數據包中的1個數據包和32,000個數據包中的1個數據包也無法通過TCP校驗和。

從結論(我的一些重點)

實際上,要求校驗和每幾千個數據包檢測一次錯誤。 在消除了校驗和總是捕獲的那些錯誤之后,數據表明,平均而言, 在100億個數據包中和數百萬個數據包中的一個數據包之間將有一個未被發現的錯誤 確切范圍取決於傳輸的數據類型和所遍歷的路徑。 盡管這些可能性似乎很大,但它們並不鼓勵自滿。 在每條痕跡中,一兩個“壞蘋果”主機或路徑會導致很大比例的錯誤。 對於偶然遇到“壞蘋果”主機之一的應用程序,直到接收到損壞的數據的預期時間可能只有幾分鍾。 與未檢測到的本地I / O(例如磁盤驅動器)錯誤率相比,這些錯誤率令人不安。 我們的結論是,至關重要的應用程序應強烈考慮使用應用程序總和來擴展TCP校驗和

我不知道對此問題有任何新的研究(如果您不知道,請告訴我!),因此,從那時起,Internet可能會變得更加可靠,並且本文中的數字可能無關緊要。

但是, 這一點很重要 ,已經過去了17年,自撰寫該論文以來,Internet流量就激增了。 在1Gbps的,這是不是一種罕見的連接速度的今天,你發送約81K完整的TCP段,1460個字節的數據, 每秒 (或更多,如果數據包是小)。 那是每12.5秒發送一百萬個大數據包,大約在3.5小時內返回十億個(如果數據包很小,則又增加了十億個)。

因此,請回答您的問題-這取決於。 對於傳輸大文件或其他數據,如果數據本身未受到任何保護,我肯定會添加其他檢查。 對於將很少的數據推入網絡的消息傳遞,TCP的校驗和可能會很好,可能會對輸入進行一些完整性檢查,以確保其格式正確,並且各種參數和字段感。

由於數據包在網絡中被破壞,我不會打擾校驗和。

但是,由於您正在使用的協議可能會在開放的Internet上使用,因此您將需要為意外的應用程序發送udp數據包或與接收/偵聽端口建立tcp連接的罕見情況做准備。 此外,端口掃描和黑客/腳本小子敲門的次數可能會更少。

因此,您應該制定協議,以便輕松丟棄此類流量。 在每次傳輸中使用校驗和都不是一種明智的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM