【问题标题】:What socket options would you recommended for tunnels?您会为隧道推荐哪些套接字选项?
【发布时间】:2011-04-13 10:01:45
【问题描述】:

我正在编写一个自定义隧道(首先有一个自定义的 hello,然后连接变成了一个隧道),但是速度很慢。

我想知道是否有什么办法可以提高速度。

例如,提高使用短消息的连接速度的一种方法是禁用 nagle 算法 (TCP_NODELAY)。

您对隧道有什么建议? 如果有帮助,我将通过隧道传输 RTSP 和 HTTP。

编辑:代码尽可能简单:

int remote_fd;
int local_fd;
int fdmax;
char buf[1 << 10];

fdset master_set, read_set;
FD_ZERO(&master_set);
FD_ZERO(&read_set);
FD_SET(remote_fd, &master_set);
FD_SET(local_fd, &master_set);

fdmax = remote_fd > local_fd ? remote_fd : local_fd;

//Connect both remote_fd and local_fd
...

while (1) {
    read_set = master_set;
    select(fdmax + 1, &read_set, NULL, NULL, NULL);
    if (FD_ISSET(local_fd, &read_set)) {
        int n = recv(local_fd, buf, sizeof(buf), 0);
        send(remote_fd, buf, n, 0);
    }
    if (FD_ISSET(remote_fd, &read_set)) {
        int n = recv(remote_fd, buf, sizeof(buf), 0);
        send(local_fd, buf, n, 0);
    }
}

我省略了错误处理和连接套接字的代码以使其更具可读性。

【问题讨论】:

    标签: sockets tcp tunnel


    【解决方案1】:

    问题可能出在您的代码中,而不是套接字选项。 TCP_NODELAY 可能有帮助,也可能没有帮助。大型套接字和接收缓冲区可能会有所帮助。您的代码可能会引入延迟。给我们看一些代码。

    【讨论】:

    • @TomM:非常好,但是 1
    • 谢谢,我会试试你的建议。关于 EOS - 我已经通过当场关闭并重新连接套接字来处理它:)
    • @TomM 在关机时不起作用。连接在另一个方向上仍然对业务开放,因此立即关闭它是错误的。你必须按照我上面说的去做。
    【解决方案2】:

    我认为禁用 nagle 算法不会有太大帮助。您提供的信息太少,无法提供更具体的帮助。因此,其余的答案只是猜测。您需要提供隧道的每一端所在的平台/操作系统以及您使用的编程语言。

    例如。如果您压缩请求/响应,HTTP 隧道将大大受益。但是,如果您使用的是手持设备,那将消耗更多的电池。

    如果您使用 UDP 而不是 TCP,RTSP 会受益,因为它是一个实时协议,并不真正关心一切是否正确到达。

    【讨论】:

    • 为什么你认为你的隧道会影响性能?
    • 嗯,一个终点是 Linux。另一端也很有可能是 Linux(可能是带有嵌入式 Linux 的相机)。我正在使用 c。我明白你所说的压缩是什么意思。但是,由于我只是隧道,我不想知道这种程度的通信(太多的代码和复杂性)。关于 RTSP,我明白你的意思,但我认为这些摄像机使用 TCP 而不是 UDP 用于 RTSP。顺便说一句,如果没有隧道,速度会高得多。
    • 谢谢,我认为隧道会损害性能的原因是我有一种方法可以在没有隧道的情况下检查它。这样,视频加载速度更快(播放效果更好)。
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多