网络收发报文缓冲区预留前缀后缀空间的最佳实践

前言

无论在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);

通过预留编解码缓冲区前后缀空间,可以在收发外部网络报文后,再次封装或加入扩展时,避免内存拷贝

参考

  • C++预留缓冲区前后缀空间的实现之"ACE_Message_BLock API Design"
  • 我对"ACE_Message_BLock API Design"的理解

你可能感兴趣的:(笔记,网络,网络,预留前后空间,前缀空间预留,后缀空间预留)