簡體   English   中英

TCP校驗和對於有效負載的數據包不正確

[英]TCP checksum incorrect for packets with payload

我正在用C語言編寫Ubuntu盒子。
校驗和計算代碼如下:

unsigned short csum(unsigned short *buf, int nwords)
{
  unsigned long sum;
  for(sum=0; nwords>0; nwords=nwords-2){
    sum += *buf;
    //printf("%04x\n", *buf);
    buf++;
  }
  if(nwords>0)
    sum += *buf++;
  while(sum >> 16)
    sum = (sum >> 16) + (sum &0xffff);
  /* sum += (sum >> 16);*/
  return (unsigned short)(~sum);
}

但是,對於IP和ICMP細分市場來說,這一直很好用,所以我高度懷疑這是問題所在。
為了試圖找出問題,我目前正在捕獲隨機數據包,構造tcp標頭部分的偽標頭+深度拷貝,然后打印出原始校驗和和計算出的校驗和。

  struct tcphdr *tcph = (struct tcphdr *)(buffer + sizeof(struct ethhdr) + iphdrlen);
  int tcphdrlen = size - sizeof(struct ethhdr) - iphdrlen;
  int pseudo_len = sizeof(iph->saddr) + sizeof(iph->daddr) + 1 + sizeof(iph->protocol) + 2 + tcphdrlen;
  test = (u_char *) malloc(pseudo_len);
  memset(test, 0, pseudo_len);
  memcpy(test, &(iph->saddr), sizeof(iph->saddr));
  int pos = sizeof(iph->saddr);
  memcpy(test + pos, &(iph->daddr), sizeof(iph->daddr));
  pos += sizeof(iph->daddr);
  memset(test + pos, 0, 1);
  pos += 1;
  memcpy(test + pos, &(iph->protocol), sizeof(iph->protocol));
  int tcphdrlenhtons = htons(tcphdrlen);
  pos += sizeof(iph->protocol);
  memcpy(test + pos, &tcphdrlenhtons, 2);
  pos += 2;
  memcpy(test + pos, tcph, tcphdrlen);

  struct tcphdr *t_tcph = (struct tcphdr *)(test + pos);
  memset(&(t_tcph->check), 0, sizeof(t_tcph->check));

  printf("correct tcp checksum: %d\n", ntohs(tcph->check));
  printf("my tcp checksum: %d\n", ntohs((unsigned short) csum((unsigned short *)test, pseudo_len)));

在測試中,我發現計算得出的校驗和是正確的,但前提是數據包沒有有效載荷。
如果有人可以告訴我我可能做錯了什么,我將不勝感激。

這實際上不是一個建議,而是一個答案。 您的測試代碼很難遵循。 test這樣的變量不能使其他人容易閱讀和理解代碼。

嘗試為偽頭制作一個實際的結構,並對諸如IPv4地址之類的內容進行常規分配,而不是memcpy分配。 它們只有4個字節長,這將使您的代碼更易於閱讀。

這行:

memset(test + pos, 0, 1);

因為將您設置為0並不明顯,這使我有些困擾。我還想知道您是否將正確的字節數設置為0。

我試圖弄清楚您是否可能遇到了字節序問題,但這很困難,因為我很難遵循您的測試代碼。

正如David Schwartz指出的那樣,該程序在計算校驗和之前就捕獲了數據包,從而使捕獲的數據包的校驗和不正確。 該程序實際上給出了正確的校驗和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM