科普:什么是上行流量什么是下行流量

今天部门同事问了个非常基础的网络问题,什么是上行流量,什么是上行流量。听同事在讨论,我觉得我这个伪网工实在看不下去了,不过他的问题说起来比这个要稍微复杂一点点,于是就有点搞不懂到底是怎么算上行和下行。

我之前给同事分享过一个穿透内网的工具,叫 frp,可以把你的内网某个设备的端口映射到一台公网的机器上,然后你访问公网的某个端口就相当于访问了内网的机器。他的问题是如果我现在通过这个端口远程到内网的机器去下载文件,这个流量是算这台公网的机器的还是算内网的机器。比如我本机 SSH 到公网的22端口,实际是连接到内网的那个机器的22端口,然后我在内网的机器上下载文件。这个流量是算哪个机器的。对于公网的机器来说这个流量是算上行还是下行。

要知道这个问题的答案,我们首先要知道网卡是干什么吃的?网卡的功能其实就2个,收数据和发数据,对应的 RX 和 TX 表示。

通过 Linux 的 iftop 命令我们可以很直观的看到数据包的发送和接收的实时信息,当然 ifconfig 也可以看,只是我个人习惯用 iftop

iftop -i interface

那么我们就用事实说话,看看这个流量到底是算内网的机器的还是算公网的机器的,我们准备一台内网的机器,并且安装 frp配置

这里我在内网的 Windows 中安装一个 linux 系统。然后在我的 mac 远程过去

我们先在内网的 linux 上开启 frp

然后我在本机远程

➜  Downloads ssh [email protected] -p 65423
The authenticity of host '[121.42.14.64]:65423 ([121.42.14.64]:65423)' can't be established.
ECDSA key fingerprint is SHA256:a/CERDy7adLz7mgkB//4oZIseFElz/aOJ8SvhdkTWaM.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[121.42.14.64]:65423' (ECDSA) to the list of known hosts.
Last login: Fri Sep  1 08:46:01 2017 from adsl-172-10-100-1.dsl.hstntx.sbcglobal.net
[root@elk ~]#
[root@elk ~]#
[root@elk ~]#

同时我们在阿里云的机器上开启一个终端执行

[root@aliyun ~]# iftop -i eth1

然后我们返回连接到的内网机器,下载一个文件

然后切换到阿里云的终端观察,我大概等了有5分钟,此时这个文件已经下载了8%,总大小4.1G

[root@elk ~]# wget -c http://mirrors.163.com/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
--2017-09-01 08:52:11--  http://mirrors.163.com/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso
Resolving mirrors.163.com (mirrors.163.com)... 123.58.190.209, 123.58.190.236, 123.58.190.234, ...
Connecting to mirrors.163.com (mirrors.163.com)|123.58.190.209|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4379901952 (4.1G) [application/octet-stream]
Saving to: ‘CentOS-7-x86_64-DVD-1611.iso’

 8% [======>                                                                               ] 389,358,141 1.01MB/s  eta 40m 58s

然后我们返回阿里云的设备,此时的终端我们看不管是收和发总共也才几百 k的

这是为什么呢?

因为我 SSH 连接到内网的 Linux 主机只是和主机的 SSH 协议对应的端口建立了连接,而下载的是内网的机器和网易开源镜像站建立了连接,这和阿里云半毛钱关系都没有。

同时,通信是双方的,虽然中间数据包会经过很多个路由,但是目标IP 和端口只有一个,不会牵扯到第三个人,不管是 TCP 协议还是 UDP 协议都有源IP 目标 IP 源端口和目标端口。

从上面的例子中我们可以看出,我本机和阿里云的65423端口建立了连接,而阿里云服务器的 frp程序的7000端口和我内网的设备建立了连接

[root@elk ~]# ss -ant| grep 121.42.14.64
ESTAB      0      44     192.168.1.111:36080              121.42.14.64:7000

而内网在调用 wget 去下载的时候又会和网易的服务器去建立连接,所以这就解释了这个流量到底是算谁的这个问题。

同时在科普下本文的主题,如何判断上行和下行流量。

网卡有收和发2个功能,你从其他服务器获取数据,这叫下载,是下行流量,反之,你本机向某个服务器发送数据,比如 FTP 上传、HTTP POST 或 PUT 数据 这叫发,也就是上传,上行流量。不知道是不是看明白啦!

那么 Windows 电脑 打开网络连接可以看到收和发的数据包字节总数

Linux 的 ifconfig

[root@aliyun ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.169.22.37  netmask 255.255.248.0  broadcast 10.169.23.255
        ether 00:16:3e:00:05:11  txqueuelen 1000  (Ethernet)
        RX packets 11  bytes 1340 (1.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 38  bytes 2480 (2.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 121.42.14.64  netmask 255.255.252.0  broadcast 121.42.15.255
        ether 00:16:3e:00:29:6d  txqueuelen 1000  (Ethernet)
        RX packets 1172482  bytes 1430753982 (1.3 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 617708  bytes 817228882 (779.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 5028  bytes 406494 (396.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5028  bytes 406494 (396.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

解答

1.内网流量算上行还是下行?

这个和内网外网没关系,和设备的网卡有关系,每一块网卡都可以收发数据,比如你从连接内网的网卡出去到某个内网的机器下载东西,这个流量就算是内网网卡的下行数据,如果你通过内网的网卡向局域网的某个设备上传文件就是上行。

2.比如我映射内网的80到公网的8080端口,然后我在本地访问公网的8080端口下载文件,这个流量算谁的,是上行还是下行?

我在内网放了一个600多 M 的文件,然后按照上面的方式进行映射,本地下载,观察流量变化,你发现公网机器上收和发的流量几乎差不多。

按照之前说的,我们来分析下为什么会这样:

  • 我本机和服务器的8080端口建立连接,去请求数据,对于我本机来说是下载数据。
  • 对于服务器而言是发数据,是服务器向我本机发送数据,是一个上传的过程。
  • 而服务器和内网机器之间建立连接,是服务器从内网机器的80端口去获取数据,是收数据,而内网的机器则是向公网机器的8080端口发送数据,下图是内网机器的收发数据截图

所以通过 frp 这种内网工具对于公网的设备而言是双向的哦。

3.比如某个节点10g带宽,这个10g 带宽是指上行还是下行

这个要问购买这个节点带宽的人咯,这个到底是上行下行都是 10G,还是只是上行10G,比如说对于我阿里云的服务器来说,2M 带宽,这个带宽是指上行速度2M。

好啦!本期话题到此为止,希望能对你有所帮助。