起因
- Redis 默認未使用 tls 協議,是否意味着傳輸數據可能會出錯
答案應該是肯定的,但是想回答清楚並不是三言兩語能說清的,其中涉及的知識點很多。
背景信息
- Error detection and correction
- CRC Vs Checksum
- TCP Checksum Errors: Issues and Workarounds
- 什麼是CRC(Cyclic Redundancy Check)
- 網絡通訊協議圖2020版 network-protocol-map-2020.pdf
- Google搜索:網絡 site:www.colasoft.com.cn filetype:pdf
以太網幀格式、IP數據包格式、TCP/UDP數據段格式
- 以太網數據格式與封裝解封
- 物理層
- 無檢錯無糾錯
- 數據鏈路層
- CRC校驗、強校驗,檢查比特差錯,Cut-Through轉發不校驗;
- 檢測該幀是否出現差錯,佔 4 個字節(32 比特)。發送方計算幀的循環冗餘碼校驗(CRC)值,把這個值寫到幀裏。接收方計算機重新計算 CRC,與 FCS 字段的值進行比較。如果兩個值不相同,則表示傳輸過程中發生了數據丟失或改變。
- CRC校驗、強校驗,檢查比特差錯,Cut-Through轉發不校驗;
- 網絡層
- Checksum校驗,弱校驗,只覆蓋IP頭部(不包括 IP 數據),IPv6 無此機制;
- 傳輸層
- Checksum校驗,弱校驗,覆蓋頭部和數據,TCP的校驗和是必需的,而UDP的校驗和在IPv4中是可選的,在IPv6中則是強制的。
- TCP和UDP計算校驗和時,都要加上一個12字節的僞首部,包含如下信息:源IP地址、目的IP地址、保留字節(置0)、傳輸層協議號(TCP是6)、TCP報文長度(報頭+數據)。
- 僞首部是爲了增加TCP校驗和的檢錯能力:如檢查TCP報文是否收錯了(目的IP地址)、傳輸層協議是否選對了(傳輸層協議號)等。
- Checksum校驗,弱校驗,覆蓋頭部和數據,TCP的校驗和是必需的,而UDP的校驗和在IPv4中是可選的,在IPv6中則是強制的。
- 物理層
傳輸層安全協議
- 消息驗證碼( MAC ,如 HMAC ),強校驗,檢查某段消息的完整性以及作身份驗證
二層交換
- MAC幀經過路由器/二層交換機時IP地址和MAC地址的變化
- 二層交換機工作在數據鏈路層,只負責數據幀轉發(重要!),交換機端口沒有MAC地址,更沒有IP地址。
- 二層數據幀是由主機封裝的,以HTTP通信爲例(假設直接使用IP訪問),IP頭的dest ip和url中的ip一致,通過查詢本地路由表決定發送網卡後,src mac和src ip也決定了,dest mac是下一跳設備的mac(可能是目的設備的mac,也可能是默認網關的MAC)
三層轉發
- TCP/IP數據包在互聯網傳輸過程中,有哪些頭會保持不變?
- 必然改變的IP頭部:TTL、IP Checksum
- 可能改變的IP頭部:TOS、DF、Source IP、Destination IP
- 可能改變的TCP頭部:Source Port、TCP Checksum、MSS option
3. 問題淺析
-
網絡層次與專業名稱
-
- 以太網的CRC32只能保證同一個網段上的通信不會出錯(兩臺機器的網線插到同一個交換機上,這時候以太網的CRC是有用的)✅
- 當數據經過二層交換機時,在整個鏈路的數據傳輸過程當中,源IP、目的IP、源MAC、目的MAC地址都不改變,二層數據幀的內容和大小都是不變的,接收端接收到新幀後進行CRC校驗,只檢錯不糾錯,正確就轉發,錯誤就丟棄
- 路由器可能出現硬件故障,比方說它的內存故障(或偶然錯誤)導致收發IP報文出現多bit的反轉或雙字節交換,這個反轉如果發生在payload區,那麼無法用鏈路層、網絡層、傳輸層的check sum查出來,只能通過應用層的check sum來檢測。✅
- 由於IP頭部的TTL經過路由器時必然減一,IP Checksum需要重新計算,如果路由器處理數據包發生錯誤,那麼生成的Checksum也是錯誤的,接收者無法通過檢查IP Checksum發現這一錯誤
- 在進行NAT時,會重新計算TCP Checksum,此時設備發生錯誤,那麼生成的TCP Checksum也是錯誤的,接收者無法通過檢查TCP Checksum發現這一錯誤
- 源網絡地址轉換SNAT,src ip會發生變化
- 目的網絡地址轉換DNAT,dest ip會發生變化
- 端口地址轉換PAT,src port會發生變化
- 以太網的CRC32只能保證同一個網段上的通信不會出錯(兩臺機器的網線插到同一個交換機上,這時候以太網的CRC是有用的)✅
相關鏈接:
接下去的內容
- CRC和Checksum的算法實現
- IP、TCP/UDP的具體結構
- TLS詳解
- TCP/IP詳解
吐槽
我一個CRUD Boy和API Caller,既不回去當網工,又寫不了網絡編程,存儲是補課罷了。