linux raw ethernet socket接收的字节数多于MTU

时间:2016-11-02 04:49:04

标签: linux sockets

我正在使用以下代码段

  /* 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");
    }

我收到的MTU大小超过1500。 请分享您的输入以获取超过MTU大小的数据包。

1 个答案:

答案 0 :(得分:1)

MTU是物理层在单个帧中可以传输的最大字节数。数据包大小是IP数据包的逻辑大小。如果IP分组不适合用于传输的单个物理帧,则它将被分段以便传输(即分成多个物理帧)并在接收器处重新组装。有关详细信息,请参阅wikipedia: IPv4 Fragmentation and reassembly

您在代码中看到的是数据包的逻辑大小,如果使用碎片,则可能大于物理层的MTU约束。