Update punch_handler.rs
This commit is contained in:
@@ -104,7 +104,9 @@ fn handle(
|
|||||||
// println!("punch {:?}", punch);
|
// println!("punch {:?}", punch);
|
||||||
match punch.nat_type.enum_value_or_default() {
|
match punch.nat_type.enum_value_or_default() {
|
||||||
NatType::Symmetric => {
|
NatType::Symmetric => {
|
||||||
// 碰撞概率 p = 1 - e^(-(k^2+k)/(2n)) n = max_port-min_port+1 关键词:生日攻击
|
// 假设绑定n个端口,通过NAT对外映射出n个 公网ip:公网端口,随机尝试k次的情况下
|
||||||
|
// 猜中的概率 p = 1-((65535-n)/65535)*((65535-n-1)/(65535-1))*...*((65535-n-k+1)/(65535-k+1))
|
||||||
|
// n取76,k取600,猜中的概率就超过50%了
|
||||||
let mut send_f = |min_port: u16, max_port: u16, k: usize| -> io::Result<()> {
|
let mut send_f = |min_port: u16, max_port: u16, k: usize| -> io::Result<()> {
|
||||||
let mut nums: Vec<u16> = (min_port..max_port).collect();
|
let mut nums: Vec<u16> = (min_port..max_port).collect();
|
||||||
nums.push(max_port);
|
nums.push(max_port);
|
||||||
@@ -121,7 +123,6 @@ fn handle(
|
|||||||
};
|
};
|
||||||
if punch.public_port_range < 600 {
|
if punch.public_port_range < 600 {
|
||||||
//端口变化不大时,在预测的范围内随机发送
|
//端口变化不大时,在预测的范围内随机发送
|
||||||
//如果公网端口在这个范围的话,碰撞的概率最低为70%;
|
|
||||||
let min_port = if punch.public_port > punch.public_port_range {
|
let min_port = if punch.public_port > punch.public_port_range {
|
||||||
punch.public_port - punch.public_port_range
|
punch.public_port - punch.public_port_range
|
||||||
} else {
|
} else {
|
||||||
@@ -140,7 +141,6 @@ fn handle(
|
|||||||
send_f(min_port as u16, max_port as u16, k as usize)?;
|
send_f(min_port as u16, max_port as u16, k as usize)?;
|
||||||
}
|
}
|
||||||
// 全端口范围,随机取600个端口发送
|
// 全端口范围,随机取600个端口发送
|
||||||
// 取600个端口碰撞的概率为 93.6%,理论上成功的概率还是很高的
|
|
||||||
send_f(1, 65535, 600)?;
|
send_f(1, 65535, 600)?;
|
||||||
}
|
}
|
||||||
NatType::Cone => {
|
NatType::Cone => {
|
||||||
|
|||||||
Reference in New Issue
Block a user