网络能有多快?

June 10, 2008 7:22 pm | In Tech | 9 Comments | hide

网络到底能有多快?废话少说,先从一些基本问题说起。

A. 速度单位和测速方法

文件传输速度一般用 MB/s 表示。这个缩写 MB 涉及到 Binary Prefix 的问题,按照最正统的约定,1 MB = 106 = 1 000 000 bytes,而 1 MiB = 220 = 1 048 576 bytes,这两者只相差 5%,很多地方就常常混用。比方 dd 命令汇报的速度是正统的 MB/s,而 wget 和大部分浏览器显示的 MB/s 则实际上是 MiB/s。

网络连接速度则一般用 Mbps 表示,百兆以太网连接速度是 100 Mbps,也即 100 000 000 bits per second。一个 byte 是 8 个 bit,注意一般小写 b 表示 bit,大写 B 表示 byte。比方 USB 2.0 极限速度是 480 Mbps,实际上只不过是 60 MB/s,现代内置硬盘的速度都远高于此。

因此我们可以看到,百兆以太网 100 Mbps 数据传输的极限速度是 100 000 000 / 8 / 220 = 11.9 MiB/s。但是这些数据中大概至少有 2% 是网络包头之类的,其真正的有用数据吞吐率(throughput)极限是 11.6 MiB/s 左右。

有关测速方法,fishy 同学对此似乎研究。现成的可以测试和显示网络传输速度的命令有比如 dd, rsync --progress, wget, scp 等,windows 下面那就用 ftp 软件或者浏览器好了……

B. 影响速度的因素

我们平时架的家用局域网一般都是百兆以太网,通常情况下,传文件至少可以达到 11 MiB/s 的速度,但是也未必,有各种因素会减慢这个速度。

  • 网络传输协议:通常在局域网里面使用的文件传输/共享协议有:afp, ftp, http, sftp, rsync, nfs, smb。大部分协议传大文件都可以不费力气的打满带宽,唯一要提一下的就是这个 smb 协议。smb 也就是平常在 windows 里面共享文件夹用的那个协议,很诡异的一点是这个协议传文件即使是两台 windows 之间也常常打不满带宽,而 Mac 下面性能尤其低,至于为什么会这样,我也不知道(请高人指点)。另外一点是如果传输大量小文件,有很多额外数据要浪费带宽,rsync 协议在这一点上稍强,但是比较通用的提速办法是在源机器把文件打包传输到目标机器再解包。
  • 机器性能:通常来说,主频 500 MHz 以下的机器做路由器,或者主频 1 GHz 以下的机器用有加密/压缩的协议(比如 sftp)传文件,其本身都有可能成为性能瓶颈。即便是 Linksys,早期有些号称百兆以太网的路由器其实根本达不到 100 Mbps 交换数据,被骗的人不在少数。另外硬盘的写入性能如果达不到网络带宽,测试网络性能可以只传文件而不写磁盘,比如 wget 加 -O /dev/null,千兆以太网传文件的速度瓶颈就有可能在硬盘写入速度。
  • 程序设置:通常来说程序的参数设置只要不太离谱都不会影响传文件的速度,但是也有例外。比如,Mac 下面的 dd 命令从 smb mount 的目录拖文件,如果使用默认 bs 大小速度非常之慢。另外,sftp 协议用不同的软件差别很大,但是我忘记我以前的测试结果了,所以等我有空再补上来……
  • 网况:(这个词不知道谁发明的,貌似是从“路况”一次发展出来的)在局域网内一般网络结构比较容易控制,打满带宽并不是难事;但是到了大因特网上网络传输速度基本上就不由你控制了,这个问题就不在这里讨论了。

C. 关于无线网

无线网 Wi-Fi 技术日新月异,以下是三种常见的规格:

  • 802.11b:频段 2.4 GHz,连接速度最高 11 Mbps,吞吐率极限大概在 0.5 MiB/s 左右。
  • 802.11g:频段 2.4 GHz,连接速度最高 54 Mbps,吞吐率能达到 2.4 MiB/s。
  • 802.11n:频段可选 2.4 GHz 或者 5 GHz,连接速度最快似乎可以到 300 Mbps,吞吐率极限据说高于 12 MiB/s。

不要被无线网的连接速度所迷惑,用目前最常见的 802.11g 传文件实际上只能到 2.4 MiB/s 的样子,而且现在市面上的低端 802.11g 无线路由器往往不能稳定保持这个速度。有一种 802.11g+ 技术可以把 802.11g 的性能翻倍,但是通用性不强,所以使用的地方并不多。

事实上,在 802.11b 之前还有过一个 802.11a,频段是 5 GHz,性能和 802.11g 差不多,可是因为频段选的不好,并没有流行起来。

802.11n 是目前最新的 Wi-Fi 技术,协议还没有最终定稿,但是市面上用协议草案制作的 802.11n 路由器已经不少了。也正因为协议没有最终定稿,不同公司生产的无线基站和无线网卡配合工作往往达不到最高性能。从目前的情况看,802.11n 网络连接至少可以到 130 Mbps 的连接速度,传文件可以达到 5 MiB/s 以上,所以即便是最差情况,802.11n 也已经可以超过 802.11g 的性能。(比如,苹果的 Airport Extreme 如果要兼容 802.11g 就必须工作在 2.4 GHz 频段,这样即使和自家苹果电脑的 802.11n 网卡互联,也只能达到 130 Mbps 的速度;而如果换用 5 GHz 频段,连接速度就是 300 Mbps,传文件可以保持 10 MiB/s 以上。)

无线网的性能会受到很多东西的影响,比方,信号穿的墙厚不厚、什么材料的,周围有没有同频率的干扰信号。2.4 GHz 这个频段很热门(主要是因为这个频段在大多数国家不需要许可证就可以发射),无绳电话、卫星信号、蓝牙、甚至微波炉都是这个频段,所以一般的建议是无线基站要尽量远离别的电子设备。

D. 关于 DSL 等

一般家用安装的 DSL 或者什么宽带专线的带宽数字都是虚的,只有问同类用户才能估计实际的性能。米国最近出了一个规定,至少 768 kbps 才能号称 broadband。记得以前一个小旅馆几十间房共用一个 128 kbps 的出口也好意思对外号称他们有 high speed internet access。

E. 结语

我真唐僧。

Tags: , , , , ,

盾的传说

September 15, 2007 10:33 pm | In Tech | 1 Comment | hide

原来我 2001 年的时候就已经研究过 GFW 了。

发信人: atp (ATP (Big Mouse)), 信区: Physics
标 题: Re: 着急
发信站: 大话西游站 (2002年09月04日09:19:55 星期三), 站内信件

哎,想当年俺哥们在国内申请,发现很多学校连不上,
我就开了一个http的代理
让他们通过我的代理连,发现禁止的站点还是连不上
后来我们分析数据包,发现确实是他刚刚把HTTP请求头发到我的代理上,
我们两边就几乎立即收到了断开连接的数据包
……

Tags:

漫谈打洞

September 2, 2007 1:39 am | In Tech | 6 Comments | hide

网络总是有缺陷的,一种常见的情形是,Alice 想向 Bob 建立 TCP 连接,但是因为种种原因不能直接建立连接。如果有一台机器和两边都没有连接障碍,那么就有可能通过这台机器帮助从 A 向 B 建立连接。一般把这个工作叫做建隧道,或者搭桥,不过好像也有人叫打洞,我觉得打洞这个名字听起来好玩一些,所以标题里就叫打洞吧。

A. 直接端口映射

先从最土鳖的说起。最简单的洞是在某台机器 C 上开一个 daemon 监听一个特定端口,然后把 A 发过来的数据都原封不动的转发给 B,这里假设 C 到 A 和 B 的通信都是毫无阻碍的。网上流传了两个版本的 datapipe.c 1 2。后者是前者的徒弟,当然也比新。不过后者带了 idle timeout 5 分钟,很容易改掉。另外一个简洁的程序是 rinetd。总之这些程序大同小异,对于最简单的应用足够了。究其本质,其实它就是把来去网络包的 src 和 dst 改了。所以上面这类 daemon 的工作可以用两条 iptables 规则搞定(nat 表):

-A PREROUTING -p tcp -m tcp --dport 9998 -j DNAT --to-destination Bob:9999
-A POSTROUTING -d Bob -p tcp -m tcp --dport 9999 -j SNAT --to-source C

这样就把发给 C:9998 的数据转发给 B:9999 了。当然了,iptables 需要 root 权限,所以比 daemon 权限要求高一些。另外一点是,如果 C 是 B 的网关,那么第二条 iptables 规则是不需要的,这时候第一条规则就相当于路由器配置常见的端口映射。

B. ssh 端口映射

稍微高级一点,可以用 ssh 端口映射。最简单的例子来说,比如 B 在内网所以 A 没办法向 B 建立连接,但是 B 的内网中有一台 D 可以操作并向外网的 A 建立连接。如果 A 这里有 sshd server,就可以从 D 用 ssh -R 来反向建立通道:

ssh -R 8888:Bob:8889 Alice

这样在 A 上连 localhost:8888 的时候,ssh 通道会自动把网络包发回 B 机器的 8889 端口。这里如果能操作 B,那么从 B 直接 ssh A 也可以,就不需要 D 了。在没有网关权限的情况下,这个方法是从外网连内网机器的最基本的方法。

ssh 的 -L 和 -R 两个参数神通广大,灵活运用可以打各种洞。比如假设 A B C 都是互联网上的机器,但是 A B 通讯不畅,想通过 C 中转。可能的方法有:从 C 往 A ssh -R,从 C 往 B ssh -L,从 A 往 C ssh -L,从 B 往 C ssh -R。有一个要注意的问题是 -L -R 参数开的端口往往只监听 localhost,绑定到外网 IP 可能被禁止,这时候可以再建一个本地的洞从 0.0.0.0:某个端口打通到那个本地洞。这些不同的方法本质一样,但是受各类网关和权限限制,或者 QoS 的影响,或者安全性的考虑,往往某个方法优于别的方法,所以可以根据实际情况选择。

比较新的 ssh 开始带 -D 参数,可以将 ssh 通道当作 socks4 代理使用。这个尤其适合连 B 上的 ftp。从 A 通过另一台机器 C 连 B 的 ftp 碰到的问题是数据连接端口是动态的,无论 PORT 还是 PASV 模式都需要特殊配置。比较简单的方法是:A 往 C ssh -D 8899 端口,然后配置 A 本地 ftp 软件使用 socks4 代理:localhost:8899,这样 ftp 软件就可以正常工作了。这个方法也可以用于浏览有 IP 限制的网段。比如从国外无法浏览中国教育网里面的网页,如果可以用 ssh -D 挂上一台能直连教育网的机器,那么配置浏览器使用这个 ssh 通道的 socks4 代理就可以了。另外比如你想下 bt 但是又想避开米国的耳目,或者你对某段网路的安全不放心,也可以用这个办法来方便的加密传输数据,因为 ssh 通道内传送的数据是加密的。

C. openvpn 大法

最后出场的就是 openvpn 了。 ssh 端口映射一般不需要 root 权限,但是 openvpn 需要,当然 openvpn 也会灵活得多。针对 A 无法直接连 B 的问题,最简单的 openvpn 解法是从 B 连上 A 的 openvpn server,这样就可以从 A 直接向 B 的 openvpn ip 连接了。这个方法和 ssh 端口映射比似乎没有什么优势,不过我碰到过土鳖破网关,openvpn 自动重连可以保证可靠的连接,虽然要折腾出可靠的 ssh 也不是不可能的。

openvpn 虚拟出一个网卡, 在网络配置上要灵活得多。一个常见的应用是将外网机器接入内网子网。假设 C 和 B 在一个子网 192.168.1.0/24,C 有外网 IP(不一定要是 B 的网关)。这时候在 C 上架 openvpn server,配置 openvpn.conf:

push "route 192.168.1.0 255.255.255.0"

如果 C 不是这个子网的网关,还需要在 iptables 配置 SNAT(nat 表):

-A POSTROUTING -s 10.38.0.0/255.255.255.0 -d 192.168.1.0/255.255.255.0 -j SNAT --to-source C

这里 10.38.0.0/24 是 openvpn 的网段。这样配置之后,A 连上 C 的 openvpn 之后 A 去 192.168.1.0/24 的网络包就自动走 openvpn,几乎所有需要使用这个内网的程序都不需要任何配置就可以直接使用,连接 B 自然也没有问题。

现在绝一点,还是上面的情况,假设 B 这个子网里面没有机器有外网 IP,B 的网关没有权限,而且 A 在另一个子网,A 的网关也动不了手脚,那么怎么让 A 能够进入 B 这里的内网呢?这时候可以找外网一台自由的机器 D,让 A B 都连上 D 的 openvpn server,这样就可以利用 openvpn 客户端之间的通讯了。具体配置在 D 的 openvpn server 上有,配置 openvpn.conf:

client-config-dir ccd
route 192.168.1.0 255.255.255.0
client-to-client

配置 ccd/B:

iroute 192.168.1.0 255.255.255.0

配置 ccd/A:

push "route 192.168.1.0 255.255.255.0"

B 上面需要配置 SNAT:

-A POSTROUTING -s 10.38.0.0/255.255.255.0 -d 192.168.1.0/255.255.255.0 -j SNAT --to-source B

这样就可以了,A 连上 openvpn 以后应该会显示 192.168.1.0/24 路由走 openvpn 网卡。

可以看到,openvpn 配置了底层的路由表,所以大多数应用程序都不需要设置就可以直接使用这个洞了,这对于一些没有设置 socks 代理功能的软件尤其有用。更高级的应用还可以做 taprd,直接在外网去拿内网的 DHCP 地址等等。这些配置都是高科技武器,不一一叙述,不过我个人的体会是只有你想不到,没有你做不到。

D. 杂问题

  • openvpn 用 tcp 还是 udp,参见这个链接。我实测在高速可靠网路上,两者似乎没有区别。不过还是推荐 udp。
  • 性能。大多数打洞的方法是会损失性能的,包括网络速度和 CPU 的负荷。破机器或者嵌入式机器需要注意一下 CPU 负荷是不是性能瓶颈。网络速度一般会达不到满带宽,就 openvpn 来说,一般至少会损失 20% 的网络速度,去掉加密,加大压缩可能会有帮助。tunnel over ssh 属于 tcp over tcp,在不可靠网络上速度尤其会受到影响。不过带加密的洞在 tcp checksum 的基础上还有一层验证,数据可靠性很高。我曾经在极不稳定的网路上用 ftp over ssh 传过快 1 TB 的数据,一个 bit 也没有传错。
  • 不修改 src 的端口映射。打洞一般碰到的一个问题是,在目标机器 B 上看,连接是从中间机器 C 来的了,无法知道最初的连接来自哪里,这个问题在某些情况下是很不爽的。那么为什么 C 需要修改网络包的 src 呢? 这是由于一般来说路由表是根据网络包 dst 地址来配置的,所以如果 C 不修改网络包 src 地址,B 回应 A 的网络包就未必会经过 C 了。解决办法很自然:要么把 C 设置成 B 的网关,要么在 B 以及所有 B 和 C 之间的路由器上设置策略路由(policy-routing,根据 src 而不是 dst 选择路由)。在只有 B 有配置权限的情况下,可以用 openvpn 把 B 和 C 打通,保证 B 可以不通过路由器直接把网络包发送给 C。

其实很多打洞原理和方法说明白了也没什么奥妙,不过本文部分内容鄙人还是从康神czz 这里学到的,致敬!

Tags: , , , , ,

lftp+ssh-socks4 tunnel memo

January 31, 2007 1:40 am | In Tech | No Comments | hide

dante-1.1.19:

./configure --with-socks-conf=/home/vv/dante-1.1.19/socks.conf

socks.conf:

route {
    from: 0.0.0.0/0   to: 0.0.0.0/0   via:127.0.0.1  port = 4444
    protocol: tcp           # server supports tcp and udp.
    proxyprotocol: socks_v4 # server supports socks v4 and v5.
    method: none #username  # we are willing to authenticate via
                            # method "none", not "username".
}

lftp-3.5.9:

./configure --with-socksdante=/home/vv/dante-1.1.19

establish ssh-socks4 tunnel:

$ ssh -N -D4444 vv@**** -p**
[vv@XX ~]$ lftp-3.5.9/src/lftp ftp://166.111.18.101/
cd ok, cwd=/
lftp 166.111.18.101:/> set ftp:fix-pasv-address no
lftp 166.111.18.101:/> ls
drwxrwxr-x   6 HAPPY    HAPPY         416 Dec 30 16:59 incoming
-rw-r–r–   1 HAPPY    HAPPY      218031 Jan 31 06:08 ls-lR.gz
drwxrwxr-x   5 HAPPY    HAPPY         120 Nov 24  2005 pub
-rw-r–r–   1 HAPPY    HAPPY      107198 Jan 31 06:08 tree.txt

Tags: , , , , , ,

iptables 流程图

April 1, 2006 12:00 pm | In Tech | No Comments | hide

某日和康神聊天时找到的,备份一下,省得要找的时候又找不到。

iptables

来自:http://www.linuxhomenetworking.com/images/iptables.gif,不确定是不是原始出处。

Tags: ,

This weblog is licensed under a Creative Commons License.
Powered by WordPress. Theme based on Pool by Borja Fernandez.