TSDuck์„ ์‚ฌ์šฉํ•˜์—ฌ IP(TS) ์ŠคํŠธ๋ฆผ ๋ชจ๋‹ˆํ„ฐ๋ง

ํ˜„์žฌ IP(TS) ์ŠคํŠธ๋ฆผ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ๊ธฐ์„ฑํ’ˆ(๋…์ ) ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด VB ะธ iQ, ๊ทธ๋“ค์€ ์ƒ๋‹นํžˆ ํ’๋ถ€ํ•œ ๊ธฐ๋Šฅ ์„ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ TV ์„œ๋น„์Šค๋ฅผ ๋‹ค๋ฃจ๋Š” ๋Œ€ํ˜• ์‚ฌ์—…์ž๋Š” ๊ทธ๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์—์„œ๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. TSDuck, CC(์—ฐ์† ์นด์šดํ„ฐ) ์นด์šดํ„ฐ ๋ฐ ๋น„ํŠธ๋ ˆ์ดํŠธ์— ์˜ํ•œ IP(TS) ์ŠคํŠธ๋ฆผ์˜ ์ตœ์†Œ ์ œ์–ด๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ž„๋Œ€๋œ L2 ์ฑ„๋„(์˜ˆ๋ฅผ ๋“ค์–ด ๋Œ€๊ธฐ์—ด์—์„œ ์†์‹ค ์นด์šดํ„ฐ๋ฅผ ์ฝ์–ด ์ •์ƒ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์—†์Œ)์„ ํ†ตํ•ด ํŒจํ‚ท ์†์‹ค ๋˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์ž…๋‹ˆ๋‹ค.

TSDuck์— ๋Œ€ํ•ด ์•„์ฃผ ๊ฐ„๋‹จํžˆ

TSDuck์€ TS ์ŠคํŠธ๋ฆผ ์กฐ์ž‘์„ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค(2-Clause BSD ๋ผ์ด์„ ์Šค) ์†Œํ”„ํŠธ์›จ์–ด(์ฝ˜์†” ์œ ํ‹ธ๋ฆฌํ‹ฐ ์„ธํŠธ ๋ฐ ๋งž์ถคํ˜• ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐœ๋ฐœ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ์œผ๋กœ IP(๋ฉ€ํ‹ฐ์บ์ŠคํŠธ/์œ ๋‹ˆ์บ์ŠคํŠธ), http, hls, dvb ํŠœ๋„ˆ, dektec dvb-asi ๋ณต์กฐ๊ธฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚ด๋ถ€ TS ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์žˆ๊ณ  ํŒŒ์ผ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์€ ํŒŒ์ผ, IP(๋ฉ€ํ‹ฐ์บ์ŠคํŠธ/์œ ๋‹ˆ์บ์ŠคํŠธ), hls, dektec dvb-asi ๋ฐ HiDes ๋ณ€์กฐ๊ธฐ, ํ”Œ๋ ˆ์ด์–ด(mplayer, vlc, xine) ๋ฐ ๋“œ๋กญ์— ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, PID ๋ฆฌ๋งคํ•‘, ์Šคํฌ๋žจ๋ธ”๋ง/๋””์Šคํฌ๋žจ๋ธ”๋ง, CC ์นด์šดํ„ฐ ๋ถ„์„, ๋น„ํŠธ๋ ˆ์ดํŠธ ๊ณ„์‚ฐ ๋ฐ TS ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ๊ธฐํƒ€ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํŠธ๋ž˜ํ”ฝ ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์‚ฌ์ด์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” IP ์ŠคํŠธ๋ฆผ(๋ฉ€ํ‹ฐ์บ์ŠคํŠธ)์ด ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  bitrate_monitor ํ”„๋กœ์„ธ์„œ(์ด๋ฆ„์—์„œ ๋ช…ํ™•ํ•จ) ๋ฐ ์—ฐ์†์„ฑ(CC ์นด์šดํ„ฐ ๋ถ„์„)์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. IP ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ๋ฅผ TSDuck์—์„œ ์ง€์›ํ•˜๋Š” ๋‹ค๋ฅธ ์ž…๋ ฅ ์œ ํ˜•์œผ๋กœ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žˆ๋‹ค ๊ณต์‹ ๋นŒ๋“œ/ํŒจํ‚ค์ง€ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ์šด์˜ ์ฒด์ œ์šฉ TSDuck. ๋ฐ๋น„์•ˆ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋ฐ๋น„์•ˆ 8๊ณผ ๋ฐ๋น„์•ˆ 10์—์„œ ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ TSDuck 3.19-1520 ๋ฒ„์ „ ์‚ฌ์šฉ, OS๋Š” Linux ์‚ฌ์šฉ (์†”๋ฃจ์…˜ ์ค€๋น„๋Š” debian 10 ์‚ฌ์šฉ, ์‹ค์‚ฌ์šฉ์€ CentOS 7 ์‚ฌ์šฉ)

TSDuck ๋ฐ OS ์ค€๋น„

์‹ค์ œ ํ๋ฆ„์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์ „์— TSDuck์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์นด๋“œ ๋˜๋Š” OS(์†Œ์ผ“) ์ˆ˜์ค€์—์„œ ๋“œ๋กญ์ด ์—†๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋˜๋Š” "์„œ๋ฒ„ ๋‚ด๋ถ€"์—์„œ ๋“œ๋กญ์ด ๋ฐœ์ƒํ•œ ์œ„์น˜๋ฅผ ๋‚˜์ค‘์— ์ถ”์ธกํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ethtool -S ethX ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์นด๋“œ ์ˆ˜์ค€์—์„œ ๋“œ๋กญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠœ๋‹์€ ๋™์ผํ•œ ethtool์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ RX ๋ฒ„ํผ(-G)๋ฅผ ๋Š˜๋ฆฌ๊ณ  ๋•Œ๋กœ๋Š” ์ผ๋ถ€ ์˜คํ”„๋กœ๋“œ(-K)๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•จ). ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ„์„๋œ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค๋ฅธ ํŠธ๋ž˜ํ”ฝ์˜ ์กด์žฌ๋กœ ์ธํ•ด ๋ถ„์„๊ธฐ ํฌํŠธ์—์„œ ๋“œ๋กญ์ด ์ •ํ™•ํžˆ ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ ๊ด€๋ จ๋œ ์˜ค ํƒ์ง€๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(XNUMX๊ฐœ์˜ ํฌํŠธ๊ฐ€ ์žˆ๋Š” ๋ฏธ๋‹ˆ ์ปดํ“จํ„ฐ/NUC ์‚ฌ์šฉ) ๋ถ„์„๊ธฐ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์žฅ์น˜์˜ ๋‚˜๋จธ์ง€ ํŠธ๋ž˜ํ”ฝ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ถ„์„๋œ ํŠธ๋ž˜ํ”ฝ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ƒ ํ™˜๊ฒฝ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์—ฌ๊ธฐ์„œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•˜๋ฉฐ ๋ฌผ๋ฆฌ์  ํฌํŠธ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๊ฐ€์ƒ ๋จธ์‹  ๋‚ด๋ถ€์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋๋‚˜๋Š” ํŒจํ‚ท ๋“œ๋กญ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ ๋‚ด๋ถ€ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ ๋ฐ ์ˆ˜์‹ 

TSDuck์„ ์ค€๋น„ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ netns๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ํ˜ธ์ŠคํŠธ ๋‚ด์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์ƒ์„ฑํ•˜๊ณ  ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ์ค€๋น„:

ip netns add P #ัะพะทะดะฐั‘ะผ netns P, ะฒ ะฝั‘ะผ ะฑัƒะดะตั‚ ะฟั€ะพะธัั…ะพะดะธั‚ัŒ ะฐะฝะฐะปะธะท ั‚ั€ะฐั„ะธะบะฐ
ip link add type veth #ัะพะทะดะฐั‘ะผ veth-ะฟะฐั€ัƒ - veth0 ะพัั‚ะฐะฒะปัะตะผ ะฒ netns ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ (ะฒ ัั‚ะพั‚ ะธะฝั‚ะตั€ั„ะตะนั ะฑัƒะดะตั‚ ะณะตะฝะตั€ะธั€ะพะฒะฐั‚ัŒัั ั‚ั€ะฐั„ะธะบ)
ip link set dev veth1 netns P #veth1 - ะฟะพะผะตั‰ะฐะตะผ ะฒ netns P (ะฝะฐ ัั‚ะพะผ ะธะฝั‚ะตั€ั„ะตะนัะต ะฑัƒะดะตั‚ ะฟั€ะธั‘ะผ ั‚ั€ะฐั„ะธะบะฐ)
ip netns exec P ifconfig veth1 192.0.2.1/30 up #ะฟะพะดะฝะธะผะฐะตะผ IP ะฝะฐ veth1, ะฝะต ะธะผะตะตั‚ ะทะฝะฐั‡ะตะฝะธั ะบะฐะบะพะน ะธะผะตะฝะฝะพ
ip netns exec P ip ro add default via 192.0.2.2 #ะฝะฐัั‚ั€ะฐะธะฒะฐะตะผ ะผะฐั€ัˆั€ัƒั‚ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะฒะฝัƒั‚ั€ะธ nents P
sysctl net.ipv6.conf.veth0.disable_ipv6=1 #ะพั‚ะบะปัŽั‡ะฐะตะผ IPv6 ะฝะฐ veth0 - ัั‚ะพ ะดะตะปะฐะตั‚ัั ะดะปั ั‚ะพะณะพ, ั‡ั‚ะพะฑั‹ ะฒ ัั‡ั‘ั‚ั‡ะธะบ TX ะฝะต ะฟะพะฟะฐะดะฐะป ะฟะพัั‚ะพั€ะพะฝะฝะธะน ะผัƒัะพั€
ifconfig veth0 up #ะฟะพะดะฝะธะผะฐะตะผ ะธะฝั‚ะตั€ั„ะตะนั veth0
ip route add 239.0.0.1 dev veth0 #ัะพะทะดะฐั‘ะผ ะผะฐั€ัˆั€ัƒั‚, ั‡ั‚ะพะฑั‹ ะžะก ะฝะฐะฟั€ะฐะฒะปัะปะฐ ั‚ั€ะฐั„ะธะบ ะบ 239.0.0.1 ะฒ ัั‚ะพั€ะพะฝัƒ veth0

ํ™˜๊ฒฝ์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ ๋ถ„์„๊ธฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ip netns exec P tsp --realtime -t 
 -I ip 239.0.0.1:1234 
 -P continuity 
 -P bitrate_monitor -p 1 -t 1 
 -O drop

์—ฌ๊ธฐ์„œ "-p 1 -t 1"์€ ๋งค์ดˆ ๋น„ํŠธ ์ „์†ก๋ฅ ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๋งค์ดˆ ๋น„ํŠธ ์ „์†ก๋ฅ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
10Mbps ์†๋„๋กœ ํŠธ๋ž˜ํ”ฝ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

tsp -I craft 
 -P regulate -b 10000000 
 -O ip -p 7 -e --local-port 6000 239.0.0.1:1234

์—ฌ๊ธฐ์„œ "-p 7 -e"๋Š” 7๊ฐœ์˜ TS ํŒจํ‚ท์„ 1๊ฐœ์˜ IP ํŒจํ‚ท์œผ๋กœ ์••์ถ•ํ•˜๊ณ  ์—ด์‹ฌํžˆ(-e) ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. IP ํŒจํ‚ท์„ ๋ณด๋‚ด๊ธฐ ์ „์— ํ•ญ์ƒ ๋งˆ์ง€๋ง‰ ํ”„๋กœ์„ธ์„œ์—์„œ 7 TS ํŒจํ‚ท์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

๋ถ„์„๊ธฐ๋Š” ์˜ˆ์ƒ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

* 2020/01/03 14:55:44 - bitrate_monitor: 2020/01/03 14:55:44, TS bitrate: 9,970,016 bits/s
* 2020/01/03 14:55:45 - bitrate_monitor: 2020/01/03 14:55:45, TS bitrate: 10,022,656 bits/s
* 2020/01/03 14:55:46 - bitrate_monitor: 2020/01/03 14:55:46, TS bitrate: 9,980,544 bits/s

์ด์ œ ๋ฐฉ์šธ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

ip netns exec P iptables -I INPUT -d 239.0.0.1 -m statistic --mode random --probability 0.001 -j DROP

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

* 2020/01/03 14:57:11 - continuity: packet index: 80,745, PID: 0x0000, missing 7 packets
* 2020/01/03 14:57:11 - continuity: packet index: 83,342, PID: 0x0000, missing 7 packets 

์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท ์†์‹ค์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ (ip netns exec P iptables -F) ์ƒ์„ฑ๊ธฐ ๋น„ํŠธ ์ „์†ก๋ฅ ์„ 100Mbps๋กœ ๋†’์ด์‹ญ์‹œ์˜ค. ๋ถ„์„๊ธฐ๋Š” ๋งŽ์€ CC ์˜ค๋ฅ˜์™€ 75 ๋Œ€์‹  ์•ฝ 100Mbps๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ˆ„๊ฐ€ ์ฑ…์ž„์„ ์ ธ์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๊ธฐ์— ์‹œ๊ฐ„์ด ์—†๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ •๋œ ์ˆ˜์˜ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท(TS ํŒจํ‚ท 700000๊ฐœ = IP ํŒจํ‚ท 100000๊ฐœ):

# ifconfig veth0 | grep TX
       TX packets 151825460  bytes 205725459268 (191.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# tsp -I craft -c 700000 -P regulate -b 100000000 -P count -O ip -p 7 -e --local-port 6000 239.0.0.1:1234
* count: PID    0 (0x0000):    700,000 packets
# ifconfig veth0 | grep TX
        TX packets 151925460  bytes 205861259268 (191.7 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ •ํ™•ํžˆ 100000๊ฐœ์˜ IP ํŒจํ‚ท์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(151925460-151825460). ๋ถ„์„๊ธฐ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด veth1์˜ RX ์นด์šดํ„ฐ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. veth0์˜ TX ์นด์šดํ„ฐ์™€ ์—„๊ฒฉํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์†Œ์ผ“ ์ˆ˜์ค€์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

# ip netns exec P cat /proc/net/udp                                                                                                           
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops             
  133: 010000EF:04D2 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 72338 2 00000000e0a441df 24355 

์—ฌ๊ธฐ์—์„œ ๋“œ๋กญ ์ˆ˜ = 24355๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TS ํŒจํ‚ท์—์„œ ์ด๊ฒƒ์€ 170485 ๋˜๋Š” 24.36์˜ 700000%์ด๋ฏ€๋กœ ์†์‹ค๋œ ๋น„ํŠธ ์ „์†ก๋ฅ ์˜ ๋™์ผํ•œ 25%๊ฐ€ udp ์†Œ์ผ“์˜ ๋“œ๋กญ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UDP ์†Œ์ผ“์˜ ๋“œ๋กญ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ„ํผ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์†Œ์ผ“ ๋ฒ„ํผ ํฌ๊ธฐ์™€ ์ตœ๋Œ€ ์†Œ์ผ“ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

# sysctl net.core.rmem_default
net.core.rmem_default = 212992
# sysctl net.core.rmem_max
net.core.rmem_max = 212992

๋”ฐ๋ผ์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋ช…์‹œ์ ์œผ๋กœ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š์œผ๋ฉด 208KB์˜ ๋ฒ„ํผ๋กœ ์†Œ์ผ“์ด ์ƒ์„ฑ๋˜์ง€๋งŒ ๋” ๋งŽ์ด ์š”์ฒญํ•ด๋„ ์—ฌ์ „ํžˆ ์š”์ฒญ๋œ ๊ฒƒ์„ ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. IP ์ž…๋ ฅ(-buffer-size)์— ๋Œ€ํ•ด tsp์—์„œ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ ์†Œ์ผ“ ํฌ๊ธฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ตœ๋Œ€ ์†Œ์ผ“ ๋ฒ„ํผ ํฌ๊ธฐ๋งŒ ์„ค์ •ํ•˜๊ณ  tsp ์ธ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

sysctl net.core.rmem_max=8388608
ip netns exec P tsp --realtime -t -I ip 239.0.0.1:1234 -b 8388608 -P continuity -P bitrate_monitor -p 1 -t 1 -O drop

์ด ์†Œ์ผ“ ๋ฒ„ํผ ์กฐ์ •์œผ๋กœ ๋ณด๊ณ ๋œ ๋น„ํŠธ ์ „์†ก๋ฅ ์€ ์•ฝ 100Mbps์ด๋ฉฐ CC ์˜ค๋ฅ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

tsp ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ. ํ•˜๋‚˜์˜ ์ฝ”์–ด i5-4260U CPU @ 1.40GHz์— ๋น„ํ•ด 10Mbps ํ๋ฆ„ ๋ถ„์„์—๋Š” 3-4% CPU, 100Mbps - 25%, 200Mbps - 46%๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. % Packet Loss๋ฅผ ์„ค์ •ํ•˜๋ฉด CPU์˜ ๋ถ€ํ•˜๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ฐ์†Œํ•  ์ˆ˜ ์žˆ์Œ).

๋ณด๋‹ค ์ƒ์‚ฐ์ ์ธ ํ•˜๋“œ์›จ์–ด์—์„œ๋Š” ๋ฌธ์ œ ์—†์ด 1Gb/s ์ด์ƒ์˜ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๋„คํŠธ์›Œํฌ ์นด๋“œ์—์„œ ํ…Œ์ŠคํŠธ

veth ์Œ์—์„œ ํ…Œ์ŠคํŠธํ•œ ํ›„ ๋‘ ๊ฐœ์˜ ํ˜ธ์ŠคํŠธ ๋˜๋Š” ํ•œ ํ˜ธ์ŠคํŠธ์˜ ๋‘ ํฌํŠธ๋ฅผ ๊ฐ€์ ธ์™€ ํฌํŠธ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ํ•˜๋‚˜์—์„œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ์—์„œ ๋ถ„์„๊ธฐ๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋†€๋ผ์›€์ด ์—†์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋ชจ๋“  ๊ฒƒ์€ ์ฒ ์— ๋‹ฌ๋ ค ์žˆ์œผ๋ฉฐ ์•ฝํ• ์ˆ˜๋ก ์—ฌ๊ธฐ์— ๋” ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ(Zabbix)์—์„œ ์ˆ˜์‹ ํ•œ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ

tsp์—๋Š” SNMP ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ธฐ๊ณ„ ํŒ๋… ๊ฐ€๋Šฅ API๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. CC ๋ฉ”์‹œ์ง€๋Š” ์ตœ์†Œ 1์ดˆ ๋™์•ˆ ์ง‘๊ณ„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ํŒจํ‚ท ์†์‹ค ๋น„์œจ์ด ๋†’์œผ๋ฉด ๋น„ํŠธ ์ „์†ก๋ฅ ์— ๋”ฐ๋ผ ์ดˆ๋‹น ์ˆ˜๋ฐฑ/์ˆ˜์ฒœ/์ˆ˜๋งŒ ๊ฐœ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ).

๋”ฐ๋ผ์„œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  CC ์˜ค๋ฅ˜ ๋ฐ ๋น„ํŠธ ์ „์†ก๋ฅ ์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ข…๋ฅ˜์˜ ์‚ฌ๊ณ ๋ฅผ ์ผ์œผํ‚ค๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์˜ต์…˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. tsp์˜ ์ถœ๋ ฅ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค(CC์— ์˜ํ•ด). ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฒฐ๊ณผ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•œ ๊ธฐ๊ณ„ ํŒ๋… ๊ฐ€๋Šฅ ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋˜๋„๋ก tsp ์ž์ฒด ๋ฐ/๋˜๋Š” ํ”„๋กœ์„ธ์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ bitrate_monitor ๋ฐ ์—ฐ์†์„ฑ์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
  3. tsduck ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ์˜ต์…˜ 1์€ ํŠนํžˆ tsduck ์ž์ฒด๊ฐ€ ์ €์ˆ˜์ค€(ํ˜„๋Œ€ ํ‘œ์ค€์— ๋”ฐ๋ผ) ์–ธ์–ด(C ++)๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๋…ธ๋ ฅ ์ธก๋ฉด์—์„œ ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ bash ํŒŒ์„œ+์ง‘๊ณ„๊ธฐ ํ”„๋กœํ† ํƒ€์ž…์€ 10Mbps ์ŠคํŠธ๋ฆผ ๋ฐ 50% ํŒจํ‚ท ์†์‹ค(์ตœ์•…์˜ ๊ฒฝ์šฐ)์—์„œ bash ํ”„๋กœ์„ธ์Šค๊ฐ€ tsp ํ”„๋กœ์„ธ์Šค ์ž์ฒด๋ณด๋‹ค 3-4๋ฐฐ ๋” ๋งŽ์€ CPU๋ฅผ ์†Œ๋น„ํ•จ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์•„๋ž˜์˜ ์ด ํ”„๋กœํ† ํƒ€์ž…์˜ ์ผ๋ถ€

์œ„์— ๊ตญ์ˆ˜

#!/usr/bin/env bash

missingPackets=0
ccErrorSeconds=0
regexMissPackets='^* (.+) - continuity:.*missing ([0-9]+) packets$'
missingPacketsTime=""

ip netns exec P tsp --realtime -t -I ip -b 8388608 "239.0.0.1:1234" -O drop -P bitrate_monitor -p 1 -t 1  -P continuity 2>&1 | 
while read i
do
    #line example:* 2019/12/28 23:41:14 - continuity: packet index: 6,078, PID: 0x0100, missing 5 packets
    #line example 2: * 2019/12/28 23:55:11 - bitrate_monitor: 2019/12/28 23:55:11, TS bitrate: 4,272,864 bits/s
    if [[ "$i" == *continuity:* ]] 
    then
        if [[ "$i" =~ $regexMissPackets ]]
        then
            missingPacketsTimeNew="${BASH_REMATCH[1]}" #timestamp (seconds)
            if [[ "$missingPacketsTime" != "$missingPacketsTimeNew" ]] #new second with CC error
            then
                ((ccErrorSeconds += 1))
            fi
            missingPacketsTime=$missingPacketsTimeNew
            packets=${BASH_REMATCH[2]} #TS missing packets
            ((missingPackets += packets))
        fi
    elif [[ "$i" == *bitrate_monitor:* ]]
    then
        : #...
    fi
done

ํ—ˆ์šฉํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋Š๋ฆฐ ๊ฒƒ ์™ธ์—๋„ bash์—๋Š” ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†๊ณ  bash ์ž‘์—…์€ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค์ด๋ฉฐ ๋ถ€์ž‘์šฉ(๋งค์ดˆ ์˜ค๋Š” ๋น„ํŠธ ์ „์†ก๋ฅ  ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ๋•Œ)์— ๋Œ€ํ•ด missingPackets์˜ ๊ฐ’์„ 4์ดˆ์— ํ•œ ๋ฒˆ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ bash๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  golang์— wrapper(parser + aggregator)๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ golang ์ฝ”๋“œ์˜ CPU ์†Œ๋น„๋Š” tsp ํ”„๋กœ์„ธ์Šค ์ž์ฒด๋ณด๋‹ค 5-16๋ฐฐ ์ ์Šต๋‹ˆ๋‹ค. bash๋ฅผ golang์œผ๋กœ ๊ต์ฒดํ•œ ๊ฒฐ๊ณผ wrapper์˜ ์†๋„ ํ–ฅ์ƒ์€ ์•ฝ 25๋ฐฐ๋กœ ๋ฐํ˜€์กŒ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฒฐ๊ณผ๋Š” ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์ตœ์•…์˜ ๊ฒฝ์šฐ CPU ์˜ค๋ฒ„ํ—ค๋“œ XNUMX% ์ฆ๊ฐ€). golang ์†Œ์Šค ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

๋ž˜ํผ ์‹คํ–‰

๋ž˜ํผ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด systemd์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์—). ๋ž˜ํผ ์ž์ฒด๋Š” /opt/tsduck-stat/์— ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ(go build tsduck-stat.go)๋กœ ์ปดํŒŒ์ผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์กฐ ์‹œ๊ณ„(>=1.9)๋ฅผ ์ง€์›ํ•˜๋Š” golang์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด systemctl enable ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. [์ด๋ฉ”์ผ ๋ณดํ˜ธ]:1234 ๊ทธ๋Ÿฐ ๋‹ค์Œ systemctl start๋กœ ์‹คํ–‰ [์ด๋ฉ”์ผ ๋ณดํ˜ธ]: 1234.

Zabbix์—์„œ ๋ฐœ๊ฒฌ

zabbix๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์„œ๋น„์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋ฃน ๋ชฉ๋ก ์ƒ์„ฑ๊ธฐ (discovery.sh)๋Š” Zabbix ๊ฒ€์ƒ‰์— ํ•„์š”ํ•œ ํ˜•์‹์œผ๋กœ ๋™์ผํ•œ ์œ„์น˜์ธ /opt/tsduck-stat์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. zabbix-agent๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .conf ํŒŒ์ผ zabbix-agent ๊ตฌ์„ฑ ๋””๋ ‰ํ† ๋ฆฌ์— ์‚ฌ์šฉ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Zabbix ํ…œํ”Œ๋ฆฟ

์ƒ์„ฑ๋œ ํ…œํ”Œ๋ฆฟ (tsduck_stat_template.xml)์—๋Š” ์ž๋™ ๊ฒ€์ƒ‰ ๊ทœ์น™, ํ•ญ๋ชฉ ํ”„๋กœํ† ํƒ€์ž…, ๊ทธ๋ž˜ํ”„ ๋ฐ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋žตํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ(๋ˆ„๊ตฐ๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?)

  1. tsp๊ฐ€ "์ด์ƒ์ ์ธ" ์กฐ๊ฑด(์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ๋ถ„์„๊ธฐ๊ฐ€ ์ง์ ‘ ์—ฐ๊ฒฐ๋จ)์—์„œ ํŒจํ‚ท์„ ๋“œ๋กญํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋“œ๋กญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹จ๋ฝ 2 ๋˜๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ ํ…์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  2. ์ตœ๋Œ€ ์†Œ์ผ“ ๋ฒ„ํผ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค(net.core.rmem_max=8388608).
  3. tsduck-stat.go๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค(tsduck-stat.go ๋นŒ๋“œ).
  4. ์„œ๋น„์Šค ํ…œํ”Œ๋ฆฟ์„ /lib/systemd/system์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  5. systemctl๋กœ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์นด์šดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(grep "" /dev/shm/tsduck-stat/*). ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์ŠคํŠธ๋ฆผ ์ˆ˜์— ๋”ฐ๋ฅธ ์„œ๋น„์Šค ์ˆ˜์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ rp_filter๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์†Œ์Šค IP์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. discovery.sh๋ฅผ ์‹คํ–‰ํ•˜๊ณ  json์„ ์ƒ์„ฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  7. zabbix ์—์ด์ „ํŠธ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  zabbix ์—์ด์ „ํŠธ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.
  8. ํ…œํ”Œ๋ฆฟ์„ zabbix์— ์—…๋กœ๋“œํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง ์ค‘์ธ ํ˜ธ์ŠคํŠธ์™€ zabbix-agent๊ฐ€ ์„ค์น˜๋œ ํ˜ธ์ŠคํŠธ์— ์ ์šฉํ•˜๊ณ  ์•ฝ 5๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ์ƒˆ ํ•ญ๋ชฉ, ๊ทธ๋ž˜ํ”„ ๋ฐ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

TSDuck์„ ์‚ฌ์šฉํ•˜์—ฌ IP(TS) ์ŠคํŠธ๋ฆผ ๋ชจ๋‹ˆํ„ฐ๋ง

ํŒจํ‚ท ์†์‹ค์„ ๊ฐ์ง€ํ•˜๋Š” ์ž‘์—…์—๋Š” ๊ฑฐ์˜ ์ถฉ๋ถ„ํ•˜๋ฉฐ ์ ์–ด๋„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋น„๋””์˜ค ์กฐ๊ฐ์„ ๋ณ‘ํ•ฉํ•  ๋•Œ CC "์†์‹ค"์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…์  ์†”๋ฃจ์…˜์€ SCTE-35 ๋ ˆ์ด๋ธ”(์ŠคํŠธ๋ฆผ ์ƒ์„ฑ๊ธฐ์— ์˜ํ•ด ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ)์„ ๊ฐ์ง€ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค.

์ „์†ก ํ’ˆ์งˆ ๋ชจ๋‹ˆํ„ฐ๋ง ์ธก๋ฉด์—์„œ ์ง€ํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง(IAT)์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. TV ์žฅ๋น„(๋ณ€์กฐ๊ธฐ ๋˜๋Š” ์ตœ์ข… ์žฅ์น˜)์—๋Š” ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ jitbuffer๋ฅผ ๋ฌดํ•œ๋Œ€๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํฐ ๋ฒ„ํผ๊ฐ€ ์žˆ๋Š” ์žฅ๋น„๊ฐ€ ์ „์†ก ์ค‘์— ์‚ฌ์šฉ๋˜๊ณ  QoS๊ฐ€ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ด๋Ÿฌํ•œ ์‹ค์‹œ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ง€ํ„ฐ๊ฐ€ ๋– ์˜ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€