RELAY_CELL 的构成是 RELAY_HEADER (11) + DATA + CELL_PADDING_GAP(4) + PADDING = CELL_PAYLOAD(509)
relay.c/get_pad_cell_offset() 中查看 CELL_PAYLOAD 剩余空间,然后把 offset 返回到relay.c/pad_cell_payload() 中,如果这个值是0,直接放弃 padding(问题:强制 padding 在什么地方),否则通过 crypto_rand_fast.c/crypto_fast_rng_getbytes() 进行随机填充。
真正确定是否进行强制随机填充实际上在确定打包数据长度时就已经确定了。在relay.c/connection_edge_get_inbuf_bytes_to_package()中,如果 send_randomness_after_n_cells 值为0,并且 have_sent_sufficiently_random_cell 为0,那么设定数据长度为 509-4-16 = 489 (5填充),否则设定数据长度为 509 - 11=498。如果确定要强制填充,那么把have_sent_sufficiently_random_cell设为1。已经完成随机填充之后,会进入relay.c/circuit_reset_sendme_randomness() 进行重置,把下一个阈值放到 CIRCWINDOW_INCREMENT / 2 ~ CIRCWINDOW_INCREMENT之间。