傳輸層和網路層的checksum區別,TCP cksum為何包含偽首部

philo_zhou發表於2023-03-27

  一直搞不清傳輸層和網路層的校驗和為什麼校驗內容不一樣,最近問了一些前輩,找尋了一些答案,總結一下自己的思考。

 

先說一下傳輸層(TCP)和網路層(IP)的校驗和:

  • TCP校驗和有偽首部、TCP herder、資料段。而IP的校驗和只覆蓋IP header,不覆蓋IP資料包中的任何資料。TCP校驗和、IP校驗和的計算方法是一致。
  • TCP的校驗和是必需的,而UDP的校驗和是可選的。
  • 12位元組偽首部:源IP地址、目的IP地址、保留位元組(置0)、傳輸層協議號(TCP是6)、TCP報文長度(報頭+資料)。

 

先提出三個問題:

  1. 為什麼IP算的cksum只有頭部呢?TCP卻包含資料?
  2. 這個偽首部啥意思,為什麼叫'偽'?
  3. 為何TCP算的cksum又加上偽頭部呢?

 

為什麼IP算的只有ip header呢?TCP卻包含資料?

  讓我們先回顧一下計算機網路裡說到的TCP五層模型,現實中是把物理層和資料鏈路層放一起了,都叫鏈路層。

  • 應用層 (application layer):應用程式提供服務
  • 傳輸層 (transport layer):為程式提供通訊服務,為上層提供端到端(終端使用者到終端使用者)的透明的、可靠的資料傳輸服務。擁塞控制,流控都在這。
  • 網路層 (internet layer):為主機提供通訊服務
  • 資料鏈路層 (data link layer):為同一鏈路主機提供資料傳輸服務
  • 物理層 (physical Layer):確保資料可以在各種物理媒介上進行傳輸,為資料的傳輸提供可靠的環境。

  首先,其實每一層都有自己的校驗方法?為什麼?校驗演演算法沒法百分百保證正確,越早發現越早丟棄。

  我自己的理解:每個層都是有自己負責的內容,按照這個思路去看。資料先加埠號封裝傳輸層,傳輸層負責的是為程式通訊確保了送到主機上正確的port(程式繫結的port)。加ip封裝網路層,ip層只是負責送到正確的機器上。加mac封裝物理層,控制網路卡需要網路卡驅動程式,網路卡驅動從ip模組獲得包後將其複製到網路卡的快取中,然後在頭部加報頭和起始幀分界符,末尾加上幀校驗序列(迴圈冗餘演演算法(CRC)生成的fcs校驗序列)。經過網路卡將數字訊號轉化為電訊號,透過網線傳送出去。這裡負責的是真正傳輸內容。首先鏈路層這裡是簡單確保整個報文沒有被改變,交換機會解析MAC然後校驗這個fcs,這裡鏈路層保證資料可靠專屬。路由器收到之後會解析到ip header,計算fcs和ip校驗和,也就是路由器裡面相當於也有fcs保證資料的正確,儘管很羸弱,ip層的任務就是隻確保ip是對的,就像貼在箱子上的快遞單做的事情,不關心箱子裡的東西對不對,當然路由器會查表封裝新的MAC頭從計算fcs。真正到了主機,也會校驗fcs,ip校驗和,到了傳輸層,需要向上交付資料,所以傳輸層這裡校驗和會包含資料段。

  TCP/IP地分層,讓每一層注重自己的事情,IP不會過問資料,TCP層需要保證資料,但是為什麼鏈路層有了校驗,還需要其它層保證呢?舉個簡單的例子,路由器拆了以太幀頭之後放到自己的緩衝區,在快取去裡這個時候報文出錯了,路由器吧錯誤的報文計算一下fcs,封裝好,繼續發,這樣之後鏈路層再校驗,也沒問題,還是需要更上層的校驗。

 

  剛才說的這些校驗都是低階的校驗,TCP/IP提出的時代,裝置能力還是很差的,只能用這種簡單的CRC去校驗,但比如一個"10 20"變成的"20 10",對於CRC是校驗不出來的,因為CRC只管累加沒問題。

 

這個偽首部啥意思,為什麼叫'偽'? 

12位元組偽首部:源IP地址、目的IP地址、保留位元組(置0)、傳輸層協議號(TCP是6)、TCP報文長度(報頭+資料)。

  計算checksum時,其實整個包的資訊都可以獲取,傳輸層直接從ip header拿出源ip、目的ip、傳輸協議號用來計算checksum,這些欄位並不是在tcp報文裡,所以是偽,只是計算時帶上而已。

  收端也是,收到之後連帶這幾個欄位校驗一下,實際上tcp報文並沒有這幾個欄位的內容。

 

為何TCP算的cksum又加上偽頭部呢?

  這更算一個歷史遺留問題,過去還沒有光纖,沒有現在這些可靠性高的傳輸技術,之前線路誤位元速率非常高,為了確保資料包到收端的正確性,這又相當於多加了一點保證,並且幾乎沒有損失效能。

 

IPV6和IPV4

IPV6省略了IP層的校驗和,引入了更加可靠的鏈路層錯誤檢測和糾正機制。因為當前的裝置不再像之前錯誤那麼多,付出校驗所有包的代價去轉發,並不值得,有其他更好的錯誤檢測,這樣像路由器這樣的網路裝置,就不需要再校驗了,提高了效能。

 

延伸

為什麼應用層還要做資料完整性校驗?

推薦讀一下這個論文:https://zhuanlan.zhihu.com/p/55311553

  

相關文章