FC2ブログ
--.--
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

05.26
Sat
こんちは

TCPヘッダやらIPヘッダにくっつけるチェックサムの事です。

いつもそうなんですが、今回の記事はいつもよりまして嘘を書いてる可能性があるので、

あくまで参考程度に。若しくは見ないことをお勧めします。

まずチェックサムの出し方。単刀直入に言うと1の補数和の1の補数。

補数とか言葉の定義とかいろいろその辺りはめんどくさいので、

求め方をC言語を使ったとして単純に書きますが、


1.まず構造体で各ヘッダを作る。

2.構造体の各値を足し算して、16bitを溢れた値を最下位ビットに足し算していく

3.最後にビットを反転させる ~sumみたいな感じ

それを自分なりに書いてみました

unsigned short int mychecksum(unsigned short int *ptr , int size)
{
	int index = 0;
	int sum = 0;
	int carry = 0;
	for (index = 0;index<size ; index++)
	{
		sum += *(ptr+index);		
		if (sum > 0x0000FFFF)
		{
		         carry = sum >> 16;
			sum = (sum & 0x0000FFFF) + carry;

		}
	}
	return (unsigned short int)~sum;
}


・まず*ptrに対象の構造体の先頭ポインタを渡す.


・ループの中でポインタにindexを足し算することで
 次の値次の値...を参照するようになるそれをsizeまで行いsumに足していく


・*ptrはshort型なのでindexを足すと2byte = 16bit = 2octet進む


・sumに足してる間に桁溢れが生じたら、その溢れた値を最下位ビットに足し込む。
 桁が溢れるということは(16bit以上になるということは)
 今int型でsumを宣言してるので、sumが0x0000FFFF以上になるということなので
 それを条件判断に使ってる


・16進数の1桁の重みは2進数の4桁分なので、キャリを求めるには
 右に16ビットシフトさせる。イメージ図はこんな感じ↓
checksum.png


・で、最後に
 新しいsumをsumと0x0000FFFFとのAND演算の結果 + キャリとするんだけど
 AND演算を行う理由は桁上りが残ってる上位16ビットを消すためにする。
 キャリを足す理由はそもそも1の補数和だから。



これでやっとチェックサムを求める関数が書けた。と思う。たぶん。三割くらいの確率であってると思う←

次のブログのネタはこの関数でどこの部分のチェックサムを求めればいいのかのメモをしてみる

TCPのチェックサムを求めるのに疑似ヘッダが必要になってくるので

では最後に,上記の関数を用いたわかりやすい例を書いておきます。

#include <stdio.h>


unsigned short int checksum(unsigned short int *ptr , int size)
{
	int index = 0;
	int sum = 0;
	int carry = 0;
	for (index = 0; index<size; index++)
	{
		sum += *(ptr+index);		
		if (sum > 0x0000FFFF)
		{
		         carry = sum >> 16;
			sum = (sum & 0x0000FFFF) + carry;

		}
	}
	return (unsigned short int)~sum;
}


int main(void)
{
	
	unsigned short int arry[] = {
		0x1234 ,
		0xabcd ,
		0x4321 ,
		0xdcba ,
		0xffab ,
		0xed21 ,
	};

	printf("CHECK SUM = %x\n" , checksum(arry , sizeof(arry)/sizeof(arry[0])));



	return 0;
}


手計算で

0x1234 + 0xabcd + 0x4321 + 0xdcba + 0xffab + 0xed21

をやって、

多分0x3cca8になるので

0xcca8 + 0x3をして

それを否定すれば同じ結果になるはずです
スポンサーサイト

comment 0 trackback 0
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/117-05abd225
トラックバック
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。