【发布时间】:2012-02-09 08:06:56
【问题描述】:
我已经有好几天在为 TCP 做校验和时遇到问题了。我查看了 Internet 上的许多资源,但我所看到的示例都没有向您展示如何进行 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 校验和分配给那个值。你觉得我提供的有什么问题吗?如果问题不在这里,那可能是我看不到的粗心错误。
【问题讨论】:
-
你如何将信息加载到结构中,它来自哪里?
标签: c tcp checksum raw-sockets