以下是对 decrease_mtu
函数的详细注释和解释,帮助理解其功能和实现。
/**
* 减小 MTU(最大传输单元)值
*
* @param ssl SSL 结构体指针,用于 DTLS 加密
* @param mtu 当前的 MTU 值
* @param verbose 是否输出详细信息的标志
*
* @return 返回更新后的 MTU 值。
*/
int decrease_mtu(SSL *ssl, int mtu, int verbose) {
// 检查输入参数是否有效。如果 SSL 指针无效,则返回当前 MTU。
if (!ssl) {
return mtu;
}
// 从 SSL 对象中获取当前的 MTU 值。
int new_mtu = get_mtu_from_ssl(ssl);
// 如果从 SSL 获取到的 MTU 无效(小于1),则使用传入的当前 MTU。
if (new_mtu < 1) {
new_mtu = mtu;
}
// 如果新 MTU 大于最大允许值,则将其设置为 MAX_MTU。
if (new_mtu > MAX_MTU) {
mtu = MAX_MTU;
}
// 对于合法的新 MTU,如果它小于最小允许值,则将当前 MTU 设置为 MIN_MTU。
if (new_mtu > 0 && new_mtu < MIN_MTU) {
mtu = MIN_MTU;
// 如果新 MTU 小于当前 MTU,则更新当前 MTU 为新值。
} else if (new_mtu < mtu) {
mtu = new_mtu;
// 否则减少当前 MTU 的值,由定义的步长来减小。
} else {
mtu -= MTU_STEP;
}
// 确保最终的 MTU 不低于最小允许值。
if (mtu < MIN_MTU) {
mtu = MIN_MTU;
}
// 更新查询中的 MTU 信息。
set_query_mtu(ssl);
// 如果需要详细日志,记录将要使用的新的 MTU 值。
if (verbose) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "1. mtu to use: %d\n", mtu);
}
#if DTLS_SUPPORTED
// 在支持 DTLS 的情况下,设置 SSL 和 BIO 的新MTU。
SSL_set_mtu(ssl, mtu);
BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_SET_MTU, mtu, NULL);
#endif
// 返回更新后的MTU值
return mtu;
}
函数逻辑总结:
参数检查:首先检查
ssl
参数是否有效。如果不合法,就返回传入的mtu
。获取当前MTU:调用
get_mtu_from_ssl
获取与给定 SSL 上下文相关联的新 MTU 值。合法性检查与调整:
- 如果获取到的新
new_mtu
小于1,则回退到原始传入mtu
的值。 - 如果
new_mtu
超过了MAX_MTU
,则将mtu
设置为最大值; - 如果
new_mtu
合法但低于最小阈值,将设置成MIN_MTU
; - 若新 mtus 小于现有 mtus 则更新;否则根据定义好的步骤减小原有 mtus。
- 如果获取到的新
确保MTUs合规:在所有调整后再次检查并确保最终计算得到的
mtu
至少等于MIN_MTU
.更新查询中的MTUs信息:通过调用函数通知有关变更。
日志记录:根据所提供的详细标志输出新的MTUs信息,以便调试或监控之用。
DTLS操作条件下执行:若启用了DTLS相关支持,通过调用相应的方法设置SSL上下文及其BIO中的MTUS信息。
返回结果:函数返回经过调整后的MTUs值,这一过程允许动态管理数据包大小以适应网络状况。
该函数在网络编程中常用于动态优化数据包大小,从而避免分片,提高网络传输效率,并保持流量稳定。
内容由零声教学AI助手提供,问题来源于学员提问