Netutil.cc
IP分片并发送函数解析
1、mtu是通信协议某一层上面所能通过的最大数据大小
2、分片过程:
将IP数据部分划分为fragment片,每片大小mtu,最后一片大小datalen % mtu(因为可能不足mtu)
划分好的每片长度fdatalen
3、ip包头中需要填充的字节:
需要填充的ip_off是相对数据部分的偏移,因此偏移字节为fragment - 1) * mtu ,又由于ip_off是以8字节为单位
发送函数
上面分割好的ip分片fpacket被拷贝到eth_frame + 14的位置
memcpy(eth_frame + 14, packet, packetlen);
之后发送出去
/* Send an IP packet over an ethernet handle. */ int send_ip_packet_eth(const struct eth_nfo *eth, const u8 *packet, unsigned int packetlen) { eth_t *ethsd; u8 *eth_frame; int res; eth_frame = (u8 *) safe_malloc(14 + packetlen); memcpy(eth_frame + 14, packet, packetlen); eth_pack_hdr(eth_frame, eth->dstmac, eth->srcmac, ETH_TYPE_IP); if (!eth->ethsd) { ethsd = eth_open_cached(eth->devname); if (!ethsd) netutil_fatal("%s: Failed to open ethernet device (%s)", __func__, eth->devname); } else { ethsd = eth->ethsd; } res = eth_send(ethsd, eth_frame, 14 + packetlen); /* No need to close ethsd due to caching */ free(eth_frame); return res; }
文章来源: Nmap IP分片发送学习