跳转至

笔记

FTP

FTP简介

FTP是File Transfer Protocol(文件传输协议)的缩写,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。

主动与被动模式

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

区别主要在于数据通道的建立方式:

  • 主动模式:服务器向客户端敲门,然后客户端开门
  • 在主动模式中,客户端向服务器发送一个随机端口号,服务器再用这个端口号和客户端建立数据通道。这样,服务器需要知道客户端的 IP 地址和端口号,并且能够穿透客户端的防火墙。
  • 如果通过代理上网的话,就不能用主动模式,因为服务器敲的是上网代理服务器的门,而不是敲客户端的门
  • 客户端也不是轻易就开门的,因为有防火墙阻挡,除非客户端开放大于1024的高端端口
  • 被动模式:客户端向服务器敲门,然后服务器开门
  • 在被动模式中,服务器向客户端发送一个随机端口号,客户端再用这个端口号和服务器建立数据通道。这样,客户端不需要公开自己的 IP 地址和端口号,并且只需要打开出站连接的防火墙。

ftp命令行登录

ftp ip
lftp user@site:port

常用命令

  1. 下载文件通常用get和mget这两条命令。
  2. 上传文件put和mput
  3. 断开连接bye

ftp空间

但是这个是当前目录的文件,不包括文件夹 1字节=1B,1024B=1KB

Ubuntu ftp服务器部署

vsftpd

  1. 安装
sudo apt install vsftpd # 安装
  1. 配置文件 /etc/vsftpd/vsftpd.conf
 local_enable=YES # 是否允许本地用户访问  
 local_root=/home/kaikai_ftp/ftpdir # 自定义上传根目录
 write_enable=YES # 允许用户修改文件权限
  1. vsftpd虚拟用户
  2. 运行
systemctl restart vsftpd.service
重启
sudo service vsftpd start
开机启动
sudo systemctl enable vsftpd
查看运行情况
sudo service vsftpd status

vsftpd虚拟用户

虚拟用户
  1. 虚拟用户,只对ftp有效的用户。这些用户不可以登录Linux系统,只可以登录ftp服务器。其实就是一个本地用户映射成多个只对ftp服务器有效的虚拟用户。虚拟用户可以有自己的ftp配置文件,因此通常利用虚拟用户来对ftp系统的不同用户制定不同的权限,以达到安全控制的目的。与虚拟用户有关的设置以guest_开头。
  2. 匿名用户,也就是不需要输入密码就可登录ftp服务器的用户,这个用户名通常是ftp或anonymous; 与匿名用户有关的设置多以 anon_选项开头。
  3. 本地用户,也就是你Linux系统上可登录到系统的用户,这些用户是在系统上实实在在存在的用户。通常会有自己的home,shell等。与本地用户有关的设置多以local_开头或包含local_的选项。

●所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录

●各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

具体命令
  1. 创建用户数据库文件
vim /etc/vsftpd/vusers.txt
    ftp123
    ftp2333
  1. 文件需要被加密编码为hash格式奇数行为用户名,偶数行为密码
sudo apt-get install db-util # install db_load
sudo db_load -T -t hash -f vusers.txt vusers.db #该 db_load 实用程序可用于将文本文件加载到数据库中
chmod 600 vusers.db
  1. 创建用户和访问FTP目录
sudo useradd -d /data/ftproot -s /sbin/nologin -r vuser
    # -d, --home-dir HOME_DIR       home directory of the new account
    # -s, --shell SHELL             login shell of the new account
    # -r, --system                  create a system account
mkdir -pv /data/ftproot/upload #-pv 是没有父路径也会创建
setfacl -m u:vuser:rwx /data/ftproot/upload
    # set file access control lists
    # -m, --modify
#chmod a=rx /data/ftproot/  如果自动创建家目录,需要改权限
  1. 创建pam配置文件
vim /etc/pam.d/vsftpd.db
 auth required pam_userdb.so db=/etc/vsftpd/vusers
 account required pam_userdb.so db=/etc/vsftpd/vusers
  1. 指定pam配置文件
vim /etc/vsftpd/vsftpd.conf

pam_service_name=vsftpd.db
userlist_enable=YES

guest_enable=YES #所有系统用户都映射成guest用户
guest_username=vuser #配合上面选项才生效,指定guest用户
user_config_dir=/etc/vsftpd/vusers.d/  #虚拟用户设置独立的配置文件
write_enable=YES

anonymous_enable=NO # 匿名访问是否允许,默认不要开启
local_enable=YES # 是否允许本地用户访问  
local_root=/home/shaojiemike/ftpdir # 自定义上传根目录
虚拟用户设置独立的配置文件

指定各用户配置文件存放的路径

vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/

创建各个用户的配置文件存放路径,配置文件的文件名需要与用户名一致。 没有独立配置文件的虚拟用户会遵守/etc/vsftpd/vsftpd.conf这个主配置文件的权限配置。

mkdir /etc/vsftpd/vusers.d/
cd /etc/vsftpd/vusers.d/
vim ftp123
    # 允许用户有自己的上传目录以及上传权限,添加这些参数以及值
    local_root=/tmp/vutest_d
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    allow_writeable_chroot=YES

建立目录,更改目录的所有者与所属组

mkdir /tmp/vutest_d
chown vuser:vuser  /tmp/vutest_d   #还是那句话,用户能不能上传不仅与配置文件有关,还与目录是否有w权限有关,两个权限都开启才能正确上传。
chmod 755 upload

Linux-PAM 的配置文件

PAM 的各个模块一般存放在 /lib/security/ 或 /lib64/security/ 中,以动态库文件的形式存在,文件名格式一般为 pam_*.so。

PAM 的配置文件可以是 /etc/pam.conf 这一个文件,也可以是 /etc/pam.d/ 文件夹内的多个文件。如果 /etc/pam.d/ 这个文件夹存在,Linux-PAM 将自动忽略 /etc/pam.conf。

  1. /etc/pam.conf 类型的格式如下:
服务名称  工作类别  控制模式  模块路径  模块参数
  1. /etc/pam.d/ 类型的配置文件通常以每一个使用 PAM 的程序的名称来命令。比如 /etc/pam.d/su,/etc/pam.d/login 等等。还有些配置文件比较通用,经常被别的配置文件引用,也放在这个文件夹下,比如 /etc/pam.d/system-auth。这些文件的格式都保持一致:
工作类别  控制模式  模块路径  模块参数

需要进一步的研究学习

Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's capabilities.

遇到的问题

530 Login incorrect.
Login failed.
  1. 尝试改shell,但首先不是这个问题
cat /etc/shells #没有/sbin/nologin
sudo usermod -s /bin/bash vuser
cat /etc/passwd #shell改好了
  1. 查看报错 我以为我是修改错文件了,但是好像没怎么简单
  2. 添加
guest_enable=YES   # 开启虚拟用户
guest_username=vuser  # FTP虚拟用户对应的系统用户,即第四步添加的用户

报错 后来发现原因是,变量这一行不要加注释 guest_enable=YES # 开启虚拟用户 4. 只改pam的路径为pam.db 报错 这很明显是没有指定用户

实际问题

home.ustc.edu.cn

ftp 上传的内容几秒中之内被覆盖了。这是学校网站的保护机制吗?(我之前调试修改太多了?)

   ftp> get index.html
   local: index.html remote: index.html
   200 EPRT command successful. Consider using EPSV.
   150 Opening BINARY mode data connection for index.html (360991 bytes).
   226 File send OK.
   360991 bytes received in 0.01 secs (25.7474 MB/s)
   ftp> get index.html
   local: index.html remote: index.html
   200 EPRT command successful. Consider using EPSV.
   150 Opening BINARY mode data connection for index.html (16116 bytes).
   226 File send OK.
   16116 bytes received in 0.00 secs (15.3082 MB/s)

I try single command line put site/index.html index.html and after a minute get index.html get the old file.

My USTC homepage is blocked

ftp> ls
200 EPRT command successful. Consider using EPSV.
150 Here comes the directory listing.
drwxr-xr-x   46 0        0            4096 Oct 25 10:03 public_html.old
226 Directory send OK.
ftp> mkdir public_html
550 Create directory operation failed.
ftp> put jumpPage.html
local: jumpPage.html remote: jumpPage.html
200 EPRT command successful. Consider using EPSV.
553 Could not create file.

参考文献

https://www.jianshu.com/p/ac3e7009a764

https://blog.csdn.net/frank_ci/article/details/108847358

https://blog.csdn.net/enweitech/article/details/51330664

Webdav

简介

Webdav

WebDAV由互联网工程任务组的工作组在RFC 4918中定义。是基于Web的分布式编写和版本控制(WebDAV)是超文本传输协议(HTTP)的扩展,

WebDAV协议为用户在服务器上创建,更改和移动文档提供了一个框架。有利于用户间协同编辑和管理存储在万维网服务器文档。

WebDAV协议最重要的功能包括: * 维护作者或修改日期的属性、名字空间管理、集合和覆盖保护。 * 维护属性包括创建、删除和查询文件信息等。 * 名字空间管理处理在服务器名称空间内复制和移动网页的能力。 * 集合(Collections)处理各种资源的创建、删除和列举。 * 覆盖保护处理与锁定文件相关的方面。

  • 可以使用https来保证安全

Samba / CIFS

局域网传输,没有加密

群晖开启WebDaV

参考教程, 开启 https 5555 端口, http 5556端口

设置特殊用户keeweb来访问下载文件夹keeweb下内容。如https://10.0.233.3:5555/keeweb/1.txt

windows挂载

安装RaiDrive

测速

大文件

在1.63GB大文件的时候,SMB能稳定的跑满千兆全速

2M中文件

首先通过split来拆分文件来测试

split -b 2M 1.mkv split.mkv
在2M的时候,WebDav有些许优势

4K小碎片

在4K的时候,WebDav较大优势

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

  1. 网上有传言 WebDav 比 SMB快 8~9倍,但是有人质疑是缓存的原因
  2. keepass同步可以通过坚果云的WebDav

参考文献

https://www.rmnof.com/article/better-ways-to-use-webdav/

Keepass

简介

KeePass是一个轻量级、易用且安全性极高的密码管理器,其源码完全开源(OSI certified),获得了世界多国的安全认证和评级。

只需要一个主密码+一个数据库文件即可安全的保存所有的密码。

特点

  1. 密码数据库自己掌握,与1Password和LastPass相比不存在平台泄露的可能。
  2. 所以在云存储、多终端同步上不如商业产品1Password和LastPass便捷,需要自己配置。
  3. 跨平台(有大量开源的第三方的客户端)。
  4. 支持WebDAV,配合网盘可实现跨平台、多终端同步。
  5. Windows下可配置浏览器自动输入(Mac据说也可以)。

密码安全

普通用户面临的问题: * 重要的密码会泄露在非重要的地方:每个人心中都有一个常用的密码,这个密码在注册各类账户时都会拿出来用,甚至银行卡的6位数密码也包含其中 * 小网站的“脱裤”会导致你的常用密码被泄露 * 不同的网站对密码的复杂度要求不同,我们也会临时“演变”导致“找回密码”成了登录前的基本操作

美观兼容版

  • KeePassXC:KeePassX的分支,功能齐全,
  • 跨平台(Windows、macOS和Linux),
  • 界面更加美观、扁平化,
  • 但不支持WebDAV。
  • 支持KDBX 3.1和4.0。
  • KeeWeb:后起之秀,与KeePass兼容,功能齐全,
  • 跨平台(Windows、macOS和Linux),
  • 另有自动备份等功能,
  • 界面美观;
  • 支持在线安装插件;支持离线Web应用;
  • 笔者认为是Mac OS的首选;使用坚果云webdav时报错:“No Last-Modified header”。

Windows KeeWeb使用

  1. 中文插件 https://plugins.keeweb.info/translations/zh-CN
  2. 设置里方便激活浏览器拓展

多平台

  • Windows:KeePass、KeeWeb
  • Android:KeePass2Android
  • 读取群晖Drive下的文件即可
  • 支持自动填充功能,和生物识别
  • Mac OS:KeeWeb
  • IOS、 ipad OS:
  • https://github.com/keeweb/keeweb/wiki/iOS
  • Strongbox 就还行
  • iPhone:keepass touch

同步实现

坚果云

坚果云更像Dropbox, * 支持WebDAV、 * 增量同步和历史版本等功能。

坚果云免费版虽不如Dropbox,但也还算厚道: * 上传流量1G/月,下载流量3G/月, * 支持1个月的历史版本,用来使用KeePass、云笔记等足矣。

操作

  1. 添加“应用密钥”
  2. 在《账户信息》-《安全选项》
  3. keeweb 添加 即可
  4. 注意坚果云用户是 邮箱, 不是昵称

参考教程

但是keeweb无法同步,会报错

其他第三方密码管理器

LastPass、1Password、 秘迹 app

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

原本我是懒得用的,edge自带的密码管理器不好吗?

  1. 一方面,自动填写带来的安全性问题
  2. 目前大多数第三方密码管理器,如LastPass和1Password都不容易受到这种攻击的影响,因为它们避免了自动填入不可见的登录表单,并且需要进行用户交互。
  3. 可以直接导出所有信息的黑客程序HackBrowserdata
  4. 还有windows管理员密码获取程序。(如果要玩,记得先把火绒等杀毒软件关了
  5. 另一方面,假如你电脑被攻击了,浏览器根本无法保护你的密码

目标

  1. 多端同步的(Windows,macbook,ipad,Android)
  2. 浏览器有保存插件的(Safari,edge,chrome)

参考文献

https://www.rmnof.com/article/keepass-password-manager/

Home Network

ping、arp、tracert、route命令

tracert

https://zhuanlan.zhihu.com/p/504688650

ipv6

查看是否有ipv6

ipw.cn 查看是否有ipv6(手机热点是ipv6优先的)

如图,由于不支持,所以ping不了ipv6

D:\PowerShell\github\hugoMinos [main ≡ +1 ~4 -0 !]> ping 2001:da8:d800:112::23

Pinging 2001:da8:d800:112::23 with 32 bytes of data:
PING: transmit failed. General failure.
PING: transmit failed. General failure.
PING: transmit failed. General failure.

2001:da8:d800:112::23 的 Ping 统计信息:
    数据包: 已发送 = 3,已接收 = 0,丢失 = 3 (100% 丢失),

光猫,路由器修改ipv6

光猫背后账号,密码,和移动的网址http://192.168.1.1/

参考:https://www.luyouwang.net/8778.html

这网络界面根本改不了,G

这是普通用户账号密码,查询移动给的吉比特智能网关GM220-S的超级管理员

账号:CMCCAdmin
密码:aDm8H%MdA
感觉应该开启了ipv6的样子,难道是子路由没开?

原因是子路由普联TL-WR886N不支持ipv6

LAN1的T568B水晶头还只有4根: 网线8根线1236重要。

网线8根线一般只使用1、2、3、6编号的芯线传递数据,即1、2用于发送,3、6用于接收。

4578属于备用线路,1236有故障时自动切换4578,如果4578没有接好,导致的结果就是1236中的某一根出现问题时,因没有备用线路而断网。

NAT6

解决办法: 1. 首先换成小米的WIFI6的路由器 2. 打开ipv6的功能,由于家里暂时没有外网访问家庭设备的需求 1. 没有设置桥接 2. 采用了简单的NAT6来实现家庭ipv6上网 3. 虽然恩山的论坛说很慢,因ipv6地址更长,所以效率更低,速度更慢。,但是NAT6百兆还是能跑满的

获取pppoe 账号密码

备份config.bin后,用routerpassview工具打开,查找用户名,结果发现密码就是123456。我真是无语了(小潮🦅

意外之喜,我家竟然是“千兆网”

原本以为我家是爸爸法院送的移动网不会怎么样,结果直接插GM220-S的千兆口,竟然是非对等带宽的千兆网

但是弱电箱就埋了两根线,一根是到客厅的iptv的线,另一根是到主卧室的(但是水晶头里的线被剪断一半的,导致实际测速只有百兆的线。

临时处理:暂时用iptv的线当拉出来的网线。能达到300Mbps的WIFI-6

需要进一步的研究学习

暂无

遇到的问题

  1. 学校的服务器全部ping不通

没有登录网络的肯定ping不通

登录了ping不通的原因是,脚本默认是8号端口,改成0号教育网端口就行了。

D:\PowerShell> ping -r 9 -w 10000 222.195.72.114

Pinging 222.195.72.114 with 32 bytes of data:
Reply from 222.195.72.114: bytes=32 time=60ms TTL=60
    Route: 172.17.0.3 -> (局域网)
           202.38.73.217 -> (node5)
           202.38.96.189 -> (北京教育网)
           210.45.112.254 -> (合肥教育网)
           222.195.72.114 -> (snode2)
           222.195.72.114 -> 
           202.38.96.188 ->(北京教育网)
           202.38.73.254 ->(合肥教育网)
           172.17.0.1

  1. ipv6不知道是不是因为变化了,也连接不上

家里路由器不支持ipv6,所以连接不上

开题缘由、总结、反思、吐槽~~

参考文献

https://jingyan.baidu.com/article/ac6a9a5e47b4222b653eac95.html

IPV4 && IPV6

IPV4

展示了A、B、C类IP地址的二进制表示和它们的特征:

类别 地址范围 网络数 主机数 说明
A 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 1-126 2^24-2 第一位为0
B 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 128-191 2^16-2 前两位为10
C 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 192-223 2^8-2 前三位为110
D 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 224-239 不适用 用于多播
E 11110xxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 240-255 不适用 保留用于实验和未来使用

在这个表格中:

  • A类地址的范围是从 0.0.0.0127.255.255.255,第一位必须是0。
  • B类地址的范围是从 128.0.0.0191.255.255.255,前两位必须是10。
  • C类地址的范围是从 192.0.0.0223.255.255.255,前三位必须是110。

D类和E类地址用于特殊用途,不用于普通的网络和主机地址分配。

拥抱ipv6

ipv6 原本是为了解决ipv4不足而提出的:

  • IPv4的地址范围是0.0.0.0~255.255.255.255,其地址总量约43亿个(2的32次方),这其中还要刨去私有网段、网络ID、广播ID、保留网段、本地环回、组播地址等特殊地址段,最终的实际可用地址约为25.68亿个,全球互联网设备数是远超这个的。所以一方面设计了私有地址来上网
  • 另一方面就是ipv6。IPv6的地址长度为128位,虽然地址长度仅仅是IPv4的4倍(IPv4是32位的),但IPv6的地址总量却达到了惊人的\(2^{128}\)。换一种更通俗的说法:地球上每一平方米,都可以分到10^26次方个IPv6地址,夸张一点来说,可以给每一粒尘埃都分配到一个地址。

OpenVPN in Docker

在接触wireguard之前,网络返校的方案是自己在有公网IP的机器上搭建OpenVPN。而使用docker比裸机配置OpenVPN方便多了。

OpenVPN Image

ARM

我們使用 kylemanna/docker-openvpn 來實作,因為 dockerhub 上只有 x86 image,如果是 arm 平台則需要自己 build(x86 可跳過)

clone repo 後,直接 build

$ git clone https://github.com/kylemanna/docker-openvpn
$ cd docker-openvpn
$ docker build -t kylemanna/openvpn -f Dockerfile.aarch64 .
如果發生找不到 aarch64/alpine:3.5 的錯誤,修改 Dockerfile 中的 base image 為
FROM alpine:3.15.4
或更新的 alpine 版本即可

相关的中文教程

http://blog.gdb.wiki/2020/03/19/Docker-OpenVPN%E9%95%9C%E5%83%8F%E9%85%8D%E7%BD%AE/#kylemanna-openvpn%E8%BF%99%E4%B8%AA%E9%95%9C%E5%83%8F%E5%B0%86%E5%A4%A7%E9%83%A8%E5%88%86%E7%9A%84%E4%B8%80%E9%94%AE%E5%8C%96%E8%87%AA%E5%8A%A8%E8%84%9A%E6%9C%AC%E8%BF%9B%E8%A1%8C%E6%95%B4%E5%90%88%EF%BC%8C%E9%80%9A%E8%BF%87docker-run%E4%B8%80%E6%AD%A5%E4%B8%80%E6%AD%A5%E8%BF%9B%E8%A1%8C%E9%85%8D%E7%BD%AE

https://koding.work/10-minutes-build-open-vpn-server/

https://taichunmin.idv.tw/blog/2018-05-23-docker-openvpn.html

Quick Start

以README为主

# shaojiemike @ node5 in ~ [23:53:42] C:125
$ export OVPN_DATA="ovpn-data-tsj"

# shaojiemike @ node5 in ~ [23:54:10]
$ docker volume create --name $OVPN_DATA
ovpn-data-example

# shaojiemike @ node5 in ~ [23:54:11]
$ docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://node5.xydustc.me
Unable to find image 'kylemanna/openvpn:latest' locally
latest: Pulling from kylemanna/openvpn
188c0c94c7c5: Pull complete
e470f824352c: Pull complete
d6ed0c7c142e: Pull complete
74586f3c5cd4: Pull complete
cb26244a2b2a: Pull complete
Digest: sha256:643531abb010a088f1e23a1c99d44f0bd417a3dbb483f809caf4396b5c9829a0
Status: Downloaded newer image for kylemanna/openvpn:latest
Processing PUSH Config: 'block-outside-dns'
Processing Route Config: '192.168.254.0/24'
Processing PUSH Config: 'dhcp-option DNS 8.8.8.8'
Processing PUSH Config: 'dhcp-option DNS 8.8.4.4'
Processing PUSH Config: 'comp-lzo no'
Successfully generated config
Cleaning up before Exit ...
CA(certificate authority.)的私钥密码
# shaojiemike @ node5 in ~ [23:55:47]
$ docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki


Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020

Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Generating RSA private key, 2048 bit long modulus (2 primes)
.........+++++
...................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:tsj-node5

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt

Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
......................+.......................+..........................................................+........................................................................................................+........................................+...................................................................................................................................+.....................................................................................................................+......................................................................................................................................................................................................................................+......++*++*++*++*

DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem


Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Generating a RSA private key
.......................................+++++
.........................................+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-73.EeNnaB/tmp.jhHaaF'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-73.EeNnaB/tmp.LGnDjB
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'node5.xydustc.me'
Certificate is to be certified until Jan  1 15:58:37 2025 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Using configuration from /etc/openvpn/pki/easy-rsa-148.CDCEmf/tmp.iJCIGL
Enter pass phrase for /etc/openvpn/pki/private/ca.key:

An updated CRL has been created.

1194貌似有人用了

# shaojiemike @ node5 in ~ [0:02:06]
$ sudo lsof -i UDP:1194
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
openvpn 1834 nobody    6u  IPv4  56802      0t0  UDP node5:openvpn

 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf

  sudo vim /etc/openvpn/server/server.conf

  改成7194等端口

# shaojiemike @ node5 in ~ [0:02:10]
$ sudo service openvpn status
 openvpn.service - OpenVPN service
     Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)
     Active: active (exited) since Tue 2022-04-19 18:42:24 CST; 5 months 11 days ago
   Main PID: 1715 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 154181)
     Memory: 0B
     CGroup: /system.slice/openvpn.service

Apr 19 18:42:24 node5 systemd[1]: Starting OpenVPN service...
Apr 19 18:42:24 node5 systemd[1]: Finished OpenVPN service.

# shaojiemike @ node5 in ~ [0:15:49] C:125
$ sudo service openvpn stop

# shaojiemike @ node5 in ~ [0:16:30]
$ sudo kill -9 1834

在1195启动服务失败,还是1194

# shaojiemike @ node5 in ~ [0:16:46]
$ docker run -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
cb0f7e78f389f112c3c3b230d20d2b50818f6cf59eea2edfaa076c7e8fad7128

# shaojiemike @ node5 in ~ [0:06:01]
$ docker container list
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS                  PORTS                                                 NAMES
6c716b27b3f1   kylemanna/openvpn       "ovpn_run"               49 seconds ago   Up 48 seconds           1194/udp, 0.0.0.0:1195->1195/udp, :::1195->1195/udp   charming_zhukovsky

# 上面是错误的

# shaojiemike @ node5 in ~ [0:16:50]
$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED              STATUS                  PORTS                                                 NAMES
cb0f7e78f389   kylemanna/openvpn       "ovpn_run"               About a minute ago   Up About a minute       0.0.0.0:1194->1194/udp, :::1194->1194/udp             pedantic_euler
产生客户端证书,和ovpn文件
# shaojiemike @ node5 in ~ [0:07:27] C:2
$ docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full tsj-node5-client nopass
Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Generating a RSA private key
...............+++++
...............................+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-1.olaINa/tmp.MfohAO'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-1.olaINa/tmp.EMkEHF
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
139775495048520:error:28078065:UI routines:UI_set_result_ex:result too small:crypto/ui/ui_lib.c:905:You must type in 4 to 1023 characters
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'tsj-node5-client'
Certificate is to be certified until Jan  1 16:08:23 2025 GMT (825 days)

Write out database with 1 new entries
Data Base Updated


# shaojiemike @ node5 in ~ [0:08:24]
$ docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient tsj-node5-client > tsj-node5-client.ovpn

# shaojiemike @ node5 in ~ [0:09:20]
$ ls tsj-node5-client.ovpn
tsj-node5-client.ovpn

还是不行,奇怪

解决办法

ping不通的原因是,脚本默认是8号端口,改成0号教育网端口就行了。

D:\PowerShell> ping -r 9 -w 10000 222.195.72.114

Pinging 222.195.72.114 with 32 bytes of data:
Reply from 222.195.72.114: bytes=32 time=60ms TTL=60
    Route: 172.17.0.3 -> (局域网)
           202.38.73.217 -> (node5)
           202.38.96.189 -> (北京教育网)
           210.45.112.254 -> (合肥教育网)
           222.195.72.114 -> (snode2)
           222.195.72.114 -> 
           202.38.96.188 ->(北京教育网)
           202.38.73.254 ->(合肥教育网)
           172.17.0.1

OpenVPN 3 linux client

apt install

First ensure that your apt supports the https transport:

   # apt install apt-transport-https
Install the OpenVPN repository key used by the OpenVPN 3 Linux packages
   # curl -x http://$proxy_addr:$proxy_http_port -fsSL https://swupdate.openvpn.net/repos/openvpn-repo-pkg-key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/openvpn-repo-pkg-keyring.gpg
Then you need to install the proper repository. Replace $DISTRO with the release name depending on your Debian/Ubuntu distribution.
   # curl -x http://$proxy_addr:$proxy_http_port -fsSL https://swupdate.openvpn.net/community/openvpn3/repos/openvpn3-$DISTRO.list >/etc/apt/sources.list.d/openvpn3.list
   # apt update
Supported distributions:

Distribution| Release| Release name ($DISTRO)| Architecture| DCO support |---| ---| ---| ---| ---| Ubuntu| 20.04| focal |amd64, arm64 |yes Ubuntu| 21.10| impish| amd64, arm64| yes Ubuntu| 22.04| jammy| amd64, arm64|yes

And finally the openvpn3 package can be installed

   # apt install openvpn3
apt需要代理看 apt-get install proxy

openvpn3使用

要提前保留ipv6, 没有设置“流量走当前机器”ssh会断联

Once you’ve moved the file to your Linux system, you can import it.

openvpn3 config-import --config ${client.ovpn}
Configuration imported.  Configuration path: /net/openvpn/v3/configuration/1f475d5cx8d2fx4ef5x8feex25f2871f2642
You can start a new VPN session:
openvpn3 session-start --config ${client.ovpn}
Configuration imported.  Configuration path: /net/openvpn/v3/configuration/1f475d5cx8d2fx4ef5x8feex25f2871f2642
You can manage a running VPN session:
openvpn3 sessions-list
-----------------------------------------------------------------------------
        Path: /net/openvpn/v3/sessions/f83c75e4sd56cs4b27s85bcsc5c6e3ce074e
     Created: Thu Oct  6 20:37:29 2022                  PID: 1034954
       Owner: shaojiemike                            Device: tun1
 Config name: node5-client.ovpn
Session name: snode6.swangeese.fun
      Status: Connection, Client connected
-----------------------------------------------------------------------------

$ openvpn3 session-manage
session-manage: ** ERROR ** One of --pause, --resume, --restart, --disconnect, --cleanup or --log-level must be present

$ openvpn3 session-manage --pause -c node5-client.ovpn
Initiated session pause: /net/openvpn/v3/sessions/f83c75e4sd56cs4b27s85bcsc5c6e3ce074e

需要进一步的研究学习

netplan 的 rule from to table

ip route

ip rule指令学习

iptables

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

基于kylemanna/docker-openvpn

https://openvpn.net/vpn-server-resources/connecting-to-access-server-with-linux/

Image

GIF

全称Graphics Interchange Format,原义是“图像互换格式”。

  • 优点:
  • 文件小
  • 支持动画
  • 支持LZW (Lempel-Ziv-Welch)无损压缩算法
    • 又叫“串表压缩算法”就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩。
  • 缺点
  • 只支持8bit颜色

ICO

图标文件

一般像素为 16*16

BMP (类似的位点图 TGA TIF)

  • bitmap
  • TIF(Tag Image File Format)
  • 优点
  • 图像信息丰富
  • 缺点
  • 几乎不进行压缩,占用空间大

JPG (JPEG)

JPG即JPEG(Joint Photographic Experts Group)。

  • 此格式不适合用来绘制线条、文字或图标,因为JPEG支持极高的压缩率通常会导致图片质量严重受损,不太适用于高清晰的图像应用场景。
  • 对比之下PNG、GIF更适合做绘制线条、文字或图标的首选,不过GIF只支持8bit的颜色,不适合颜色丰富的图片。

JPEG图片压缩原理

JPEG的压缩方式主要有四种,其中一种是基于空间DPCM的无损压缩,另外三种是基于DCT的有损压缩。

  1. 基于DCT的顺序编码:
  2. 基于DCT变换原理,按照从上之下,从左至右的顺序对图像数据进行编码压缩。当接收端收到数据后,再按照这个顺序进行解码,在此过程中存在图像丢失,因此是有损压缩;
  3. 基于DCT的累进编码:
  4. 也是基于DCT变换原理,不过是对图像进行多次扫描,从而对图像进行进一步的数据压缩。所以图像还原时,看到的图像时粗略图,而后逐步细化,直到结束;
  5. 基于DCT的分层编码:
  6. 以图像分辨率为基准进行编码,从低分辨率开始,逐渐提高分辨率,直到于原图像的分辨率一致。图像的解码也是这样的步骤;
  7. 基于空间DPCM的无损压缩:
  8. 采用预测法和哈夫曼编码(或算术编码)以保证重建图像与原图像完全相同(设均方误差为零);

JFIF

JPEG文件交换格式(英语:JPEG File Interchange Format,简称JFIF)是一个图像文件格式标准。它是一种交换符合JPEG交换格式(JIF)标准的JPEG编码文件的格式。它解决了JIF在简单JPEG编码文件交换方面的一些限制。与所有符合JIF的文件一样,JFIF文件中的图像数据使用JPEG标准的技术压缩,因此JFIF有时被称为“JPEG/JFIF”。

Webp

2010年,谷歌为了让网络上的图片更小,让网站加载速度更快,提出了同画质下,比JPEG格式图像小40%的Webp格式。 * 主要是面向网页图片,截至2021年5月,已有94%的浏览器支持此格式 * Webp也支持无损压缩的选项。

PNG

是Portable Network Graphic的缩写,是一种光栅图像格式,是为了克服GIF格式的局限性并取代GIF格式而产生的。 PNG是一种无损的数据压缩和开放格式文件,没有版权限制。 * 采用了基于LZ77的无损的派生算法,能够在在保证图片清晰、逼真的前提下,达到更高的压缩比。 * PNG支持对原图像定义256个透明层次,使得图像的边缘能与任何背景平滑融合,这种功能是GIF和JPEG没有的。 * PNG图片可以分为三个类型,分别为 PNG 8/ PNG 24 / PNG 32: * PNG 8:8即指8bit,2^8 = 256种颜色; * PNG 24:24指的是24位,分为3个,即RGB,各占8bit,可以包含2^24种颜色; * PNG 32:32表示有32bit,除了RGB占了24bit,还有8 bit可以表示透明度,0-255表示透明程度;

压缩效果对比

同分辨率的图片(1491*1265), 使用格式工厂默认设置

ico(1616)|gif(170144)|webp |jpg | jfif | png|TIF|bmp(tga) |---|---|---|---|---|---|---|---| 1k|13k|159k|218K|248K|1.6M|1.62M|5.4M

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://zhuanlan.zhihu.com/p/156639005

Video

视频信息软件Mediainfo

同样是1080P 25帧,码率不同,大小差异很大。

或者(有时候会失效,eg 720P)

相关概念

CRF

CRF(英文:constant ratefactor 意思:压缩质量)是动态码率,要看你拍摄的视频画面抖动切换的程度,如果比较安静就20,动的厉害就25。

crf18就接近无损,字幕组惯用20-22,crf23是默认值。 CRF的值越小,视频将会越清晰 当然视频质量就会更大。

2-pass

2-pass通过两次编码,第一次编码是先对整个文件进行扫描,记录一些统计信息,第二次编码时根据前面记录的统计信息再进行编码。这么做虽然转换时间会漫长,但压出的片子会有更好的画质,画面细节更好,而且体积会更小。

常用于非实时转码的情景。

视频压缩实践

疫情线上参会邮件投递Presentation视频,邮件大小限制100MB。PPT生成的过大

格式工厂(Format Factory)压缩

直接自定义导入导出,默认设置就行(确定分辨率不变的情况下,大小无法限制)。视频部分就只有原来五分之一(中间),而且完全看不出损失。

如果要最小大小,选择“转mp4”,然后“输出设置”选择“低质量和大小”,最后在分辨率选回原来的分辨率。

如果不熟悉H.265的参数设置,压缩后不一定比H.264小。

PS: H.264中熵编码有两种方法: 1. 一种是对所有的待编码的符号采用统一的VLC(UVLC :Universal VLC), 2. 另一种是采用内容自适应的二进制算术编码(CABAC:Context-Adaptive Binary Arithmetic Coding)。CABAC是可选项

CABAC动态的根据内容的码率能在效能与压缩效率上取得相当大的改善空间,但是顺序处理造成资料依存性(Data Dependency)偏高。

FFmpeg命令行

已知大小需求来计算需要压缩的码率。直接设置压缩后的平均码率就行,常见软件有:小丸工具箱,HandBrake, 剪映

首先需要知道如何计算码率

ffmpeg是一个自由软件,可以运行音频、视频多种格式的录影、转换、流功能,包含 * libavcodec--这是一个用于多个项目中的音频、视频的解码器库, * libavformat--一个音频和视频格式转换库。

# 视频流码率 500k, 音频流码率 50k
ffmpeg -i huawei_report_English_video.mp4 -c:v libx264 -b:v 500k -b:a 50k out_500k.mp4    
# 或者设置最大最小
ffmpeg -i huawei_report_English_video.mp4 -minrate 100K -maxrate 500K -bufsize 2000K out.mp4
结果如下
$ ls
-rw-r--r--  1 shaojiemike staff 119M Jan  2 16:59 huawei_report_English_video.mp4
-rw-r--r--  1 shaojiemike staff  50M Jan  2 17:23 out_500k.mp4
-rw-r--r--  1 shaojiemike staff  24M Jan  2 17:14 out.mp4

$ ffmpeg -i out_500k.mp4 -hide_banner
  Duration: 00:12:25.68, start: 0.000000, bitrate: 553 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 493 kb/s, 30.30 fps, 30.30 tbr, 30303 tbn, 60.61 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 50 kb/s (default)

# shaojiemike @ snode6 in ~/test/ffmpeg [17:14:42] C:1
$ ffmpeg -i out.mp4 -hide_banner
  Duration: 00:12:25.68, start: 0.000000, bitrate: 269 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 125 kb/s, 30.30 fps, 30.30 tbr, 30303 tbn, 60.61 tbc (default)
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 134 kb/s (default)

# shaojiemike @ snode6 in ~/test/ffmpeg [17:15:29] C:1
$ ffmpeg -i huawei_report_English_video.mp4 -hide_banner
  Duration: 00:12:25.66, start: 0.000000, bitrate: 1330 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1151 kb/s, 30.30 fps, 30.30 tbr, 30303 tbn, 60 tbc (default)

视频码率(视频比特率)

同样分辨率下,视频文件的码率越大,压缩比就越小,画面质量就越高。码率越高,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。体积越大,说明压缩比小,越接近原文件。

帧率与码率的关系:帧率多,则每秒图片数目多;码率越高,每张图片质量越清晰。

码率的甜品点

VMAF - Video Multi-Method Assessment Fusion 视频多方法评估

3Mbps是1080p的甜品点。

其他标准

视频压缩编码

视频压缩原理看差评君的就懂了,讲的真好。

柴知道也行

为什么有这么多标准:

H26x的视频的编解码“贵”: * 视频编码由视频作者解决 * 使用H26x标准解码价格不菲

视频编码

我们知道,其实视频就是一帧一帧的图片。计算一下,一部25帧每秒,90分钟,分辨率为1024*768,24位真彩色的视频,没有经过压缩,大小为

1Byte(字节) = 8bit(位)
一帧大小 = 1024 * 768 * 24 = 18874368(bit) = 2359296(Byte)
总帧数 = 90 * 60 * 25 = 135000
总大小 = 一帧大小 * 总帧数 = 2359296 * 135000 = 318504960000(Byte)= 303750(MB)≈ 296(GB)
  从上面的计算可以看出,我们储存一部90分钟没压缩的电影需要296GB的,2部电影便可占满我们电脑整个硬盘。所以我们需要对视频进行压缩,这种视频压缩技术就是我们所说的编码。   视频编码方式:H.26X(H.261、H.262、…、H.264(目前最常用)、H.265)   音频编码方式:MP3、AAC等   通过视频压缩算法,减少了视频文件的大小。压缩比越大,解压缩还原后播放的视频越失真,这是因为压缩的同时不可避免的丢失了视频中原来图像的数据信息。

一般ITU(国际电信联盟)和ISO(国际标准化组织)来制定 1. ISO主导的MPEG系列: MPEG-1 用于 VCD, MPEG-2用于DVD 2. h.26x由ITU主导,比如 H.261到H.263 3. 两者联合制定了 H.264-H.265 1. 各自别称 MPEG-4/AVC(Advanced Video Coding)和 MPEG-4/HEVC(High Efficiency Video Coding)

B站新支持的AOM联盟的AV1标准,免费而且没有潜在的版权问题。

画质不变时,编码标准越先进,码率越低.

相对于优酷等最高大约4000的码率,虽然B站码率低,但是以普通的动画素材为主的视频而言,因为动画以简单的单色大色块居多,一般来说1500左右的码率就足够了。

目前 AVC 依然是使用最广泛的编码标准,无论新老设备都可以播放 AVC 视频,因此保留 AVC 编码可以保证广泛的兼容性。

但是 AVC 在编码超高清视频时,输出码率较高,无法保证良好的观看体验;同时很多 AVC 解码器也不支持 HDR 和 8K 视频的解码。而 HEVC 和 AV1 对于超高清视频的压缩能力明显提升,对于 HDR 和 8K 视频的支持显著改善,因此 B 站使用更先进的编码标准为用户提供服务。

H.261的关键两原理

DCT变换

低频率部分是最重要的信息。

视频帧分类(初版)

先将视频分块, 1. 重用不变的色块 2. 对于平移的色块只记录移动矢量

帧间预测 & 帧内预测 关键帧I帧 与 预测帧P帧

MPEG-1

在 H.261 的基础上加入 1. 双向预测帧B帧 1. 更省空间,但是视频编码解码需要算力更大 2. 帧序列的概念

BT文件命名概述

  • 标 AVC / H264 / H.264 / x264 的可以一律看作H264
  • 标 HEVC / HVC1 / H265 / H.265 / x265 的可以一律看作H265
  • GB / CHS / SC / zh-Hans 指简中
  • BIG5 / CHT / TC / zh-Hant 指繁中
  • 远离闲杂播放器,拥抱 Potplayer / IINA / VLC / MPC-BE / MPV
  • 容器
  • mkv,mp4
  • rmvb
    • RealMedia可变比特率(RMVB)。在网速缓慢的时代,边下载边看是巨大优势
    • 缺点:rm/rmvb格式编解码都是要收费。压缩比和速度都远逊于H264
  • avi
    • AVI是英语Audio Video Interleave(“音频视频交织”或译为“音频视频交错”)的首字母缩写,由微软在1992年11月推出的一种多媒体文件格式,用于对抗苹果Quicktime的技术。 现在所说的AVI多是指一种封装格式。
    • 图像数据和声音数据是交互存放的。从尾部的索引可以索引跳到自己想放的位置。
    • AVI與MP4本身只有聲音與影像沒有字幕

文字编码

  • ANSI 编码
  • 美国国家标准学会(American National Standards Institute)的缩写
  • ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码
  • 在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
  • GB2312
  • 国家推出的常见6000汉字
  • GBK
  • 微软拓展了繁体汉字的普通技术规范,所以windows上基本都是默认GBK
  • UNICODE
  • Universal Multiple-Octet Coded Character Set 统一码,初始就25种文字
  • 采用了书写编码,导致会有长得像,但是完全不同的文字。导致很多钓鱼网站
  • UTF-8编码
  • UTF-8全称:8bit Unicode Transformation Format,8比特Unicode通用转换格式,是一种变长的编码方式。
  • 其编码中的第一个字节仍然与ASCII兼容。

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://bravoing.github.io/2020/02/14/%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E5%99%A8%E5%8E%9F%E7%90%86%E3%80%81%E5%88%86%E8%BE%A8%E7%8E%87%E3%80%81%E5%B8%A7%E7%8E%87%E3%80%81%E7%A0%81%E7%8E%87/

作者:哔哩哔哩技术 https://www.bilibili.com/read/cv16198183 出处:bilibili

https://www.youtube.com/watch?v=0LSHhatwTxM

柴知道也行

https://www.jianshu.com/p/c23f3ea5443d

Streaming Protocol & Streaming Coding

流式传输 协议

常用的流媒体协议主要有两类:

  • HTTP渐进下载
  • 基于RTSP/RTP的实时流媒体协议。

在流式传输的实现方案中,一般采用

  1. HTTP/TCP来传输控制信息,
  2. 用RTP/UDP来传输实时多媒体数据。

RTP 、 RTCP (Real-time Transport Control Protocol)

  • 由IETF的多媒体传输工作小组1996年在RFC 1889中公布。
  • RTCP是RTP的一个姐妹协议
  • RTP协议的特点
  • RTP协议是建立在UDP协议上的。
  • RTP并不保证传送或防止无序传送,也不确定底层网络的可靠性。
  • RTP实行有序传送,RTP中的序列号允许接收方重组发送方的包序列。
  • RTP不像http和ftp可完整的下載整個影視檔,它是以固定的資料率在網路上發送資料,用戶端也是按照這種速度觀看影視檔,當影視畫面播放過後,就不可以再重複播放,除非重新向伺服器端要求資料。
  • RTCP特点
  • RTCP的主要功能是为RTP所提供的服务质量提供反馈来试图提高服务质量。RTCP收集相关媒体连接的统计信息,例如:传输字节数,传输分组数,丢失分组数,时延抖动,单向和双向网络延迟等等。来判断是否限制信息流量或改用压缩比较小的编解码器。
  • RTCP本身不提供数据加密或身份认证,其伴生协议SRTCP安全实时传输控制协议则可用于此类用途。

SRTP & SRTCP(Secure Real-time Transport Protocol)

  • 最早由IETF於2004年3月作為RFC3711發佈,提供加密、消息認證、完整性保證和重放保護。

RTSP(Realtime Streaming Protocol)

  • 于1998年发布为RFC 2326。RTSP 2.0 于2016年发布为RFC 7826,作为RTSP 1.0的替代品。
  • 专为娱乐和通信系统的使用,以控制流媒体服务器。
  • 媒体服务器的客户端发布VCR命令,例如播放,录制和暂停,以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录音)的媒体流。
  • 流数据本身的传输不是RTSP的任务。大多数RTSP服务器使用实时传输协议(RTP)和实时传输控制协议(RTCP)结合媒体流传输。
  • 与RTP最大的区别在于:
  • RTSP是一种双向实时数据传输协议,它允许客户端向服务器端发送请求,如回放、快进、倒退等操作
  • 当然RTSP可基于RTP来传送数据,还可以选择TCP、UDP、组播UDP等通道来发送数据,具有很好的扩展性。
  • 它是一种类似于HTTP协议的网络应用协议。

RTMP(Real Time Messaging Protocol)

  • Adobe于2012年12月21日发布了该协议1.0版本的规范。
  • 是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议。
  • 协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。
  • RTMPT封装在HTTP请求之中,可穿越防火墙;
  • RTMPS类似RTMPT,但使用的是HTTPS连接。
  • RTMPE,使用Adobe自有安全機制加密的RTMP。雖然實現上的細節是專有的,但該機制使用行業標準的密碼學加密演算法。
  • RTMP 是目前主流的流媒体传输协议,广泛用于直播领域。
  • 默认通信端口1935。RTMP URL格式:rtmp://ip:[port]/appName/streamName
  • 特点
  • RTMP协议是采用实时的流式传输,所以不会缓存文件到客户端,这种特性说明用户想下载RTMP协议下的视频是比较难的;
  • 视频流可以随便拖动,既可以从任意时间点向服务器发送请求进行播放,并不需要视频有关键帧。相比而言,HTTP协议下视频需要有关键帧才可以随意拖动。
  • RTMP协议支持点播/回放(通俗点将就是支持把flv,f4v,mp4文件放在RTMP服务器,客户端可以直接播放),直播(边录制视频边播放)。

MMS(Microsoft Media Server Protocol)

  • 访问并流式接收Window Media服务器中.asf文件的一种协议。
  • 可以用Windows自带的Windows Media Player来观看

Web RTC(Web Real-Time Communications)

  • 于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的W3C推荐标准。
  • 是一个支持网页浏览器进行实时语音对话或视频对话的API。
  • 目前主要应用于视频会议和连麦中。

HLS(Http Live Streaming, 明显是基于HTTP)

  • 是由苹果提出基于HTTP的流媒体传输协议。
  • 原理
  • 直播客户端获取到的并不是一个完整的数据流,HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式)(MPEG-2 Transport Stream;又称MPEG-TS、MTS、TS),而客户端则不断的下载并播放这些小文件,因为服务器总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。
  • 特点
  • 优点就是HTML5可以直接打开播放;分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。
  • 缺点就是延迟高。

HTTP-FLV(明显是基于HTTP)

  • 将直播流模拟成FLV文件,通过HTTP协议进行下载的模式来实现流媒体传输的协议。

各种软件使用的流式协议

moonlight

官网写着

Moonlight (formerly Limelight) is an open source implementation of NVIDIA's GameStream protocol.

那么 NVIDIA's GameStream protocol是什么呢?

NVIDIA uses high speed, low latency video encoders built into GeForce GTX or RTX GPUs along with an efficient streaming software protocol integrated into GeForce Experience.

我只能说看上去像自研的~但是马上也要没了

Nvidia isn’t just ending support for GameStream, it’s planning to fully remove the feature from existing Shield hardware in February 2023. Nvidia is recommending that Shield users switch to Steam Link, which is a similar way of streaming PC games to a Shield device.

github老哥分析了。但我只能说肯定不是上面常见的类型。

sequenceDiagram
  Client ->> Host: Discovery/Connect
  Note over Client: Send client connection ID
  Host ->> Client: Discovery/Connect ACK
  Note over Client: Got host connection ID, start client handshake
  Client ->> Host: Reliable/Control:ClientHandshake
  par Discovery Channel
    loop While True
      Host ->> Client: Unconnected/Discovery:PingRequest
      Client ->> Host: Unconnected/Discovery:PingResponse
    end
  end
  Host ->> Client: Reliable/Control:ServerHandshake
  Note over Client: Got mtu, start authentication
  Client ->> Host: Reliable/Control:AuthenticationRequest
  Host ->> Client: Reliable/Control:AuthenticationResponse
  Host ->> Client: Reliable/Control:NegotiationInit
  Note over Client: Got host supported audio/video codecs
  Client ->> Host: Reliable/Control:NegotiationSetConfig
  Note over Client: Send selected codecs and config
  Host ->> Client: Reliable/Control:NegotiationSetConfig
  Note over Client: Got final config, respond with complete
  Client ->> Host: Reliable/Control:NegotiationComplete
  par Audio Data Channel
    Host ->> Client: Reliable/Control:StartAudioData
    loop Not StopAudioData
      Host ->> Client: Unreliable/Data:Packet 
    end
  and Video Data Channel
    Host ->> Client: Reliable/Control:StartVideoData
    loop Not StopVideoData
      Host ->> Client: Unreliable/Data:Packet 
    end
  end
  Client ->> Host: Discovery/Disconnect

流式传输 视频压缩编码

主流还是 H.264 或者 HEVC。 流式传输时为了保证帧率可能会牺牲画面。

Steam Link 的相关设置

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

山东布谷科技 https://www.bilibili.com/read/cv9502267?from=search&spm_id_from=333.337.0.0 出处:bilibili