當前位置:編程學習大全網 - 源碼下載 - TCP是可靠傳輸,應用層是否還需要做校驗

TCP是可靠傳輸,應用層是否還需要做校驗

最近面試了很多的學生,發現很多TCP的新手對於TCP的使用有壹些誤區,而這些坑也是當初我曾經疑惑過得地方。網上很少有文章對這些問題有過詳細的解析,即是有也只是直接給出結論和做法,沒有人將其中的來龍去脈講解清楚,所以我將這些問題的來龍去脈在這壹系列的文章中講述出來,希望能讓廣大TCP的新手避開這些坑。

我面試時經常會問的壹個問題是TCP如何保證數據的正確性,保證數據內容不會出錯。大部分人就會開始說丟包重傳、接收確認之類的東西,但這些都扯偏了,只要少數人能夠正確回答題目要問的問題: 首部校驗

對於能答上這個問題的人,我會進壹步問,這個校驗機制能夠確保數據傳輸不會出錯嗎?

答案是不能 ,但是至今為止我沒有遇到任何壹個面試者能夠正確回答這個問題。

TCP協議中規定,TCP的首部字段中有壹個字段是校驗和,發送方將偽首部、TCP首部、TCP數據使用累加和校驗的方式計算出壹個數字,然後存放在首部的校驗和字段裏,接收者收到TCP包後重復這個過程,然後將計算出的校驗和和接收到的首部中的校驗和比較,如果不壹致則說明數據在傳輸過程中出錯。 這就是TCP的數據校驗機制

但是這個機制能夠保證檢查出壹切錯誤嗎?顯然不能 。因為這種校驗方式是累加和,也就是將壹系列的數字(TCP協議規定的是數據中的每16個比特位數據作為壹個數字)求和後取末位。

但是小學生都知道A+B=B+A,假如在傳輸的過程中有前後兩個16比特位的數據前後顛倒了(至於為什麽這麽巧合?我不知道,也許路由器有bug?也許是宇宙中的高能粒子擊中了電纜?反正這個事情的概率不為零,就有可能會發生),那麽校驗和的計算結果和顛倒之前是壹樣的,那麽接收端肯定無法檢查出這是錯誤的數據。

至於應用層收到這個數據後會怎麽樣,不清楚,只能看運氣,立刻崩潰那是比較好的結果了。

這篇文章 是亞馬遜的壹次故障記錄,這個故障中就是遇到了這個問題,損失很嚴重。

既然TCP自帶的校驗算法並不靠譜,我們就需要在應用層自己建立壹套新的數據校驗機制。

最簡單的就是使用MD5校驗,在發送數據前將數據使用MD5加密,並將MD5摘要壹起發送,接收端接收數據後將數據再次用MD5加密,如果得到的摘要和收到的摘要壹致說明數據正確。

上文亞馬遜的處理方式就是這樣。

同時使用TCP的加和校驗和MD5加密,雙管齊下,由於他們的加密原理大相庭徑,所以基本不可能出現某種傳輸錯誤但是依然能通過雙重校驗。當然了這種情況出現的可能性到底是不是0需要嚴格的數學證明,但是我水平有限所以無法給出。但是妳依然可以顯然的看出這種情況出現的概率比單壹壹種校驗機制被巧合的錯誤通過的概率要小很多個數量級。

當然另壹種校驗方式除了MD5校驗,還可以使用其他的加密校驗算法加密。

TCP數據的校驗漏洞是個很冷門的知識,可能只有刨根問底的人才會對此有過思考,因為普通的人遇到它的概率實在小得可憐,只有那種到了很大處理規模的服務器上才可能見到壹次,所以通常的網絡開發中不處理這個問題也沒有什麽。

什麽時候應該考慮處理這種情況也並沒有什麽標準,我認為當妳的服務器出現校驗漏洞會造成很大的損失的時候妳就必須要處理它了,像上文亞馬遜的那次故障損失慘重,如果妳的服務器不會有什麽嚴重損失,就讓他宕機壹次也無所謂。

TCP數據的校驗的知識並不是網絡開發中的關鍵點,但是通過這個問題可以看出壹個人對TCP協議的了解以及思考。所以寫這邊文章希望能夠讓面試者對TCP協議有更多深入的了解與思考,取得更好的面試結果。

1. TCP新手誤區--數據校驗的意義

  • 上一篇:橡膠配方設計與性能的關系
  • 下一篇:java,python,go可以同時學嗎
  • copyright 2024編程學習大全網