anchor.diff:  
   [.text-center]
   .Round Trip Time for 200 byte payload (10min)
  -image::udp/rtt-baseline-zoomed.png[]
  +image::udp/rtt-baseline-zoomed.png[link="../images/udp/rtt-baseline-zoomed.png"]
   
   Overall this initial data looks very promising for being able to use UDP for many real-time control tasks. With more tuning and a better implementation (e.g. lwip with zero copy and tuned options) it seems likely that the maximum jitter could go down to below 6us and potentially even 1us.
   
  
positive.code: 
  For this benchmark I tested three switches that were individually added to the baseline setup.
  
  [frame="none"]
  |====
  | image:udp/io-boards-100mbit-switch.jpg[] | image:udp/io-boards-gbit-switch.jpg[]
  |====
  
  This benchmark received a combined total of about 1 million packets. None of them were dropped or received out of order.
  
  image::udp/rtt-switch-comparison.png[]
  
  Mode 2 (at 210 us) seems to disappear for higher round trip times, indicating an issue at the receiving step of the sender. Modes 1 and 3 do not seem to be affected by additional switches, indicating that they are caused by something happening on on the firmware side. The figure below shows a zoomed view of the time series highlighting the added jitter characteristics.
  
  image::udp/comparison-switch-latency.png[]
  
  Both KSZ8863 and the RB750Gr2 add a constant switching latency of 2.9 us and 3.6 us in addition to the wire time of 40.6 us and 4.06 us respectively to the RTT. The added jitter seems to be negligible at well below 1us.
  
  
negative.code: 
  == Ethernet Packet Structure
  
  UDP datagrams include various types of overhead in addition to the actual payload. The minimum overhead is 66 bytes. Additionally, Ethernet Frames have a minimum size of 84 bytes, which makes the minimum payload for a UDP Datagram 18 bytes.
  
  .UDP Datagram Size
  [width="100%",options="header,footer",cols="a,a,a"]
  |====================
  | Protocol | Item | Size (byte) 
  