gpt4 book ai didi

linux原始以太网套接字接收的字节数超过MTU

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:06 24 4
gpt4 key购买 nike

我正在使用以下代码片段,

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

最佳答案

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

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

关于linux原始以太网套接字接收的字节数超过MTU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40372674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com