Контрольная сумма TCP по IPv6
Привет Ребята,
Я пытаюсь выяснить контрольную сумму TCP по IPV6. Пожалуйста, смотрите ниже треску
Что я уже пробовал:
char src_addr[] = { 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0xe4, 0x22, 0x2c, 0x0c, 0x9b, 0x57, 0x22 }; char dest_addr[] = { 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xd7, 0xc9, 0x57, 0x52, 0xd7, 0x0f, 0xcd }; _inline unsigned short TOWORD(unsigned int a) { return (unsigned short)( ((a>>8)&0x00FFL) + ((a<<8)&0xFF00L) ); } int _tmain(int argc, _TCHAR* argv[]) { unsigned int sum=0; for(int i = 0; i < 8; i++) { sum += *((unsigned short*)(src_addr+i)); } for(int i = 0; i < 8; i++) { sum += *(((unsigned short*)dest_addr+i)); } unsigned short type = 0x06; // TCP protocol sum += TOWORD(type); unsigned int tcplen = 0x1c; // 28 bytes length sum += ((tcplen <<8) & 0xFFFF) + (tcplen >> 8); sum = (sum>>16)+(sum&0xffff); sum += (sum>>16); sum = (~sum & 0xFFFF); unsigned short sum1 = sum; printf("Checksum = %x\n", sum1); return 0; }
дает выход 3а96.
Однако WireShak показывает контрольную сумму 0x3c3b.
Не могли бы вы мне помочь?