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