看板 C_and_CPP 關於我們 聯絡資訊
小弟最近在學習一些網路的原理 所以試著用程式寫一些低階的網路封包控制 我的作業系統是 Ubuntu 12.10 編譯器是 gcc/g++ 首先是IP header的部分 我實作了ping這個工具 在IP header的checksum我用一個函式GenerateChecksum(char* buff, int size)來計算 詳細的程式碼網路上範例很多,我就先不貼上來了 如果有需要請跟我說,我再補上 我從ubuntu去連線一台windows 7 然後在windows 7上面安裝wireshark來觀察我的封包是否正確 結果在這一個部分是沒有問題的 已經可以ping到windows7了 接下來我想實作connect的三方交握 可是當第一個syn送到windows 7時 wireshark就跟我說tcp 的checksum是不正確的 ( 我一樣使用GenerateChecksum這個函式,IP的checksum也一樣沒有問題 ) 我在網路上查了一些資料 我發現好幾篇文章的tcp checksum計算方式都不一樣 (但計算函式都大同小異) 以下是我看到的幾個方式,但我試過都不行 方法一: 送出封包內容 ip header + tcp header + pseudo header tcp checksum 計算方式 tcp header + pseudo header 方法二 送出封包內容 ip header + tcp header + pseudo header tcp checksum 計算方式 pseudo header + tcp header + pseudo header 與一的差別為計算 tcp checksum時在前面又接上了一個pseudo header去計算 不過我不太了解為什麼要這樣做 若有人之道也請跟我說 方法三: 送出封包內容 ip header + tcp header + pseudo header tcp checksum 計算方式 pseudo header + tcp header 不過以上三種方式都不行 請問tcp checksum到底應該如何計算才是正確的 寫得好像有點複雜,如果有不清楚的地方請向我提出,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.220.71.34
purincess:去看wireshark的checksum怎麼算的 XD 02/28 19:00