我最近几天一直在尝试计算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校验和赋值给该值。您是否看到我提供的任何问题?如果问题不在这里,那么可能是我看不到的粗心错误。