如何排查向TUN设备写入时出现的阻塞问题?
问题:libp2p VPN隧道中tun设备flush阻塞问题
补充说明
这可能与使用的tun库有关,相关问题已有讨论。
问题详情
我正在学习Linux网络,尝试用libp2p构建一个简单的VPN隧道。现有代码可通过虚拟tun设备捕获数据包,再经P2P传输在节点间转发流量,但向tun设备刷新缓冲区时常出现阻塞,通常持续30秒以上,有时甚至永久阻塞。
我对此十分困惑,不知如何进一步调试。我猜测可能是设备繁忙,但不确定如何验证,也不清楚原因。我使用select!,看起来代码不会死锁,但可能完全误解了执行逻辑。
相关代码如下(完整上下文可查看指定仓库代码):
use async_std::{ fs::File, io::{BufReader, BufWriter}, } // ... let mut packet = [0u8; MTU]; let mut tun_reader: BufReader<&File> = tun.reader(); let mut tun_writer: BufWriter<&File> = tun.writer() loop { select! { _ = tun_reader.read(&mut packet).fuse() => { if let Some(peer_id) = handle_tun_packet(packet, &routing_table) { swarm .behaviour_mut() .request_response .send_request(&peer_id, packet); } } event = swarm.select_next_some() => match event { SwarmEvent::Behaviour(Event::RequestResponse(RequestResponseEvent::Message { peer, message: RequestResponseMessage::Request { request, .. }, })) => { let request: [u8; MTU] = request; // packet if handle_peer_packet(request, &routing_table, &peer).await? { let n = tun_writer.write(&request).await?; tun_writer.flush().await?; // stalls??? } } // ... } } }
内容的提问来源于stack exchange,提问作者Ben Little
相关产品推荐
相关产品推荐

