1. 程式人生 > >TCP/UDP 校驗和、偽首部

TCP/UDP 校驗和、偽首部

tcp和udp兩個協議相對應的首部,都有一項是校驗和。

校驗和是幹什麼的?
在接收端收到資料時,判斷協議首部和資料是否被破壞。是在資料包中真實存在的一段資料。
偽首部是幹什麼的?
偽首部用來生成校驗和,偽首部只是一種根據真實的首部的部分資料抽象出來的一種資料結構。並沒有在資料包中真實的存在。
偽首部的構成
TCP的校驗和與UDP包的校驗和相似,將下圖中UDP包長度改為TCP包長度就是TCP偽首部的構成。

在這裡插入圖片描述

  • 源IP地址:32位
  • 目標IP地址:32位
  • 包長度:16位
  • 協議號:8位

由於偽首部的全長是16的倍數(後面解釋為什麼是16),目前是32+32+16+8=88,最近的一個16的倍數是96,所以需要補8位,偽首部中的填充就是將需要補的8位用0填充。

為什麼偽首部必須是16的倍數?
是因為利用偽首部生成校驗和的流程。流程如下
  • 拿到偽首部以後,以16位為單位,將96位的偽首部劃分成4個16位的數。
  • 將這4個16位的二進位制數相加。
  • 取反。
  • 得到16位校驗和(16個二進位制的數,可化為一個16進位制的數)。
接收端校驗過程

接收端收到資料後根據TCP首部資料構造出偽首部。重複生成校驗和一直到取反的前一步。將得到的結果值與tcp首部中的校驗和相加,如果是16個1。那麼校驗成功。