libpcap 中的确认号
Acknowledgment Number in libpcap
我正在尝试使用 libpcap 打印确认编号。我确实知道我会得到与我在 pcap 文件中看到的不同的确认号。我的问题是,在 pcap 文件中,数据包编号 10 、 11 和 12 具有不同的确认编号,当我打印它们时,它们都具有相同的编号。谁能告诉我如何打印确认号。
PCAP文件:
Packets in wireshark
这是输出:
数量:10
时间:358.312120
TCPACK:14817
ack_seq: 32784
数量:11
时间:358.313252
TCPACK:14817
ack_seq: 32784
数量:12
时间:358.313414
TCPACK:14817
ack_seq: 32784
这是部分代码:
struct tcp_hdr {
u_short th_sport; // source port
u_short th_dport; // destination port
u_int32_t th_seq; // sequence number
u_int32_t th_ack; // acknowledgement number
u_int32_t ack_seq;
u_char th_offx2; // data offset, rsvd
#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)
u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS
(TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
u_short th_win; // window
u_short th_sum; // checksum
u_short th_urp; // urgent pointer
};
if (tcp->th_flags & TH_ACK)
{
struct timeval time= header->ts;
int tcpack = ntohs(tcp->th_ack);
int seq = ntohs(tcp->th_seq);
int ack_seq=ntohs(tcp->ack_seq);
printf("num: %d \n", pcount ); //print packet number
printf("Timest: %d.%06d \n",((int)time.tv_sec % 1000),(int)time.tv_usec); //print packet timestamp
printf("tcpACK: %d \n", tcpack );
printf("ack_seq: %d \n\n", ack_seq );
}
首先这个声明是不行的:
u_int32_t ack_seq;
在 th_ack 之后,您有偏移量(4 位)、保留位(3 位)和标志(9 位)。参见:https://en.wikipedia.org/wiki/Transmission_Control_Protocol
其次,当 SEQ 和 ACK 为 4 字节长时,您正在使用 short int 的转换宏。你应该使用 ntohl。第三,不要使用 int 因为它是有符号的,使用 unsigned int 并将其打印为 unsigned it。
unsigned int tcpack = ntohl(tcp->th_ack);
unsigned int seq = ntohl(tcp->th_seq);
使用无符号整数或uint32_t。
printf("tcpACK: %u \n", tcpack );
printf("tcpACK: %X \n", tcpack );
printf("seq: %u \n\n", seq );
printf("seq: %X \n\n", seq );
我正在尝试使用 libpcap 打印确认编号。我确实知道我会得到与我在 pcap 文件中看到的不同的确认号。我的问题是,在 pcap 文件中,数据包编号 10 、 11 和 12 具有不同的确认编号,当我打印它们时,它们都具有相同的编号。谁能告诉我如何打印确认号。
PCAP文件: Packets in wireshark
这是输出:
数量:10 时间:358.312120 TCPACK:14817 ack_seq: 32784
数量:11 时间:358.313252 TCPACK:14817 ack_seq: 32784
数量:12 时间:358.313414 TCPACK:14817 ack_seq: 32784
这是部分代码:
struct tcp_hdr {
u_short th_sport; // source port
u_short th_dport; // destination port
u_int32_t th_seq; // sequence number
u_int32_t th_ack; // acknowledgement number
u_int32_t ack_seq;
u_char th_offx2; // data offset, rsvd
#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)
u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS
(TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
u_short th_win; // window
u_short th_sum; // checksum
u_short th_urp; // urgent pointer
};
if (tcp->th_flags & TH_ACK)
{
struct timeval time= header->ts;
int tcpack = ntohs(tcp->th_ack);
int seq = ntohs(tcp->th_seq);
int ack_seq=ntohs(tcp->ack_seq);
printf("num: %d \n", pcount ); //print packet number
printf("Timest: %d.%06d \n",((int)time.tv_sec % 1000),(int)time.tv_usec); //print packet timestamp
printf("tcpACK: %d \n", tcpack );
printf("ack_seq: %d \n\n", ack_seq );
}
首先这个声明是不行的:
u_int32_t ack_seq;
在 th_ack 之后,您有偏移量(4 位)、保留位(3 位)和标志(9 位)。参见:https://en.wikipedia.org/wiki/Transmission_Control_Protocol
其次,当 SEQ 和 ACK 为 4 字节长时,您正在使用 short int 的转换宏。你应该使用 ntohl。第三,不要使用 int 因为它是有符号的,使用 unsigned int 并将其打印为 unsigned it。
unsigned int tcpack = ntohl(tcp->th_ack);
unsigned int seq = ntohl(tcp->th_seq);
使用无符号整数或uint32_t。
printf("tcpACK: %u \n", tcpack );
printf("tcpACK: %X \n", tcpack );
printf("seq: %u \n\n", seq );
printf("seq: %X \n\n", seq );