IP首部结构如下:
typedef struct _IPHeader // 20字节的IP头
{
    UCHAR     iphVerLen;      // 版本号和头长度(各占4位)
    UCHAR     ipTOS;          // 服务类型 
    USHORT    ipLength;       // 封包总长度,即整个IP报的长度
    USHORT    ipID;   // 封包标识,惟一标识发送的每一个数据报
    USHORT    ipFlags;       // 标志
    UCHAR     ipTTL;       // 生存时间,就是TTL
    UCHAR     ipProtocol;     // 协议,可能是TCP、UDP、ICMP等
    USHORT    ipChecksum;     // 校验和
union {
unsigned int   ipSource;
ip_address ipSourceByte;
};
union {
unsigned int   ipDestination;
ip_address ipDestinationByte;
};
} IPHeader, *PIPHeader;
首部长度为:
u_int ip_len = (pipheader->iphVerLen & 0xf) * 4;
TCP首部结构如下:
typedef struct _TCPHeader // 20字节的TCP头
{
USHORT sourcePort; // 16位源端口号
USHORT destinationPort; // 16位目的端口号
ULONG sequenceNumber; // 32位序列号
ULONG acknowledgeNumber; // 32位确认号
UCHAR dataoffset; // 高4位表示数据偏移
UCHAR flags; // 6位标志位
//FIN - 0x01
//SYN - 0x02
//RST - 0x04 
//PUSH- 0x08
//ACK- 0x10
//URG- 0x20
//ACE- 0x40
//CWR- 0x80 USHORT windows; // 16位窗口大小
USHORT checksum; // 16位校验和
USHORT urgentPointer; // 16位紧急数据偏移量 
} TCPHeader, *PTCPHeader;那么TCP首部长度该怎么计算呢?

解决方案 »

  1.   

    TCP首部 = 16位源端口号+16位目的端口号+32位序号+32位确认序号+4位首部长度+保留位(6位)+URG+ACK+PSH+RST+SYN+FIN+16位窗口大小+16位检验和+16位紧急指针
      

  2.   

    http://blog.csdn.net/templar1000/archive/2005/01/28/272451.aspx
      

  3.   

    typedef struct
    {
     WORD SPort;                      //16位源端口号
     WORD DPort;                      //16位目的端口号
     DWORD SeqNum;                     //32位序号
     DWORD AckNum;                     //32位确认序号
     BYTE Reserved1          : 4;        //保留4位
     BYTE HLen                  : 4;        //4位首部长度 BYTE CB_FIN      : 1;    //发端完成发送任务
     BYTE CB_SYN    : 1;    //同步序号用来发起一个连接
     BYTE CB_RST     : 1;    //重建连接
     BYTE CB_PSH    : 1;    //接收方应该尽快将这个报文段交给应用层
     BYTE CB_ACK   : 1;    //确认序号有效
     BYTE CB_URG   : 1;    //紧急指针有效 BYTE Reserved2   : 2;        //保留2位
     WORD Window;                //16位窗口大小
     WORD Checksum;             //16位检验和
     WORD UrgPtr;                   //16位紧急指针
    } TCPHEADER;
    BYTE不是八个二进制位吗?
    这个定义也有问题阿~
      

  4.   

    http://wenku.baidu.com/view/5c288b51ad02de80d4d84066.html
      

  5.   

    BYTE CB_FIN      : 1; 这个是位域,说明CB_FIN  只占一位BYTE CB_FIN      : 4; 这个是位域,说明CB_FIN  只占4位这样的定义通常出现在通信协议实现上