今天部门同事问了个非常基础的网络问题,什么是上行流量,什么是上行流量。听同事在讨论,我觉得我这个伪网工实在看不下去了,不过他的问题说起来比这个要稍微复杂一点点,于是就有点搞不懂到底是怎么算上行和下行。
我之前给同事分享过一个穿透内网的工具,叫 frp,可以把你的内网某个设备的端口映射到一台公网的机器上,然后你访问公网的某个端口就相当于访问了内网的机器。他的问题是如果我现在通过这个端口远程到内网的机器去下载文件,这个流量是算这台公网的机器的还是算内网的机器。比如我本机 SSH 到公网的22端口,实际是连接到内网的那个机器的22端口,然后我在内网的机器上下载文件。这个流量是算哪个机器的。对于公网的机器来说这个流量是算上行还是下行。
要知道这个问题的答案,我们首先要知道网卡是干什么吃的?网卡的功能其实就2个,收数据和发数据,对应的 RX 和 TX 表示。
通过 Linux 的 iftop 命令我们可以很直观的看到数据包的发送和接收的实时信息,当然 ifconfig 也可以看,只是我个人习惯用 iftop
|

那么我们就用事实说话,看看这个流量到底是算内网的机器的还是算公网的机器的,我们准备一台内网的机器,并且安装 frp 和配置
这里我在内网的 Windows 中安装一个 linux 系统。然后在我的 mac 远程过去

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

然后我在本机远程
|
同时我们在阿里云的机器上开启一个终端执行
|
然后我们返回连接到的内网机器,下载一个文件

然后切换到阿里云的终端观察,我大概等了有5分钟,此时这个文件已经下载了8%,总大小4.1G
|
然后我们返回阿里云的设备,此时的终端我们看不管是收和发总共也才几百 k的

这是为什么呢?
因为我 SSH 连接到内网的 Linux 主机只是和主机的 SSH 协议对应的端口建立了连接,而下载的是内网的机器和网易开源镜像站建立了连接,这和阿里云半毛钱关系都没有。
同时,通信是双方的,虽然中间数据包会经过很多个路由,但是目标IP 和端口只有一个,不会牵扯到第三个人,不管是 TCP 协议还是 UDP 协议都有源IP 目标 IP 源端口和目标端口。
从上面的例子中我们可以看出,我本机和阿里云的65423端口建立了连接,而阿里云服务器的 frp程序的7000端口和我内网的设备建立了连接
|
而内网在调用 wget 去下载的时候又会和网易的服务器去建立连接,所以这就解释了这个流量到底是算谁的这个问题。
同时在科普下本文的主题,如何判断上行和下行流量。
网卡有收和发2个功能,你从其他服务器获取数据,这叫下载,是下行流量,反之,你本机向某个服务器发送数据,比如 FTP 上传、HTTP POST 或 PUT 数据 这叫发,也就是上传,上行流量。不知道是不是看明白啦!
那么 Windows 电脑 打开网络连接可以看到收和发的数据包字节总数

Linux 的 ifconfig
|
解答
1.内网流量算上行还是下行?
这个和内网外网没关系,和设备的网卡有关系,每一块网卡都可以收发数据,比如你从连接内网的网卡出去到某个内网的机器下载东西,这个流量就算是内网网卡的下行数据,如果你通过内网的网卡向局域网的某个设备上传文件就是上行。
2.比如我映射内网的80到公网的8080端口,然后我在本地访问公网的8080端口下载文件,这个流量算谁的,是上行还是下行?
我在内网放了一个600多 M 的文件,然后按照上面的方式进行映射,本地下载,观察流量变化,你发现公网机器上收和发的流量几乎差不多。

按照之前说的,我们来分析下为什么会这样:
- 我本机和服务器的8080端口建立连接,去请求数据,对于我本机来说是下载数据。
- 对于服务器而言是发数据,是服务器向我本机发送数据,是一个上传的过程。
- 而服务器和内网机器之间建立连接,是服务器从内网机器的80端口去获取数据,是收数据,而内网的机器则是向公网机器的8080端口发送数据,下图是内网机器的收发数据截图

所以通过 frp 这种内网工具对于公网的设备而言是双向的哦。
3.比如某个节点10g带宽,这个10g 带宽是指上行还是下行
这个要问购买这个节点带宽的人咯,这个到底是上行下行都是 10G,还是只是上行10G,比如说对于我阿里云的服务器来说,2M 带宽,这个带宽是指上行速度2M。
好啦!本期话题到此为止,希望能对你有所帮助。