测试 cloudflare tunnel 下校园网上下行速度

1. 搭建 cloud flare tunnel

官方教程在此。

2. 测试下行

测试下行即测试下载速度,假设有两个server: server1 server2,其中 server1:[port] 上搭了cf tunnel 做 frp,用 server2 来下载 server1 上的文件。

  1. server1 创建一个 1G 的测试文件
# dd is the command from Linux that i use. To create 1 GB file go with
dd if=/dev/urandom of=testfile bs=1024 count=1024000

# to create 100 MB try
dd if=/dev/urandom of=testfile bs=1024 count=102400

# and for 10 MB use
dd if=/dev/urandom of=testfile bs=1024 count=10240
  1. server1 起一个 http server

python -m http.server [port]

  1. 用 server2 来下载 server1 上的测试文件

wget http://url/filename

对于 1G 的测试文件,测试结果如下:

测试过程属于是越跑越快…刚开始下行不到 1MB/s,最后一点点升到 4MB/s 了。

3. 测试上行

测试上行也即上传文件,从 server2 传一个文件到 server1 上。

参考链接:Python SimpleHTTPServer to receive files - Stack Overflow

在 server1 上创建 python 文件:

#!/usr/env python3
import http.server
import socketserver
import io
import cgi

# Change this to serve on a different port
PORT = [port]

class CustomHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):

    def do_POST(self):        
        r, info = self.deal_post_data()
        print(r, info, "by: ", self.client_address)
        f = io.BytesIO()
        if r:
            f.write(b"Success\n")
        else:
            f.write(b"Failed\n")
        length = f.tell()
        f.seek(0)
        self.send_response(200)
        self.send_header("Content-type", "text/plain")
        self.send_header("Content-Length", str(length))
        self.end_headers()
        if f:
            self.copyfile(f, self.wfile)
            f.close()      

    def deal_post_data(self):
        ctype, pdict = cgi.parse_header(self.headers['Content-Type'])
        pdict['boundary'] = bytes(pdict['boundary'], "utf-8")
        pdict['CONTENT-LENGTH'] = int(self.headers['Content-Length'])
        if ctype == 'multipart/form-data':
            form = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'], })
            print (type(form))
            try:
                if isinstance(form["file"], list):
                    for record in form["file"]:
                        open("./%s"%record.filename, "wb").write(record.file.read())
                else:
                    open("./%s"%form["file"].filename, "wb").write(form["file"].file.read())
            except IOError:
                    return (False, "Can't create file to write, do you have permission to write?")
        return (True, "Files uploaded")

Handler = CustomHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

然后运行这个 python 文件。

另外在 server2 上,用上面的方法也创建一个测试文件,然后运行 curl -F 'file=@<FILENAME>' http://<IP> -w 'time_connect %{time_connect}\ntime_starttransfer %{time_starttransfer}\ntime_total %{time_total}\n'

对于 20M 的测试文件,测试结果如下:

其他注意事项

  • 为什么 url 后面不用接端口号?
  • 因为 cf tunnel 默认就有端口号,不需要额外添加。

追加数据

测试对象为 scumaker.org tunneltai3 的上下行

步骤

生成一份传输文件

 dd if=/dev/urandom of=testfile bs=1024 count=1024000 # 下行测试用
 dd if=/dev/urandom of=uptestfile bs=1024 count=51200 # 上行测试用

下行-v6

现象描述:全程稳定,带宽稳定在 6MB/s 左右

下行-v4

现象描述:速度较低,但会有缓慢增长,最后稳定在5MB/s左右

上行-v6

均速 2.5MB/s

上行-v4

均速 1.28MB/s