TCPのチェックサムを数日間行うのに問題があります。私はインターネット上の多くの情報源を見てきましたが、私が見た例のどれもTCPチェックサムを行う方法を示していません。私もRFCドキュメントを見ましたが、それでも問題があります。
以下は、チェックサムを生成するために使用しているコードです。
unsigned short checksum(unsigned short * buffer, int bytes)
{
unsigned long sum = 0;
unsigned short answer = 0;
int i = bytes;
while(i>0)
{
sum+=*buffer;
buffer+=1;
i-=2;
}
sum = (sum >> 16) + (sum & htonl(0x0000ffff));
sum += (sum >> 16);
return ~sum;
}
この関数は、IPチェックサムに対して機能します。
以下は、TCPヘッダー用に作成した構造体です。
struct tcp_header
{
unsigned short tcp_sprt;
unsigned short tcp_dprt;
unsigned int tcp_seq;
unsigned int tcp_ack;
unsigned char tcp_res:4;
unsigned char tcp_off:4;
unsigned char tcp_flags;
unsigned short tcp_win;
unsigned short tcp_csum;
unsigned short tcp_urp;
};
私はWiresharkを使用してこれらのパケットをテストしてきましたが、間違っているのはチェックサムだけです。
最後に、TCPヘッダーとIPヘッダーからの情報をロードする疑似ヘッダー構造体を次に示します。
struct pseudoTcpHeader
{
unsigned int ip_src;
unsigned int ip_dst;
unsigned char zero;//always zero
unsigned char protocol;// = 6;//for tcp
unsigned short tcp_len;
struct tcp_header tcph;
};
この構造体に正しい情報をロードしたら、疑似ヘッダー構造体全体でチェックサム関数を使用して、TCPチェックサムをその値に割り当てます。私が提供したものに何か問題がありますか?問題がここにない場合、それは私が見ることができない不注意なエラーである可能性があります。