我需要能够在TCP层上生成SIP数据包,我正在对TCP标头值执行以下初始化:
//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 标头的初始化在哪里出错? PS:我根据接收设置计算了序列号,确认号。
答案 0 :(得分:0)
也许试试看:
//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节。标题格式:
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