【问题标题】:linux raw ethernet socket receive more bytes than MTUlinux 原始以太网套接字接收的字节数比 MTU 多
【发布时间】:2016-11-02 04:49:04
【问题描述】:

我用的是下面的代码sn-p,

  /* 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 大小的数据包。

【问题讨论】:

  • 您已经提出了您的问题。无需在 cmets 中重申。没有碰撞,如果那是你想要的,无论如何它在这里不起作用。

标签: linux sockets


【解决方案1】:

MTU 是物理层可以在单个帧中传输的最大字节数。数据包大小是 IP 数据包的逻辑大小。如果 IP 数据包不适合用于传输的单个物理帧,它将被分段以进行传输(即拆分为多个物理帧)并在接收器处重新组合。详情请见wikipedia: IPv4 Fragmentation and reassembly

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多