歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> Linux和FreeBSD libnet發送機制對比

Linux和FreeBSD libnet發送機制對比

日期:2017/2/28 11:14:05   编辑:關於Unix


研究libnet代碼以及實際測試:
發現在Freebsd中,實際發送的數據幀不能超過2034,加上14字節正好是2048了
在Linux中,LibNet采取了RAW SOCKET的方式發送數據socket(PF_SOCKET,SOCK_RAW,htons(ETH_P_ALL))
Freebsd中換了機制,使用的是bpf驅動方式。
查看BPF源代碼,發現內核實現時
bpf.c:248
if ((unsigned)len > MCLBYTES)
return (EIO);
而MCLBYTE宏缺省定義為2048,在內核配置文件sys/params.h:144行
/*
* Constants related to network buffer management.
* MCLBYTES must be no larger than PAGE_SIZE.
*/
#ifndef MSIZE
#define MSIZE 256 /* size of an mbuf */
#endif /* MSIZE */
#ifndef MCLSHIFT
#define MCLSHIFT 11 /* convert bytes to mbuf clusters */
#endif /* MCLSHIFT */
#define MCLBYTES (1 << MCLSHIFT) /* size of an mbuf cluster */
#define MJUMPAGESIZE PAGE_SIZE /* jumbo cluster 4k */
#define MJUM9BYTES (9 * 1024) /* jumbo cluster 9k */
#define MJUM16BYTES (16 * 1024) /* jumbo cluster 16k */
在配置內核時應該可以通過配置
MCLSHIFT 12 來將緩沖區提高到4096
但是我想發送8K的數據包怎麼辦?
/*
* Constants related to network buffer management.
* MCLBYTES must be no larger than PAGE_SIZE.
*/
專門有一個提示要求不能大於PAGE_SIZE,難道我還要改動PAGE_SIZE?改動後對系統會不會造成較大影響??
看了系統源碼,在IA64中,PAGE_SIZE默認為8K,在其其他體系中,包括AMD64,都是4096
為何?待研究
看來RAW SOCKET性能是要高。
下來再研究bfp源碼吧
Copyright © Linux教程網 All Rights Reserved