目的是為了發現tcp首部和資料在傳送端到接收端之間發生的任何改動。如果接收方檢測到檢驗和有差錯,則tcp段會被直接丟棄。
tcp在計算檢驗和時,要加上乙個12位元組的偽首部。偽首部顧名思義就是假的首部,既不往上傳也不往下傳,只是用於校驗tcp/udp報文段。
偽首部共有12位元組,包含ip首部的一些字段,有如下資訊:32位源ip位址、32位目的ip位址、8位保留位元組(置0)、8位傳輸層協議號(tcp是6,udp是17)、16位報文長度(首部+資料)。
偽首部是為了增加校驗和的檢錯能力:通過偽首部的目的ip位址來檢查tcp報文是否收錯了、通過偽首部的傳輸層協議號來檢查傳輸層協議是否選對了。
眾所周知,ip首部的校驗和會校驗ip,那麼為何在tcp校驗和還需要校驗ip呢?因為資料報經過中間器件(路由器)的時候,這些中間器件可能會修改ip首部的內容,例如同時修改目的ip和ip首部校驗和。這樣一來將導致錯誤的接收方接收到該資料報。因此在tcp的偽首部加上ip位址,可以防止錯收報文。既然中間器件可以修改ip首部的資訊,為什麼不將tcp的校驗和一起修改呢,這樣不就使得接收方誤收資料報嗎?當然可以,但是中間器件一般不會修改tcp層的資訊。
檢驗和計算過程(以tcp校驗為例)
tcp首部校驗和計算三部分:tcp首部+tcp資料+tcp偽首部。
傳送端:
首先,把偽首部、tcp報頭、tcp資料分為16位的字,如果總長度為奇數個位元組,則在最後增添乙個位都為0的位元組。
把tcp報頭中的校驗和字段置為0。
其次,用反碼相加法(對每16bit進行二進位制反碼求和)累加所有的16位字(進製也要累加,進製則將高位疊加到低位)。
最後,將上述結果作為tcp的校驗和,存在檢驗和字段中。
接收端:
同樣利用反碼求和,高位疊加到低位, 如計算結果的16位中每一位都為1,則正確,否則說明發生錯誤。
驗證示例:
校驗和 反碼求和過程
以4bit 為例
傳送端計算:
資料: 1000 0100 校驗和 0000
則反碼:0111 1011 1111
疊加: 0111+1011+1111 = 0010 0001 高於4bit的, 疊加到低4位 0001 + 0010 = 0011 即為校驗和
接收端計算:
資料: 1000 0100 檢驗和 0011
反碼: 0111 1011 1100
疊加: 0111 + 1011 +1100 = 0001 1110 疊加為4bit為1111. 全為1,則正確
udp檢驗和
基本過程和tcp檢驗和相同,不同的是udp的偽首部中8位傳輸層協議號是17而tcp是6。
ip檢驗和
ip首部中的檢驗和只覆蓋ip的首部,不覆蓋ip資料報中的任何資料
三者檢驗和的異同
tcp和udp檢驗和是乙個端到端的檢驗和,由傳送端計算,然後由接收端驗證。
tcp和udp檢驗和覆蓋首部和資料,而ip首部中的檢驗和只覆蓋ip的首部,不覆蓋ip資料報中的任何資料。
tcp的檢驗和是必需的,而udp的檢驗和是可選的。
tcp和udp計算檢驗和時,都要加上乙個12位元組的偽首部。
(全文完)
TCP UDP 校驗和 偽首部
tcp和udp兩個協議相對應的首部,都有一項是校驗和。校驗和是幹什麼的?在接收端收到資料時,判斷協議首部和資料是否被破壞。是在資料報中真實存在的一段資料。偽首部是幹什麼的?偽首部用來生成校驗和,偽首部只是一種根據真實的首部的部分資料抽象出來的一種資料結構。並沒有在資料報中真實的存在。偽首部的構成 t...
TCP UDP偽首部詳解
最近在讀stevens 的tcp ip詳解,其中介紹到了udp和tcp偽首部但是介紹的不夠詳細,只說是為了udp和tcp校驗和存在的 同時給出了乙個偽首部的圖,是直接加在udp首部前面的,給我的困惑貌似是真實存在的,其實這個圖應該用虛線表示,下面就我的理解,介紹一下偽首部 1.偽首部並非tcp ud...
ip首部校驗和計算
ip首部校驗和的計算方法 1.把校驗和字段清零。2.然後對每16位 2位元組 進行二進位制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。接下來詳細描述反碼求和的步驟 看下面的 演算法 short checksum ushort buffer,int size if size ck...