我正在尝试实现原始tcp连接,以将查询发送到whois服务器。在我发送syn数据包后,服务器用syn / ack答复(然后我的PC发送了第一个数据包,但是防火墙规则解决了此问题)。之后,我发送seq = 1的ack数据包(第一个数据包的seq设置为0),而ack vlaue设置为一个(加上我将标志设置为ACK)。问题是服务器忽略了该ack数据包...有时它重发了更多的syn / acks,有时在我的ack数据包之后也没有发送任何内容(也加入了whois查询数据包...)。 我认为问题出在我的ack数据包实现中,但是我无法找到哪里... 任何帮助或提示,将不胜感激:)
void create_tcp_header(struct tcphdr *tcph, unsigned short source_port, unsigned short destination_port, int syn, int fin, int seq, int ack)
{
if (ack == 1)
{
tcph->ack = htonl(ack);
tcph->th_flags |= TH_ACK;
}
else
{
tcph->ack = 0;
}
tcph->syn = syn;
tcph->rst = 0;
tcph->source = source_port;
tcph->dest = destination_port;
tcph->urg = 0;
tcph->fin = fin;
tcph->psh = 0;
tcph->window = htons(TCP_MAXWIN);
tcph->urg_ptr = 0;
tcph->seq = htonl(seq);
tcph->ack_seq = htonl(seq);
tcph->doff = 5;
tcph->check = 0;
}