TCP header 值初始化
TCP header value initialization
我需要能够在 TCP 层上生成 SIP 数据包,我正在为 TCP header 值执行以下初始化:
//TCP layer
//src dest port
*(uint16_t*)(pkt + OFF_SRC_PORT) = addrs->a->port;
*(uint16_t*)(pkt + OFF_DST_PORT) = addrs->b->port;
//seq number
*(uint64_t*)(pkt + OFF_DST_PORT+2) = htonl(sequence_no);
//ack number
*(uint64_t*)(pkt + OFF_DST_PORT+2+4) = htonl(ack_no);
//header len +reserved bits
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4) = htons(0x50);
//flags ACK PSH set
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1) = htons(0x18);
//Window size
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1) = htons(0x402);
//Checksum nothing, I have read this gets allocated on kernel level later
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1+2) = htons(0x0);
//Urg pointer
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1+2+2) = htons(0x0);
//Options missing
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1+2+2+2) = htons(0x00);
//Padding
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1+2+2+2+2) = htons(0x00);
执行上述初始化后,我在 tcp 转储中看到:
tcp dump
header 的初始化哪里出错了?
PS: 我根据我的接收设置计算了seq号,ack号。
也许试试这个:
//TCP layer
//src dest port
*(uint16_t*)(pkt + OFF_SRC_PORT) = addrs->a->port;
*(uint16_t*)(pkt + OFF_SRC_PORT + 2) = addrs->b->port;
//seq number
*(uint32_t*)(pkt + OFF_SRC_PORT + 4) = htonl(sequence_no);
//ack number
*(uint32_t*)(pkt + OFF_SRC_PORT + 8) = htonl(ack_no);
//header len +reserved bits
*(uint8_t*)(pkt + OFF_SRC_PORT + 12) = 0x50;
//flags ACK PSH set
*(uint8_t*)(pkt + OFF_SRC_PORT + 13) = 0x18;
//Window size
*(uint16_t*)(pkt + OFF_SRC_PORT + 14) = htons(0x0402);
//Checksum nothing, I have read this gets allocated on kernel level later
*(uint16_t*)(pkt + OFF_SRC_PORT + 16) = htons(0x0000);
//Urg pointer
*(uint16_t*)(pkt + OFF_SRC_PORT + 18) = htons(0x0000);
//No options (data offset is 20, i.e., 5 * 4), so don't add anything else to the TCP header
参考:RFC 793,第 3.1 节。 Header 格式:
TCP Header Format
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP Header Format
我需要能够在 TCP 层上生成 SIP 数据包,我正在为 TCP header 值执行以下初始化:
//TCP layer
//src dest port
*(uint16_t*)(pkt + OFF_SRC_PORT) = addrs->a->port;
*(uint16_t*)(pkt + OFF_DST_PORT) = addrs->b->port;
//seq number
*(uint64_t*)(pkt + OFF_DST_PORT+2) = htonl(sequence_no);
//ack number
*(uint64_t*)(pkt + OFF_DST_PORT+2+4) = htonl(ack_no);
//header len +reserved bits
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4) = htons(0x50);
//flags ACK PSH set
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1) = htons(0x18);
//Window size
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1) = htons(0x402);
//Checksum nothing, I have read this gets allocated on kernel level later
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1+2) = htons(0x0);
//Urg pointer
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1+2+2) = htons(0x0);
//Options missing
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1+2+2+2) = htons(0x00);
//Padding
*(uint16_t*)(pkt + OFF_DST_PORT+2+4+4+1+1+2+2+2+2) = htons(0x00);
执行上述初始化后,我在 tcp 转储中看到: tcp dump header 的初始化哪里出错了? PS: 我根据我的接收设置计算了seq号,ack号。
也许试试这个:
//TCP layer //src dest port *(uint16_t*)(pkt + OFF_SRC_PORT) = addrs->a->port; *(uint16_t*)(pkt + OFF_SRC_PORT + 2) = addrs->b->port; //seq number *(uint32_t*)(pkt + OFF_SRC_PORT + 4) = htonl(sequence_no); //ack number *(uint32_t*)(pkt + OFF_SRC_PORT + 8) = htonl(ack_no); //header len +reserved bits *(uint8_t*)(pkt + OFF_SRC_PORT + 12) = 0x50; //flags ACK PSH set *(uint8_t*)(pkt + OFF_SRC_PORT + 13) = 0x18; //Window size *(uint16_t*)(pkt + OFF_SRC_PORT + 14) = htons(0x0402); //Checksum nothing, I have read this gets allocated on kernel level later *(uint16_t*)(pkt + OFF_SRC_PORT + 16) = htons(0x0000); //Urg pointer *(uint16_t*)(pkt + OFF_SRC_PORT + 18) = htons(0x0000); //No options (data offset is 20, i.e., 5 * 4), so don't add anything else to the TCP header
参考:RFC 793,第 3.1 节。 Header 格式:
TCP Header Format 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ TCP Header Format