【发布时间】:2020-02-02 09:15:45
【问题描述】:
在解析 TCP 头时,有一个名为数据偏移量的字段,长度为 4 位。解析header时,需要将字段反转为host oder。问题来了:当反转这些不是 16 位或 32 位长的字段时,这意味着我不能使用 ntohs 和 ntohl,我是按字段还是按字节反转它们,或者以其他方式?
假设一个字节包含两个字段,f1 和 f2,每个字段大小为 4 位。数据为1000 0100。对于逐场反转,结果应为0001 0010。对于逐字节反转,结果为0010 0001。哪一个是正确的?
更新:
这是我用来解析标题的struct:
#pragma pack(push, 1)
struct tcp_hdr_t {
uint16_t src_port;
uint16_t dst_port;
uint32_t seq;
uint32_t ack;
uint8_t data_offset : 4;
uint8_t f_reserved : 3;
uint8_t f_ns : 1;
uint8_t f_cwr : 1;
uint8_t f_ece : 1;
uint8_t f_urg : 1;
uint8_t f_ack : 1;
uint8_t f_psh : 1;
uint8_t f_rst : 1;
uint8_t f_syn : 1;
uint8_t f_fin : 1;
uint16_t window_size;
uint16_t checksum;
uint16_t urgent_p;
};
#pragma pack(pop)
如果我不反转数据偏移量和标志字段,则结果与 Wireshark 的结果相比是错误的。
如您所见,原始数据是0xa002,但结果似乎是0xa,因为数据偏移量不需要反转,但标志部分似乎反转了。
【问题讨论】:
-
这有助于回答您的问题吗? stackoverflow.com/questions/3022552/…
-
有点意思,但我仍然对要反转的部分感到困惑。不管怎么说,还是要谢谢你。 :)
-
8 位或更少 - 无事可做,这完全是关于字节顺序而不是位顺序。 16、32 - 对 64 位使用 ntohs 和 ntohl(根据需要使用相反的值 - 不保证对称) - 使用 htobe64 和 be64toh,但您可能不会在标题中找到它们。
标签: c++ c networking tcp