前言
无论在C语言编程中,还是在C++编程的底层网络编程中,经常会进行网络收发操作,而且很有可能会对这些报文会进行扩展或封装,那么在收发缓冲buffer的前后增加多余的空间,将是非常有利的,这样可以避免对网络报文的反复拷贝。
此网络收发报文缓冲区预留前缀、后缀空间的最佳实践,在VPP等高性能处理程序中经常可见,在此将其介绍过来 :)
抽象伪码
----------------------------------------------------------------------
... prefix space | | | | | | | | | | suffix space ...
----------------------------------------------------------------------
^ ^ ^ ^
| | | |
base rd_ptr wr_ptr capacity
unsigned char base[MORE_BIGGER_THAN_PKT_SIZE];
// reserve prefix space
rd_ptr = wr_ptr = prefix_offset;
...
nsize = sock_recv(base + wr_ptr, capacity - prefix_offset);
wr_ptr += nsize;
rd_ptr -= sizeof(extended_prefix_info);
add_some_extended_prefix_info(base + rd_ptr);
add_some_extended_suffix_info(base + wr_ptr);
wr_ptr += sizeof(extended_suffix_info);
// so can avoid the memory copy if adding extended info
sock_send(base + rd_ptr, wr_ptr - rd_ptr);
通过预留编解码缓冲区前后缀空间,可以在收发外部网络报文后,再次封装或加入扩展时,避免内存拷贝