Nmap IP分片发送学习

匿名 (未验证) 提交于 2019-12-03 00:25:02

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; } 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!