2016-11-02 24 views
0

我使用下面的代碼片段,Linux的原始以太網插口接收更多的字節數比MTU

/* Open PF_PACKET socket, listening for EtherType ETHER_TYPE */ 
    if ((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETHER_TYPE))) == -1) { 
      perror("listener: socket"); 
      return -1; 
    } 

    /* Set interface to promiscuous mode - do we need to do this every time? */ 
    strncpy(ifopts.ifr_name, ifName, IFNAMSIZ-1); 
    ioctl(sockfd, SIOCGIFFLAGS, &ifopts); 
    ifopts.ifr_flags |= IFF_PROMISC; 
    ioctl(sockfd, SIOCSIFFLAGS, &ifopts); 
    /* Allow the socket to be reused - incase connection is closed prematurely */ 
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) { 
      perror("setsockopt"); 
      close(sockfd); 
      return ERR_GENERIC; 
    } 
    /* Bind to device */ 
    if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, IFNAMSIZ-1) == -1) { 
      perror("SO_BINDTODEVICE"); 
      close(sockfd); 
      return ERR_GENERIC; 
    } 

    /* Open RAW socket to send on */ 
    if ((sendfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_IP)) == -1) { 
    //if ((sendfd = socket(PF_PACKET, SOCK_RAW, htons (ETHER_TYPE))) == -1) { 
      perror("socket"); 
    } 

我收到了超過1500 MTU大小更多請分享您的輸入,用於獲取數據包超過MTU大小。

+0

你說過你的問題。無需在評論中重申它。不要碰撞,如果這是你的意圖,並且無論如何它不會在這裏工作。 – EJP

回答

1

MTU是物理層可以在單個幀中傳輸的最大字節數。數據包大小是IP數據包的邏輯大小。如果IP數據包不適合傳輸的單個物理幀,它將被分段傳輸(即分成多個物理幀)並在接收器處重新組合。有關更多詳細信息,請參閱wikipedia: IPv4 Fragmentation and reassembly

您在代碼中看到的是數據包的邏輯大小,如果使用碎片,則可能會大於物理層的MTU約束。

相關問題