Here is a clip from a packet trace taken during an over the air download between our peripheral (CC2540-based) and the TI Multitool running on iOS 7.1.1 on an iPod Touch. The was a data transfer of 126976 bytes taking 68 seconds for an effective transfer rate of about 2KBps (16kbps).
The empirical evidence shows an effective "window size" of 4 messages. The master is able to send the next block 334 microseconds after receiving and ACK from the slave. If there is no ACK within ~26ms a block is retransmitted. The trace shown below is representative of the entire 126KB transfer.
For source code see the TI OAD Profile (oad.h, oadtarget.c, oadtarget.h) in the CC2540 SDK which is free to download.
1. Our device implements the "stock" OAD profile. We have not done any performance tuning.
2. This is TI's MultiTool from the app store, unmodified
3. Trace taken with a Frontline BLE Analyzer
4. Writes by Master to handle 41 (UUID 0xfc2) contain the payload blocks with monotonically increasing block id's starting at 0. The total BLE frame size is 44 bytes
5. The upload begins with 9 consecutive writes, BUT, frames 8244-8247 are resends of 8246.
6. As of frame 8248, blocks 0-5 have been written once and block 6 retried three times.
7. The slave starts sending notifications in frame 8248 of BLE frame size 28. Each notification contains a block id ACK starting at 0. Frame 8248 ACKS frame 8232, 8250 ACKS 8234 and so on.
8. As the Master receives these notification it sends out a new block. At frames 8260 and 8271 there are resends occurring with relative long delta times (26ms)
8,232 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.029205 4/29/2014 6:56:05.406671 AM 50656556(S)
8,234 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000693 4/29/2014 6:56:05.407364 AM 50656556(S)
8,236 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.029307 4/29/2014 6:56:05.436671 AM 50656556(S)
8,238 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000693 4/29/2014 6:56:05.437364 AM 50656556(S)
8,240 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000693 4/29/2014 6:56:05.438057 AM 50656556(S)
8,242 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000693 4/29/2014 6:56:05.438750 AM 50656556(S)
8,244 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000693 4/29/2014 6:56:05.439443 AM 50656556(S)
8,246 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000693 4/29/2014 6:56:05.440136 AM 50656556(S)
8,247 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.026535 4/29/2014 6:56:05.466671 AM 50656556(S)
8,248 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000463 4/29/2014 6:56:05.467134 AM 50656556(S)
8,249 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000334 4/29/2014 6:56:05.467468 AM 50656556(S)
8,250 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000463 4/29/2014 6:56:05.467931 AM 50656556(S)
8,251 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000334 4/29/2014 6:56:05.468265 AM 50656556(S)
8,252 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000463 4/29/2014 6:56:05.468728 AM 50656556(S)
8,253 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000334 4/29/2014 6:56:05.469062 AM 50656556(S)
8,254 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000463 4/29/2014 6:56:05.469525 AM 50656556(S)
8,255 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000334 4/29/2014 6:56:05.469859 AM 50656556(S)
8,256 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000463 4/29/2014 6:56:05.470322 AM 50656556(S)
8,257 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000334 4/29/2014 6:56:05.470656 AM 50656556(S)
8,258 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000463 4/29/2014 6:56:05.471119 AM 50656556(S)
8,259 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000334 4/29/2014 6:56:05.471453 AM 50656556(S)
8,260 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.025219 4/29/2014 6:56:05.496672 AM 50656556(S)
8,261 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000462 4/29/2014 6:56:05.497134 AM 50656556(S)
8,262 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000335 4/29/2014 6:56:05.497469 AM 50656556(S)
8,263 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000462 4/29/2014 6:56:05.497931 AM 50656556(S)
8,264 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000335 4/29/2014 6:56:05.498266 AM 50656556(S)
8,265 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000462 4/29/2014 6:56:05.498728 AM 50656556(S)
8,266 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000335 4/29/2014 6:56:05.499063 AM 50656556(S)
8,267 28 Slave Handle Value Notification 41 Unknown UUID [0xffc2] 00:00:00.000462 4/29/2014 6:56:05.499525 AM 50656556(S)
8,268 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000335 4/29/2014 6:56:05.499860 AM 50656556(S)
8,270 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.000693 4/29/2014 6:56:05.500553 AM 50656556(S)
8,271 44 Master Write Command 41 Unknown UUID [0xffc2] 00:00:00.026119 4/29/2014 6:56:05.526672 AM 50656556(S)