2014-01-14 7 views
1

При вычислении контрольной суммы мне нужно уточнить правильность использования заголовка TCP и псевдодателя. Будет ли псевдо-заголовок должен появляться сразу после заголовка IP и до реального TCP-заголовка? Вот что у меня есть:Заголовок и контрольная сумма TCP

IPHeader *iph = (IPHeader *)(packet + ETHER_SIZE); //ETHER_SIZE == 14 
ipLen = ntohs(iph->totLen) * 4; 
TCPPseudo *tcps = (TCPPseudo *)(packet + ETHER_SIZE + ipLen); 
TCPHeader *tcp = (TCPHeader *)(tcps + sizeof(TCPPseudo)); 

Вот мои заголовки:

typedef struct __attribute__((__packed__)) IPHeader { 
    #if __BYTE_ORDER__ == __LITTLE_ENDIAN__ 
    uint8_t hdrLen:4; 
    uint8_t version:4; 
    #else 
    uint8_t version:4; 
    uint8_t hdrLen:4; 
    #endif 
    uint8_t TOS; 
    uint16_t totLen; 
    uint16_t id; 
    uint16_t offset; 
    #define DF 0x4    
    #define MF 0x2   
    #define OFF 0 
    uint8_t TTL; 
    uint8_t protocol; 
    uint16_t checksum; 
    struct in_addr srcIP; 
    struct in_addr destIP; 
}IPHeader; 

typedef struct __attribute__((__packed__)) TCPHeader { 
    uint16_t srcPort; 
    uint16_t destPort; 
    uint32_t seqNum; 
    uint32_t ackNum; 
    uint8_t offset:4; 
    uint8_t res:4; 
    uint8_t flags; 
    uint16_t window; 
    uint16_t checksum; 
    uint16_t urg; 
}TCPHeader; 

typedef struct __attribute__((__packed__)) TCPPseudo { 
    struct in_addr srcAddr; 
    struct in_addr destAddr; 
    uint8_t zeroes; 
    uint8_t protocol; 
    uint16_t len; 
}TCPPseudo; 

Предусматривает ли контрольная сумма принимает длину как pseudoheader и «реальной» заголовок, а также адрес обоих их?

+0

С http://tools.ietf.org/html/rfc793Частовое поле контрольной суммы является 16-битным дополнением к его сумме из всех 16-разрядных слов в заголовке и тексте. Если сегмент содержит нечетное число заголовков и текстовых октетов, которое должно быть , контрольная сумма, последний октет заполняется справа нулями до , формирует 16-битное слово для целей контрольной суммы. Пэд не является , переданным как часть сегмента. При вычислении контрольной суммы поле контрольной суммы заменяется нулями. Контрольная сумма также покрывает 96-битный псевдо-заголовок концептуально – lulyon

ответ

1

Псевдо-заголовок не существует физически. Он не является частью пакета, отправленного по сети. Это только помощь для объяснения того, какие части заголовка IP включены в расчет контрольной суммы заголовка TCP.

+0

Итак, чтобы вычислить контрольную сумму TCP, я бы использовал поле длины в псевдо-заголовке вместе с некоторой другой арифметикой, чтобы получить правильную длину? Кроме того, передам ли функция контрольной суммы адрес фактического заголовка, исключая псевдо-заголовок? – PacSan

+0

Вы будете использовать данные (полезную нагрузку) пакета, заголовок TCP и те части заголовка IP, которые описаны в псевдо-заголовке. – Marian

Смежные вопросы