{"id":11859,"date":"2025-04-12T03:04:24","date_gmt":"2025-04-11T18:04:24","guid":{"rendered":"https:\/\/chat-messenger.com\/?p=11859"},"modified":"2025-04-12T03:23:33","modified_gmt":"2025-04-11T18:23:33","slug":"webrtc-stun-turn-turns-sfu","status":"publish","type":"post","link":"https:\/\/chat-messenger.com\/vi\/blog\/webrtc-stun-luot-luot-sfu","title":{"rendered":"Gi\u1ea3i th\u00edch v\u00e0 th\u1ef1c h\u00e0nh k\u1ef9 l\u01b0\u1ee1ng v\u1ec1 STUN\/TURN\/TURNS\/SFU trong WebRTC"},"content":{"rendered":"<h2>WebRTC l\u00e0 g\u00ec?<\/h2>\n\n\n\n<p>WebRTC (Web Real-Time Communication) l\u00e0 m\u1ed9t c\u00f4ng ngh\u1ec7 m\u1edf cho ph\u00e9p giao ti\u1ebfp tho\u1ea1i, video v\u00e0 d\u1eef li\u1ec7u th\u1eddi gian th\u1ef1c gi\u1eefa c\u00e1c tr\u00ecnh duy\u1ec7t. N\u00f3 \u0111ang \u0111\u01b0\u1ee3c nhi\u1ec1u c\u00f4ng ty chu\u1ea9n h\u00f3a, bao g\u1ed3m c\u1ea3 Google, nh\u01b0 m\u1ed9t c\u01a1 ch\u1ebf cho ph\u00e9p giao ti\u1ebfp P2P ch\u1ec9 s\u1eed d\u1ee5ng JavaScript API m\u00e0 kh\u00f4ng c\u1ea7n th\u00eam plug-in ho\u1eb7c ph\u1ea7n m\u1ec1m.<\/p>\n\n\n\n<p>WebRTC bao g\u1ed3m ba th\u00e0nh ph\u1ea7n ch\u00ednh:<\/p>\n\n\n\n<ul><li><strong>l\u1ea5yUserMedia<\/strong>: M\u1ed9t API \u0111\u1ec3 thu th\u1eadp \u00e2m thanh v\u00e0 video t\u1eeb c\u00e1c thi\u1ebft b\u1ecb nh\u01b0 m\u00e1y \u1ea3nh v\u00e0 micr\u00f4.<\/li><li><strong>K\u1ebft n\u1ed1i RTCPeer<\/strong>: M\u1ed9t API c\u1ed1t l\u00f5i \u0111\u1ec3 thi\u1ebft l\u1eadp giao ti\u1ebfp gi\u1eefa c\u00e1c \u0111\u1ed1i t\u00e1c v\u00e0 trao \u0111\u1ed5i ph\u01b0\u01a1ng ti\u1ec7n v\u00e0 d\u1eef li\u1ec7u.<\/li><li><strong>K\u00eanh d\u1eef li\u1ec7u RTC<\/strong>: K\u00eanh d\u1eef li\u1ec7u c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 g\u1eedi t\u1ec7p, tr\u00f2 chuy\u1ec7n, v.v.<\/li><\/ul>\n\n\n\n<p>C\u00e1c API n\u00e0y cho ph\u00e9p ph\u00e1t tri\u1ec3n nhi\u1ec1u \u1ee9ng d\u1ee5ng th\u1eddi gian th\u1ef1c nh\u01b0 cu\u1ed9c g\u1ecdi video, h\u1ed9i ngh\u1ecb \u00e2m thanh, chia s\u1ebb t\u1ec7p, v.v. Tuy nhi\u00ean, trong truy\u1ec1n th\u00f4ng th\u1ef1c t\u1ebf, c\u00f3 nh\u1eefng v\u1ea5n \u0111\u1ec1 v\u1edbi NAT traversal v\u00e0 t\u01b0\u1eddng l\u1eeda, do \u0111\u00f3, \u0111i\u1ec1u c\u1ea7n thi\u1ebft l\u00e0 ph\u1ea3i hi\u1ec3u v\u00e0 tri\u1ec3n khai c\u00e1c c\u00f4ng ngh\u1ec7 NAT traversal nh\u01b0 STUN\/TURN\/TURNS.<\/p>\n\n\n\n<h2>S\u1ef1 kh\u00e1c bi\u1ec7t v\u00e0 vai tr\u00f2 c\u1ee7a STUN, TURN v\u00e0 TURNS<\/h2>\n\n\n\n<p>\u0110\u1ec3 \u0111\u1ea1t \u0111\u01b0\u1ee3c k\u1ebft n\u1ed1i ngang h\u00e0ng \u1ed5n \u0111\u1ecbnh v\u1edbi WebRTC, c\u01a1 ch\u1ebf chuy\u1ec3n \u0111\u1ed5i NAT l\u00e0 \u0111i\u1ec1u c\u1ea7n thi\u1ebft. B\u00e0i vi\u1ebft n\u00e0y s\u1ebd gi\u1ea3i th\u00edch chi ti\u1ebft v\u1ec1 s\u1ef1 kh\u00e1c bi\u1ec7t v\u1ec1 m\u1eb7t k\u1ef9 thu\u1eadt, c\u00e1c t\u00ecnh hu\u1ed1ng s\u1eed d\u1ee5ng v\u00e0 \u01b0u \u0111i\u1ec3m c\u0169ng nh\u01b0 nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a c\u00e1c c\u00f4ng ngh\u1ec7 ti\u00eau bi\u1ec3u STUN, TURN v\u00e0 TURNS.<\/p>\n\n\n\n<p>STUN l\u00e0 giao th\u1ee9c \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng ch\u1ee7 y\u1ebfu \u0111\u1ec3 t\u00ecm \u0111\u1ecba ch\u1ec9 b\u00ean ngo\u00e0i c\u1ee7a m\u1ed9t ng\u01b0\u1eddi trong m\u00f4i tr\u01b0\u1eddng NAT, trong khi TURN l\u00e0 giao th\u1ee9c ho\u1ea1t \u0111\u1ed9ng nh\u01b0 m\u1ed9t m\u00e1y ch\u1ee7 chuy\u1ec3n ti\u1ebfp khi kh\u00f4ng th\u1ec3 k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp. M\u1eb7t kh\u00e1c, TURNS m\u00e3 h\u00f3a giao ti\u1ebfp TURN b\u1eb1ng TLS v\u00e0 s\u1eed d\u1ee5ng c\u00f9ng s\u1ed1 c\u1ed5ng 443 nh\u01b0 HTTPS, gi\u00fap c\u00f3 th\u1ec3 giao ti\u1ebfp sau t\u01b0\u1eddng l\u1eeda nghi\u00eam ng\u1eb7t nh\u01b0 m\u1ea1ng c\u00f4ng ty.<\/p>\n\n\n\n<p>B\u1eb1ng c\u00e1ch hi\u1ec3u \u0111\u01b0\u1ee3c \u0111\u1eb7c \u0111i\u1ec3m c\u1ee7a t\u1eebng lo\u1ea1i v\u00e0 s\u1eed d\u1ee5ng ch\u00fang m\u1ed9t c\u00e1ch h\u1ee3p l\u00fd, b\u1ea1n c\u00f3 th\u1ec3 t\u0103ng t\u1ef7 l\u1ec7 th\u00e0nh c\u00f4ng v\u00e0 ch\u1ea5t l\u01b0\u1ee3ng c\u1ee7a truy\u1ec1n th\u00f4ng WebRTC.<\/p>\n\n\n\n<h3>Vai tr\u00f2 v\u00e0 t\u00ednh n\u0103ng c\u1ee7a STUN (UDP)<\/h3>\n\n\n\n<p>STUN (Ti\u1ec7n \u00edch truy\u1ec1n t\u1ea3i phi\u00ean cho NAT) l\u00e0 m\u1ed9t giao th\u1ee9c cho ph\u00e9p kh\u00e1ch h\u00e0ng<strong>\u0110\u1ecba ch\u1ec9 IP v\u00e0 c\u1ed5ng b\u00ean ngo\u00e0i<\/strong>\u0110\u00e2y l\u00e0 m\u1ed9t giao th\u1ee9c \u0111\u01a1n gi\u1ea3n \u0111\u1ec3 bi\u1ebft \u0111\u1ecba ch\u1ec9 IP c\u1ee7a PC. V\u00ed d\u1ee5, n\u1ebfu PC n\u1eb1m sau NAT, n\u00f3 kh\u00f4ng bi\u1ebft \u0111\u1ecba ch\u1ec9 IP to\u00e0n c\u1ee5c c\u1ee7a ri\u00eang m\u00ecnh, nh\u01b0ng n\u00f3 c\u00f3 th\u1ec3 l\u1ea5y \u0111\u01b0\u1ee3c &quot;\u0111\u1ecba ch\u1ec9 IP c\u1ee7a ri\u00eang m\u00ecnh: c\u1ed5ng khi nh\u00ecn t\u1eeb b\u00ean ngo\u00e0i&quot; b\u1eb1ng c\u00e1ch truy v\u1ea5n m\u00e1y ch\u1ee7 STUN.<\/p>\n\n\n\n<p>M\u00e1y ch\u1ee7 STUN ho\u1ea1t \u0111\u1ed9ng nh\u01b0 m\u1ed9t b\u1ea3n sao, tr\u1ea3 v\u1ec1 th\u00f4ng tin ngu\u1ed3n c\u1ee7a y\u00eau c\u1ea7u \u0111\u00e3 nh\u1eadn nh\u01b0 hi\u1ec7n t\u1ea1i. Do \u0111\u00f3, m\u00e1y kh\u00e1ch c\u00f3 th\u1ec3 bi\u1ebft \u0111\u1ecba ch\u1ec9 IP to\u00e0n c\u1ea7u c\u1ee7a ri\u00eang m\u00ecnh v\u00e0 s\u1ed1 c\u1ed5ng \u0111\u01b0\u1ee3c NAT (\u1ee8ng vi\u00ean ph\u1ea3n x\u1ea1 m\u00e1y ch\u1ee7) ch\u1ec9 \u0111\u1ecbnh.<\/p>\n\n\n\n<p>Giao ti\u1ebfp STUN th\u01b0\u1eddng \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n b\u1eb1ng UDP v\u00e0 c\u1ed5ng m\u1eb7c \u0111\u1ecbnh l\u00e0 3478 (UDP\/3478). V\u00ec n\u00f3 y\u00eau c\u1ea7u giao ti\u1ebfp nh\u1eb9, m\u1ed9t l\u1ea7n duy nh\u1ea5t b\u1eb1ng UDP n\u00ean c\u00f3 chi ph\u00ed th\u1ea5p, \u0111\u1ed9 tr\u1ec5 th\u1ea5p v\u00e0 h\u1ea7u nh\u01b0 kh\u00f4ng c\u00f3 t\u1ea3i \u1edf ph\u00eda m\u00e1y ch\u1ee7. Do \u0111\u00f3, trong c\u00e1c m\u00f4i tr\u01b0\u1eddng cho ph\u00e9p giao ti\u1ebfp UDP, NAT traversal s\u1eed d\u1ee5ng STUN \u0111\u01b0\u1ee3c th\u1eed tr\u01b0\u1edbc.<\/p>\n\n\n\n<h4><strong>C\u00e1c t\u00ecnh hu\u1ed1ng s\u1eed d\u1ee5ng STUN<\/strong><\/h4>\n\n\n\n<p>N\u00f3 c\u00f3 hi\u1ec7u qu\u1ea3 trong c\u00e1c m\u00f4i tr\u01b0\u1eddng c\u1ea7n ph\u1ea3i chuy\u1ec3n NAT nh\u01b0ng b\u1ea3n th\u00e2n giao ti\u1ebfp UDP kh\u00f4ng b\u1ecb ch\u1eb7n, ch\u1eb3ng h\u1ea1n nh\u01b0 m\u1ea1ng gia \u0111\u00ecnh v\u00e0 \u0111\u01b0\u1eddng d\u00e2y di \u0111\u1ed9ng. N\u1ebfu STUN c\u00f3 th\u1ec3 l\u1ea5y \u0111\u01b0\u1ee3c IP:port b\u00ean ngo\u00e0i c\u1ee7a nhau, c\u00e1c m\u00e1y kh\u00e1ch c\u00f3 th\u1ec3 thi\u1ebft l\u1eadp giao ti\u1ebfp tr\u1ef1c ti\u1ebfp (ngang h\u00e0ng) v\u1edbi nhau. V\u00ec \u0111\u01b0\u1eddng truy\u1ec1n giao ti\u1ebfp l\u00e0 tr\u1ef1c ti\u1ebfp n\u00ean \u00edt b\u1ecb tr\u1ec5 h\u01a1n v\u00e0 ch\u1ea5t l\u01b0\u1ee3ng c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c duy tr\u00ec \u1edf m\u1ee9c cao. Ngo\u00e0i ra, v\u00ec m\u00e1y ch\u1ee7 ch\u1ec9 h\u1ed7 tr\u1ee3 trao \u0111\u1ed5i th\u00f4ng tin IP n\u00ean chi ph\u00ed \u0111\u01b0\u1ee3c gi\u1eef \u1edf m\u1ee9c r\u1ea5t th\u1ea5p. V\u00ed d\u1ee5, trong c\u00e1c tr\u00f2 ch\u01a1i tr\u1ef1c tuy\u1ebfn ho\u1eb7c cu\u1ed9c g\u1ecdi video, n\u1ebfu c\u1ea3 hai thi\u1ebft b\u1ecb \u0111\u1ec1u \u1edf trong NAT t\u01b0\u01a1ng \u0111\u1ed1i m\u1edf, STUN \u0111\u1ee7 \u0111\u1ec3 cho ph\u00e9p k\u1ebft n\u1ed1i ngang h\u00e0ng.<\/p>\n\n\n\n<h4>H\u1ea1n ch\u1ebf v\u00e0 nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a STUN<\/h4>\n\n\n\n<p>STUN ch\u1ec9 l\u00e0 m\u1ed9t ph\u01b0\u01a1ng ti\u1ec7n \u0111\u1ec3 &quot;t\u00ecm \u0111\u1ecba ch\u1ec9 b\u00ean ngo\u00e0i c\u1ee7a ri\u00eang b\u1ea1n&quot;, v\u00e0 t\u00f9y thu\u1ed9c v\u00e0o lo\u1ea1i NAT v\u00e0 c\u00e1c h\u1ea1n ch\u1ebf c\u1ee7a t\u01b0\u1eddng l\u1eeda, c\u00f3 th\u1ec3 kh\u00f4ng th\u1ec3 k\u1ebft n\u1ed1i ch\u1ec9 b\u1eb1ng c\u00e1ch n\u00e0y. \u0110\u1eb7c bi\u1ec7t, trong m\u00f4i tr\u01b0\u1eddng NAT \u0111\u1ed1i x\u1ee9ng ho\u1eb7c t\u01b0\u1eddng l\u1eeda nghi\u00eam ng\u1eb7t, c\u00e1c g\u00f3i tin t\u1eeb b\u00ean kia c\u00f3 th\u1ec3 kh\u00f4ng \u0111\u1ebfn \u0111\u01b0\u1ee3c \u0111\u1ecba ch\u1ec9 m\u00e0 STUN thu \u0111\u01b0\u1ee3c, khi\u1ebfn vi\u1ec7c giao ti\u1ebfp tr\u1edf n\u00ean b\u1ea5t kh\u1ea3 thi.<\/p>\n\n\n\n<p>Ngo\u00e0i ra, b\u1ea3n th\u00e2n giao ti\u1ebfp UDP c\u00f3 th\u1ec3 b\u1ecb ch\u1eb7n tr\u00ean m\u1ea1ng c\u00f4ng ty, trong tr\u01b0\u1eddng h\u1ee3p \u0111\u00f3 c\u00e1c y\u00eau c\u1ea7u STUN kh\u00f4ng \u0111\u1ebfn \u0111\u01b0\u1ee3c thi\u1ebft b\u1ecb. T\u00f3m l\u1ea1i, STUN l\u00e0 m\u1ed9t c\u01a1 ch\u1ebf \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh xem giao ti\u1ebfp tr\u1ef1c ti\u1ebfp c\u00f3 kh\u1ea3 thi hay kh\u00f4ng v\u00e0 kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng trong c\u00e1c m\u00f4i tr\u01b0\u1eddng m\u00e0 giao ti\u1ebfp tr\u1ef1c ti\u1ebfp l\u00e0 kh\u00f4ng th\u1ec3 v\u1ec1 m\u1eb7t v\u1eadt l\u00fd. V\u00ec l\u00fd do n\u00e0y, STUN \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong ICE (\u0111\u01b0\u1ee3c m\u00f4 t\u1ea3 b\u00ean d\u01b0\u1edbi) \u0111\u1ec3 c\u00f3 \u0111\u01b0\u1ee3c c\u00e1c \u1ee9ng vi\u00ean cho giai \u0111o\u1ea1n \u0111\u1ea7u ti\u00ean v\u00e0 \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 quay l\u1ea1i TURN (\u0111\u01b0\u1ee3c m\u00f4 t\u1ea3 b\u00ean d\u01b0\u1edbi) n\u1ebfu STUN kh\u00f4ng \u0111\u1ee7.<\/p>\n\n\n\n<h3>Vai tr\u00f2 v\u00e0 t\u00ednh n\u0103ng c\u1ee7a TURN (UDP)<\/h3>\n\n\n\n<p>TURN (Traversal Using Relays around NAT) l\u00e0 m\u1ed9t giao th\u1ee9c ho\u1ea1t \u0111\u1ed9ng nh\u01b0 m\u1ed9t relay khi kh\u00f4ng th\u1ec3 giao ti\u1ebfp tr\u1ef1c ti\u1ebfp v\u1edbi STUN. M\u00e1y ch\u1ee7 TURN ho\u1ea1t \u0111\u1ed9ng nh\u01b0 m\u1ed9t \u0111i\u1ec3m relay c\u00f3 th\u1ec3 truy c\u1eadp to\u00e0n c\u1ea7u gi\u1eefa \u0111\u1ed1i t\u00e1c giao ti\u1ebfp v\u00e0 b\u00ean kia, chuy\u1ec3n ti\u1ebfp c\u00e1c g\u00f3i tin. M\u00e1y kh\u00e1ch k\u1ebft n\u1ed1i v\u1edbi m\u00e1y ch\u1ee7 TURN v\u00e0 l\u1ea5y \u0111\u1ecba ch\u1ec9 IP relay v\u00e0 c\u1ed5ng \u0111\u01b0\u1ee3c g\u1ecdi l\u00e0 \u1ee9ng vi\u00ean relay. Sau \u0111\u00f3, ph\u01b0\u01a1ng ti\u1ec7n v\u00e0 trao \u0111\u1ed5i d\u1eef li\u1ec7u v\u1edbi b\u00ean kia \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n th\u00f4ng qua m\u00e1y ch\u1ee7 TURN \u0111\u00f3.<\/p>\n\n\n\n<p>TURN c\u0169ng th\u01b0\u1eddng giao ti\u1ebfp b\u1eb1ng UDP, v\u00ec v\u1eady mi\u1ec5n l\u00e0 UDP \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng, n\u00f3 c\u00f3 th\u1ec3 chuy\u1ec3n ti\u1ebfp c\u00e1c g\u00f3i ph\u01b0\u01a1ng ti\u1ec7n theo c\u00e1ch t\u01b0\u01a1ng t\u1ef1 nh\u01b0 giao ti\u1ebfp tr\u1ef1c ti\u1ebfp. Theo m\u1eb7c \u0111\u1ecbnh, giao th\u1ee9c TURN \u0111\u01b0\u1ee3c ch\u1ea5p nh\u1eadn tr\u00ean c\u1ed5ng 3478 (UDP), gi\u1ed1ng nh\u01b0 STUN. Ngay c\u1ea3 khi s\u1ed1 c\u1ed5ng UDP b\u1ecb h\u1ea1n ch\u1ebf b\u1edfi ch\u00ednh s\u00e1ch t\u01b0\u1eddng l\u1eeda, TURN c\u0169ng c\u00f3 th\u1ec3 ch\u1ea1y tr\u00ean m\u1ed9t c\u1ed5ng \u0111\u01b0\u1ee3c ph\u00e9p nh\u01b0 UDP\/443. Mi\u1ec5n l\u00e0 UDP \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng, vi\u1ec7c chuy\u1ec3n ti\u1ebfp v\u1edbi hi\u1ec7u su\u1ea5t th\u1eddi gian th\u1ef1c cao h\u01a1n TCP l\u00e0 c\u00f3 th\u1ec3.<\/p>\n\n\n\n<h4>C\u00e1c t\u00ecnh hu\u1ed1ng s\u1eed d\u1ee5ng TURN<\/h4>\n\n\n\n<p>TURN l\u00e0 c\u1ea7n thi\u1ebft khi kh\u00f4ng th\u1ec3 thi\u1ebft l\u1eadp k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp. V\u00ed d\u1ee5,<span class=\"swl-marker mark_blue\">\u0110\u00e2y l\u00e0 tr\u01b0\u1eddng h\u1ee3p khi m\u1ed9t ho\u1eb7c c\u1ea3 hai b\u00ean \u0111\u1ec1u n\u1eb1m sau t\u01b0\u1eddng l\u1eeda doanh nghi\u1ec7p nghi\u00eam ng\u1eb7t ho\u1eb7c khi c\u1ea3 hai b\u00ean \u0111\u1ec1u c\u00f3 NAT \u0111\u1ed1i x\u1ee9ng v\u00e0 vi\u1ec7c \u0111\u1ee5c l\u1ed7 UDP kh\u00f4ng th\u00e0nh c\u00f4ng.<\/span>Trong m\u00f4i tr\u01b0\u1eddng nh\u01b0 v\u1eady, kh\u00f4ng th\u1ec3 giao ti\u1ebfp n\u1ebfu kh\u00f4ng chuy\u1ec3n ti\u1ebfp qua m\u00e1y ch\u1ee7 TURN, do \u0111\u00f3 TURN ho\u1ea1t \u0111\u1ed9ng nh\u01b0 m\u1ed9t gi\u1ea3i ph\u00e1p cu\u1ed1i c\u00f9ng.<\/p>\n\n\n\n<p>WebRTC h\u01b0\u1edbng \u0111\u1ebfn m\u1ee5c ti\u00eau t\u1ea5t c\u1ea3 c\u00e1c \u0111\u1ed1i t\u00e1c c\u00f3 th\u1ec3 giao ti\u1ebfp tr\u1ef1c ti\u1ebfp, nh\u01b0ng ngay c\u1ea3 khi \u0111i\u1ec1u n\u00e0y kh\u00f4ng th\u1ec3 th\u1ef1c hi\u1ec7n \u0111\u01b0\u1ee3c, b\u1ea3n th\u00e2n giao ti\u1ebfp v\u1eabn c\u00f3 th\u1ec3 ti\u1ebfp t\u1ee5c b\u1eb1ng c\u00e1ch quay l\u1ea1i TURN. Trong ho\u1ea1t \u0111\u1ed9ng th\u1ef1c t\u1ebf, chi\u1ebfn l\u01b0\u1ee3c chung l\u00e0 tr\u01b0\u1edbc ti\u00ean h\u00e3y th\u1eed k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp v\u1edbi STUN v\u00e0 ch\u1ec9 chuy\u1ec3n sang chuy\u1ec3n ti\u1ebfp TURN n\u1ebfu kh\u00f4ng th\u00e0nh c\u00f4ng. V\u00ed d\u1ee5, trong h\u1ed9i ngh\u1ecb truy\u1ec1n h\u00ecnh qua m\u1ea1ng n\u1ed9i b\u1ed9, n\u1ebfu hai b\u00ean kh\u00f4ng th\u1ec3 giao ti\u1ebfp tr\u1ef1c ti\u1ebfp v\u1edbi nhau, giao ti\u1ebfp s\u1ebd t\u1ef1 \u0111\u1ed9ng chuy\u1ec3n sang giao ti\u1ebfp qua m\u00e1y ch\u1ee7 TURN, cho ph\u00e9p ng\u01b0\u1eddi d\u00f9ng ti\u1ebfp t\u1ee5c cu\u1ed9c tr\u00f2 chuy\u1ec7n m\u00e0 th\u1eadm ch\u00ed kh\u00f4ng nh\u1eadn ra.<\/p>\n\n\n\n<h4><strong>L\u1ee3i \u00edch c\u1ee7a TURN<\/strong><\/h4>\n\n\n\n<p>\u01afu \u0111i\u1ec3m l\u1edbn nh\u1ea5t l\u00e0 \u0111\u1ed9 tin c\u1eady. B\u1ea5t k\u1ec3 b\u1ea1n \u0111ang \u1edf trong m\u00f4i tr\u01b0\u1eddng NAT hay t\u01b0\u1eddng l\u1eeda n\u00e0o, mi\u1ec5n l\u00e0 c\u00f3 th\u1ec3 thi\u1ebft l\u1eadp \u0111\u01b0\u1ee3c giao ti\u1ebfp t\u1eeb m\u00e1y kh\u00e1ch \u0111\u1ebfn m\u00e1y ch\u1ee7 TURN, th\u00ec cu\u1ed1i c\u00f9ng c\u00f3 th\u1ec3 \u0111\u1ea1t \u0111\u01b0\u1ee3c giao ti\u1ebfp ngang h\u00e0ng. Ngo\u00e0i ra, v\u00ec TURN l\u00e0 ph\u1ea7n m\u1edf r\u1ed9ng c\u1ee7a STUN v\u1ec1 m\u1eb7t giao th\u1ee9c, n\u00ean m\u1ed9t tri\u1ec3n khai m\u00e1y ch\u1ee7 duy nh\u1ea5t (nh\u01b0 coturn, \u0111\u01b0\u1ee3c m\u00f4 t\u1ea3 b\u00ean d\u01b0\u1edbi) c\u00f3 th\u1ec3 x\u1eed l\u00fd c\u1ea3 y\u00eau c\u1ea7u STUN v\u00e0 TURN. Sau khi k\u1ebft n\u1ed1i \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp, ph\u01b0\u01a1ng ti\u1ec7n ti\u1ebfp theo \u0111\u01b0\u1ee3c chuy\u1ec3n ti\u1ebfp d\u01b0\u1edbi d\u1ea1ng lu\u1ed3ng, do \u0111\u00f3, theo quan \u0111i\u1ec3m c\u1ee7a ng\u01b0\u1eddi d\u00f9ng, giao ti\u1ebfp di\u1ec5n ra li\u1ec1n m\u1ea1ch, ngo\u1ea1i tr\u1eeb m\u1ed9t s\u1ed1 \u0111\u1ed9 tr\u1ec5.<\/p>\n\n\n\n<h4><strong>Nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a TURN<\/strong><\/h4>\n\n\n\n<p> Nh\u01b0\u1ee3c \u0111i\u1ec3m l\u1edbn nh\u1ea5t c\u1ee7a n\u00f3 l\u00e0 ti\u00eau th\u1ee5 t\u00e0i nguy\u00ean v\u00e0 \u0111\u1ed9 tr\u1ec5. V\u1edbi TURN, t\u1ea5t c\u1ea3 d\u1eef li\u1ec7u \u00e2m thanh v\u00e0 video ph\u1ea3i \u0111i qua m\u00e1y ch\u1ee7, \u0111\u00f2i h\u1ecfi m\u1ed9t l\u01b0\u1ee3ng l\u1edbn b\u0103ng th\u00f4ng v\u00e0 s\u1ee9c m\u1ea1nh x\u1eed l\u00fd \u1edf ph\u00eda m\u00e1y ch\u1ee7. V\u00ed d\u1ee5, n\u1ebfu ch\u00fang ta gi\u1ea3 s\u1eed r\u1eb1ng m\u1ed9t cu\u1ed9c g\u1ecdi video m\u1ed9t-m\u1ed9t ti\u00eau th\u1ee5 b\u0103ng th\u00f4ng m\u1ed9t chi\u1ec1u l\u00e0 1Mbps, th\u00ec theo t\u00ednh to\u00e1n \u0111\u01a1n gi\u1ea3n, n\u1ebfu 1.000 ng\u01b0\u1eddi d\u00f9ng s\u1eed d\u1ee5ng c\u00f9ng l\u00fac, th\u00ec c\u1ea7n b\u0103ng th\u00f4ng chuy\u1ec3n ti\u1ebfp l\u00e0 1Gbps. \u0110i\u1ec1u n\u00e0y l\u00e0m cho chi ph\u00ed v\u1eadn h\u00e0nh c\u1ee7a m\u00e1y ch\u1ee7 TURN cao v\u00e0 c\u00e1c d\u1ecbch v\u1ee5 quy m\u00f4 l\u1edbn \u0111\u00f2i h\u1ecfi nhi\u1ec1u m\u00e1y ch\u1ee7 chuy\u1ec3n ti\u1ebfp TURN ph\u1ea3i \u0111\u01b0\u1ee3c chu\u1ea9n b\u1ecb v\u00e0 m\u1edf r\u1ed9ng.<\/p>\n\n\n\n<p>Ngo\u00e0i ra, \u0111\u01b0\u1eddng truy\u1ec1n c\u00e0ng d\u00e0i th\u00ec \u0111\u1ed9 tr\u1ec5 c\u00e0ng l\u1edbn, d\u1eabn \u0111\u1ebfn \u0111\u1ed9 tr\u1ec5 th\u1eddi gian v\u00e0 ch\u1ea5t l\u01b0\u1ee3ng video v\u00e0 \u00e2m thanh gi\u1ea3m. H\u01a1n n\u1eefa, so v\u1edbi giao ti\u1ebfp ngang h\u00e0ng s\u1eed d\u1ee5ng STUN, giao ti\u1ebfp qua TURN kh\u00f4ng ho\u00e0n to\u00e0n ngang h\u00e0ng, do \u0111\u00f3 t\u00ednh b\u1ea3o m\u1eadt k\u00e9m h\u01a1n m\u1ed9t ch\u00fat (m\u1eb7c d\u00f9 m\u00e1y ch\u1ee7 TURN th\u01b0\u1eddng ch\u1ec9 chuy\u1ec3n ti\u1ebfp RTP\/datagram kh\u00f4ng \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a v\u00e0 kh\u00f4ng gi\u1ea3i th\u00edch n\u1ed9i dung).<\/p>\n\n\n\n<p>Nh\u00ecn chung, TURN ch\u1ec9 n\u00ean \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng khi c\u1ea7n thi\u1ebft. Tr\u00ean th\u1ef1c t\u1ebf, h\u1ea7u h\u1ebft c\u00e1c giao ti\u1ebfp WebRTC c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp b\u1eb1ng STUN v\u00e0 s\u1ed1 li\u1ec7u th\u1ed1ng k\u00ea c\u1ee7a Google cho th\u1ea5y t\u1ed5ng c\u1ed9ng c\u00f3 kho\u1ea3ng 861 cu\u1ed9c g\u1ecdi TP3T \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp m\u00e0 kh\u00f4ng c\u1ea7n chuy\u1ec3n ti\u1ebfp (ngang h\u00e0ng). Ch\u1ec9 c\u00f3 141 TP3T c\u00f2n l\u1ea1i y\u00eau c\u1ea7u TURN, nh\u01b0ng \u0111i\u1ec1u quan tr\u1ecdng l\u00e0 ph\u1ea3i c\u00f3 c\u01a1 s\u1edf h\u1ea1 t\u1ea7ng TURN cho 141 TP3T \u0111\u00f3.<\/p>\n\n\n\n<h3>Vai tr\u00f2 v\u00e0 t\u00ednh n\u0103ng c\u1ee7a TURNS (TLS qua TCP\/443)<\/h3>\n\n\n\n<p>TURNS l\u00e0 vi\u1ebft t\u1eaft c\u1ee7a &quot;TURN over TLS&quot; v\u00e0 l\u00e0 giao th\u1ee9c m\u00e3 h\u00f3a truy\u1ec1n th\u00f4ng chuy\u1ec3n ti\u1ebfp b\u1eb1ng giao th\u1ee9c TURN v\u1edbi TLS (B\u1ea3o m\u1eadt l\u1edbp truy\u1ec1n t\u1ea3i).<span class=\"swl-marker mark_blue\">Giao ti\u1ebfp TURN \u0111\u01b0\u1ee3c b\u1ea3o m\u1eadt b\u1eb1ng TLS (HTTPS)<\/span>v\u00e0 th\u01b0\u1eddng ph\u1ee5c v\u1ee5 tr\u00ean c\u1ed5ng TCP 443.<span class=\"swl-marker mark_blue\">C\u1ed5ng 443 c\u00f3 c\u00f9ng s\u1ed1 c\u1ed5ng v\u1edbi HTTPS, do \u0111\u00f3, n\u00f3 c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng v\u01b0\u1ee3t qua t\u01b0\u1eddng l\u1eeda c\u1ee7a c\u00f4ng ty v\u00e0 d\u1ec5 d\u00e0ng tr\u00e1nh \u0111\u01b0\u1ee3c proxy v\u00e0 ki\u1ec3m duy\u1ec7t.<\/span>.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5, m\u1ea1ng n\u1ed9i b\u1ed9 c\u1ee7a c\u00f4ng ty ch\u1ec9 c\u00f3 th\u1ec3 cho ph\u00e9p truy\u1ec1n th\u00f4ng b\u00ean ngo\u00e0i qua c\u1ed5ng 80 v\u00e0 443, nh\u01b0ng ngay c\u1ea3 trong tr\u01b0\u1eddng h\u1ee3p \u0111\u00f3, v\u1eabn c\u00f3 kh\u1ea3 n\u0103ng cao l\u00e0 truy\u1ec1n th\u00f4ng c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n \u0111\u01b0\u1ee3c n\u1ebfu m\u00e1y ch\u1ee7 TURN s\u1eed d\u1ee5ng truy\u1ec1n th\u00f4ng TLS tr\u00ean c\u1ed5ng 443. Ngo\u00e0i ra, v\u00ec truy\u1ec1n th\u00f4ng \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a b\u1eb1ng TLS n\u00ean ch\u00fang an to\u00e0n v\u00e0 b\u00ean th\u1ee9 ba kh\u00f3 c\u00f3 th\u1ec3 ch\u1eb7n \u0111\u01b0\u1ee3c.<\/p>\n\n\n\n<p>Trong WebRTC, c\u00e1c thi\u1ebft l\u1eadp<code>&quot;url&quot;: &quot;l\u01b0\u1ee3t quay:m\u00e1y ch\u1ee7 l\u01b0\u1ee3t quay:443&quot;<\/code>Trong l\u01b0\u1ee3c \u0111\u1ed3 URI:<code>l\u01b0\u1ee3t:<\/code>B\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng m\u00e1y ch\u1ee7 TURN \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a TLS n\u00e0y b\u1eb1ng c\u00e1ch ch\u1ec9 \u0111\u1ecbnh<\/p>\n\n\n\n<h4>C\u00e1c c\u1ea3nh s\u1eed d\u1ee5ng TURNS<\/h4>\n\n\n\n<p>TURNS h\u1eefu \u00edch cho giao ti\u1ebfp WebRTC trong c\u00e1c m\u00f4i tr\u01b0\u1eddng b\u1ecb h\u1ea1n ch\u1ebf ch\u1eb7t ch\u1ebd nh\u01b0 m\u1ea1ng c\u00f4ng ty, n\u01a1i m\u1ecdi ph\u01b0\u01a1ng ti\u1ec7n kh\u00e1c \u0111\u1ec1u b\u1ecb ch\u1eb7n. Ngay c\u1ea3 trong c\u00e1c m\u00f4i tr\u01b0\u1eddng m\u00e0 t\u1ea5t c\u1ea3 c\u00e1c c\u1ed5ng UDP v\u00e0 TCP chung \u0111\u1ec1u b\u1ecb ch\u1eb7n, v\u1eabn c\u00f3 nhi\u1ec1u ch\u00ednh s\u00e1ch cho ph\u00e9p giao ti\u1ebfp theo c\u00f9ng c\u00e1ch nh\u01b0 giao ti\u1ebfp HTTPS, do \u0111\u00f3, TURN tr\u00ean c\u1ed5ng TLS 443 th\u1ef1c s\u1ef1 l\u00e0 gi\u1ea3i ph\u00e1p cu\u1ed1i c\u00f9ng.<\/p>\n\n\n\n<p>N\u00f3 c\u0169ng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong tr\u01b0\u1eddng h\u1ee3p m\u1ed9t s\u1ed1 c\u1ed5ng nh\u1ea5t \u0111\u1ecbnh b\u1ecb \u0111\u00f3ng tr\u00ean m\u1ea1ng LAN kh\u00f4ng d\u00e2y c\u00f4ng c\u1ed9ng ho\u1eb7c khi ch\u1ec9 c\u00f3 th\u1ec3 giao ti\u1ebfp TLS \u1edf ph\u00eda m\u00e1y kh\u00e1ch.<span class=\"swl-marker mark_blue\">\u0110\u1ea7u ti\u00ean l\u00e0 UDP, n\u1ebfu kh\u00f4ng \u0111\u01b0\u1ee3c th\u00ec l\u00e0 TCP, n\u1ebfu kh\u00f4ng \u0111\u01b0\u1ee3c th\u00ec l\u00e0 TLS t\u1edbi 443<\/span>&quot;N\u00f3 \u0111\u01b0\u1ee3c \u0111\u1ecbnh v\u1ecb l\u00e0 giai \u0111o\u1ea1n cu\u1ed1i c\u00f9ng c\u1ee7a qu\u00e1 tr\u00ecnh suy tho\u00e1i d\u1ea7n d\u1ea7n.<\/p>\n\n\n\n<h4>L\u1ee3i \u00edch c\u1ee7a TURNS<\/h4>\n\n\n\n<p>\u01afu \u0111i\u1ec3m l\u1edbn nh\u1ea5t c\u1ee7a n\u00f3 l\u00e0 kh\u1ea3 n\u0103ng ch\u1ed1ng t\u01b0\u1eddng l\u1eeda cao. Giao ti\u1ebfp \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a TLS kh\u00f3 ph\u00e2n bi\u1ec7t v\u1edbi HTTPS th\u00f4ng th\u01b0\u1eddng, do \u0111\u00f3 c\u00f3 nhi\u1ec1u kh\u1ea3 n\u0103ng v\u01b0\u1ee3t qua c\u00e1c b\u1ed9 l\u1ecdc nghi\u00eam ng\u1eb7t. \u0110\u1eb7c bi\u1ec7t, khi gi\u1edbi thi\u1ec7u h\u1ec7 th\u1ed1ng h\u1ed9i ngh\u1ecb truy\u1ec1n h\u00ecnh web cho m\u1ed9t c\u00f4ng ty, c\u1ea7n ph\u1ea3i cho ph\u00e9p c\u00e1c k\u1ebft n\u1ed1i b\u00ean ngo\u00e0i t\u1eeb m\u1ea1ng n\u1ed9i b\u1ed9, nh\u01b0ng giao ti\u1ebfp TLS qua TCP\/443 c\u00f3 nhi\u1ec1u kh\u1ea3 n\u0103ng \u0111\u01b0\u1ee3c ch\u1ea5p nh\u1eadn theo c\u00e1c ch\u00ednh s\u00e1ch b\u1ea3o m\u1eadt. Ngo\u00e0i ra, v\u00ec \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a, n\u00ean t\u00ednh b\u1ea3o m\u1eadt c\u1ee7a giao ti\u1ebfp v\u1edbi ch\u00ednh m\u00e1y ch\u1ee7 chuy\u1ec3n ti\u1ebfp c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c \u0111\u1ea3m b\u1ea3o (*Tuy nhi\u00ean, b\u1ea3n th\u00e2n n\u1ed9i dung, ch\u1eb3ng h\u1ea1n nh\u01b0 video, th\u01b0\u1eddng \u0111\u00e3 \u0111\u01b0\u1ee3c m\u00e3 h\u00f3a \u1edf l\u1edbp WebRTC).<\/p>\n\n\n\n<h4>Nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a TURNS<\/h4>\n\n\n\n<p>Nh\u01b0\u1ee3c \u0111i\u1ec3m l\u1edbn nh\u1ea5t l\u00e0 h\u00ecnh ph\u1ea1t v\u1ec1 hi\u1ec7u su\u1ea5t. Ngo\u00e0i \u0111\u1ed9 tr\u1ec5 v\u00e0 t\u1ea3i c\u1ee7a b\u1ea3n th\u00e2n TURN, c\u00f2n c\u00f3 chi ph\u00ed chung c\u1ee7a TLS v\u00e0 TCP. TCP l\u00e0 m\u1ed9t ph\u01b0\u01a1ng ti\u1ec7n truy\u1ec1n t\u1ea3i \u0111\u00e1ng tin c\u1eady v\u00e0 c\u00f3 c\u01a1 ch\u1ebf truy\u1ec1n l\u1ea1i trong tr\u01b0\u1eddng h\u1ee3p m\u1ea5t g\u00f3i tin, nh\u01b0ng n\u00f3 kh\u00f4ng ph\u00f9 h\u1ee3p v\u1edbi ph\u01b0\u01a1ng ti\u1ec7n truy\u1ec1n th\u00f4ng th\u1eddi gian th\u1ef1c v\u00e0 n\u1ebfu m\u1ea5t g\u00f3i tin, video v\u00e0 \u00e2m thanh c\u00f3 th\u1ec3 kh\u00f4ng \u0111\u01b0\u1ee3c ph\u00e1t m\u1ed9t c\u00e1ch m\u01b0\u1ee3t m\u00e0.<\/p>\n\n\n\n<p>Ngo\u00e0i ra, TCP d\u1ec5 b\u1ecb ch\u1eb7n \u0111\u1ea7u d\u00f2ng do th\u1ee9 t\u1ef1 g\u00f3i tin,<span class=\"swl-marker mark_blue\">\u0110\u1ed9 dao \u0111\u1ed9ng (jitter) c\u0169ng t\u0103ng so v\u1edbi UDP.<\/span>Ngo\u00e0i ra, qu\u00e1 tr\u00ecnh m\u00e3 h\u00f3a v\u00e0 gi\u1ea3i m\u00e3 TLS t\u1ea1o th\u00eam g\u00e1nh n\u1eb7ng cho CPU. Do \u0111\u00f3, c\u00f3 b\u00e1o c\u00e1o r\u1eb1ng \u0111\u1ed9 tr\u1ec5 b\u1ed5 sung l\u00e0 50 ms tr\u1edf l\u00ean x\u1ea3y ra, g\u00e2y ra \u0111\u1ed9 tr\u1ec5 m\u00e0 ng\u01b0\u1eddi d\u00f9ng c\u00f3 th\u1ec3 c\u1ea3m nh\u1eadn \u0111\u01b0\u1ee3c. \u0110\u1eb7c bi\u1ec7t, trong c\u00e1c h\u1ed9i ngh\u1ecb truy\u1ec1n h\u00ecnh, \u0111\u1ed9 tr\u1ec5 t\u0103ng l\u00ean n\u00e0y c\u00f3 th\u1ec3 l\u00e0m ch\u1eadm nh\u1ecbp \u0111\u1ed9 cu\u1ed9c tr\u00f2 chuy\u1ec7n v\u00e0 g\u00e2y ra s\u1ef1 kh\u00e1c bi\u1ec7t \u0111\u00e1ng ch\u00fa \u00fd v\u1ec1 th\u1eddi gian.<\/p>\n\n\n\n<p>Theo c\u00e1ch n\u00e0y, TURNS c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c coi l\u00e0 ph\u01b0\u01a1ng ph\u00e1p &quot;cu\u1ed1i c\u00f9ng&quot; x\u00e9t v\u1ec1 m\u1eb7t ch\u1ea5t l\u01b0\u1ee3ng, nh\u01b0ng c\u0169ng l\u00e0 gi\u1ea3i ph\u00e1p c\u1ee9u c\u00e1nh \u0111\u00e1ng tin c\u1eady trong nh\u1eefng t\u00ecnh hu\u1ed1ng kh\u00f4ng c\u00f2n l\u1ef1a ch\u1ecdn n\u00e0o kh\u00e1c ngo\u00e0i vi\u1ec7c thi\u1ebft l\u1eadp li\u00ean l\u1ea1c.<\/p>\n\n\n\n<p>Trong nh\u1eefng n\u0103m g\u1ea7n \u0111\u00e2y, m\u1ed9t ph\u01b0\u01a1ng ph\u00e1p m\u1edbi (TURN qua QUIC) ho\u1ea1t \u0111\u1ed9ng tr\u00ean c\u1ed5ng UDP 443 v\u00e0 s\u1eed d\u1ee5ng DTLS\/QUIC thay v\u00ec TLS \u0111\u00e3 \u0111\u01b0\u1ee3c xem x\u00e9t, nh\u01b0ng ph\u01b0\u01a1ng ph\u00e1p n\u00e0y v\u1eabn \u0111ang trong qu\u00e1 tr\u00ecnh chu\u1ea9n h\u00f3a v\u00e0 ch\u01b0a \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng ph\u1ed5 bi\u1ebfn.<\/p>\n\n\n\n<h2>Lu\u1ed3ng giao ti\u1ebfp khi UDP STUN kh\u00f4ng kh\u1ea3 d\u1ee5ng<\/h2>\n\n\n\n<p>Ch\u00fang t\u00f4i s\u1ebd gi\u1ea3i th\u00edch t\u1eebng b\u01b0\u1edbc v\u1ec1 c\u00e1ch x\u1eed l\u00fd WebRTC ICE di\u1ec5n ra khi STUN qua UDP kh\u00f4ng kh\u1ea3 d\u1ee5ng. H\u00e3y gi\u1ea3 s\u1eed m\u1ed9t t\u00ecnh hu\u1ed1ng UDP b\u1ecb ch\u1eb7n ho\u00e0n to\u00e0n, ch\u1eb3ng h\u1ea1n nh\u01b0 tr\u00ean m\u1ea1ng c\u00f4ng ty, v\u00e0 theo d\u00f5i c\u00e1ch \u0111\u00e0m ph\u00e1n ICE tr\u1edf l\u1ea1i.<\/p>\n\n\n\n<ol><li><strong>M\u00e1y kh\u00e1ch g\u1eedi truy v\u1ea5n IP b\u00ean ngo\u00e0i (UDP\/3478) \u0111\u1ebfn m\u00e1y ch\u1ee7 STUN:<\/strong><br>M\u00e1y kh\u00e1ch WebRTC (tr\u00ecnh duy\u1ec7t)<code>M\u00e1y ch\u1ee7 b\u0103ng<\/code>Y\u00eau c\u1ea7u li\u00ean k\u1ebft (y\u00eau c\u1ea7u x\u00e1c minh \u0111\u1ecba ch\u1ec9 b\u00ean ngo\u00e0i) \u0111\u01b0\u1ee3c g\u1eedi \u0111\u1ebfn m\u00e1y ch\u1ee7 STUN \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh qua c\u1ed5ng UDP 3478. \u0110\u00e2y l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u ti\u00ean trong vi\u1ec7c thu th\u1eadp c\u00e1c \u1ee9ng vi\u00ean ICE v\u00e0 n\u1ebfu th\u00e0nh c\u00f4ng, m\u00e1y ch\u1ee7 s\u1ebd tr\u1ea3 v\u1ec1 \u0111\u1ecba ch\u1ec9 IP to\u00e0n c\u1ea7u v\u00e0 s\u1ed1 c\u1ed5ng c\u1ee7a ri\u00eang n\u00f3 v\u00e0 \u0111\u01b0\u1ee3c th\u00eam v\u00e0o danh s\u00e1ch \u1ee9ng vi\u00ean d\u01b0\u1edbi d\u1ea1ng \u1ee8ng vi\u00ean ph\u1ea3n x\u1ea1 m\u00e1y ch\u1ee7 (\u1ee9ng vi\u00ean srflx).<\/li><li><strong>C\u00e1c g\u00f3i UDP b\u1ecb t\u01b0\u1eddng l\u1eeda ch\u1eb7n v\u00e0 kh\u00f4ng nh\u1eadn \u0111\u01b0\u1ee3c ph\u1ea3n h\u1ed3i:<\/strong><br>Trong tr\u01b0\u1eddng h\u1ee3p n\u00e0y, c\u00e1c thi\u1ebft l\u1eadp t\u01b0\u1eddng l\u1eeda m\u1ea1ng ng\u0103n ch\u1eb7n giao ti\u1ebfp UDP ra b\u00ean ngo\u00e0i. Do \u0111\u00f3, c\u00e1c y\u00eau c\u1ea7u \u0111\u1ebfn m\u00e1y ch\u1ee7 STUN kh\u00f4ng \u0111\u1ebfn \u0111\u01b0\u1ee3c m\u00e1y ch\u1ee7 ho\u1eb7c ph\u1ea3n h\u1ed3i kh\u00f4ng \u0111\u1ebfn \u0111\u01b0\u1ee3c m\u00e1y kh\u00e1ch. K\u1ebft qu\u1ea3 l\u00e0, m\u00e1y kh\u00e1ch<strong>Kh\u00f4ng nh\u1eadn \u0111\u01b0\u1ee3c ph\u1ea3n h\u1ed3i STUN<\/strong>, \u0111\u1ecba ch\u1ec9 IP b\u00ean ngo\u00e0i kh\u00f4ng th\u1ec3 bi\u1ebft \u0111\u01b0\u1ee3c. T\u00e1c nh\u00e2n ICE ch\u1edd ph\u1ea3n h\u1ed3i trong m\u1ed9t kho\u1ea3ng th\u1eddi gian nh\u1ea5t \u0111\u1ecbnh, nh\u01b0ng sau \u0111\u00f3 h\u1ebft th\u1eddi gian ch\u1edd. Theo quan \u0111i\u1ec3m c\u1ee7a ng\u01b0\u1eddi d\u00f9ng, k\u1ebft n\u1ed1i v\u1eabn \u0111ang \u0111\u01b0\u1ee3c x\u1eed l\u00fd v\u00e0 kh\u00f4ng c\u00f3 th\u00f4ng b\u00e1o l\u1ed7i n\u00e0o \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb, nh\u01b0ng tr\u00ean th\u1ef1c t\u1ebf<strong>Kh\u00f4ng thu th\u1eadp \u0111\u01b0\u1ee3c \u1ee9ng vi\u00ean<\/strong>S\u1ef1 vi\u1ec7c n\u00e0y hi\u1ec7n \u0111ang x\u1ea3y ra.<\/li><li><strong>Ki\u1ec3m tra k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp ICE kh\u00f4ng th\u00e0nh c\u00f4ng v\u00ec kh\u00f4ng c\u00f3 \u1ee9ng vi\u00ean Server Reflexive n\u00e0o kh\u1ea3 d\u1ee5ng:<\/strong><br>Th\u00f4ng th\u01b0\u1eddng, n\u1ebfu STUN th\u00e0nh c\u00f4ng, m\u00e1y kh\u00e1ch c\u00f3 m\u1ed9t \u1ee9ng vi\u00ean Server Reflexive (IP to\u00e0n c\u1ea7u c\u1ee7a b\u1ea1n) ngo\u00e0i \u1ee9ng vi\u00ean Host (IP c\u1ee5c b\u1ed9 c\u1ee7a b\u1ea1n) v\u00e0 ki\u1ec3m tra k\u1ebft n\u1ed1i b\u1eb1ng c\u00e1ch k\u1ebft h\u1ee3p n\u00f3 v\u1edbi \u1ee9ng vi\u00ean t\u01b0\u01a1ng t\u1ef1 c\u1ee7a \u0111\u1ed1i t\u00e1c \u0111\u1ea7u xa. Tuy nhi\u00ean, n\u1ebfu kh\u00f4ng c\u00f3 \u1ee9ng vi\u00ean IP to\u00e0n c\u1ea7u do l\u1ed7i STUN,<strong>C\u00e1c \u1ee9ng c\u1eed vi\u00ean cho c\u00e1c k\u1ebft n\u1ed1i ngang h\u00e0ng tr\u1ef1c ti\u1ebfp l\u00e0 c\u1ef1c k\u1ef3 h\u1ea1n ch\u1ebf<\/strong>V\u00ed d\u1ee5, n\u1ebfu c\u1ea3 hai b\u00ean ch\u1ec9 c\u00f3 \u0111\u1ecba ch\u1ec9 IP ri\u00eang, h\u1ecd s\u1ebd kh\u00f4ng th\u1ec3 li\u00ean l\u1ea1c v\u1edbi nhau ngay c\u1ea3 khi h\u1ecd c\u1ed1 g\u1eafng k\u1ebft n\u1ed1i. Do \u0111\u00f3, ICE s\u1ebd x\u00e1c \u0111\u1ecbnh r\u1eb1ng kh\u00f4ng th\u1ec3 giao ti\u1ebfp tr\u1ef1c ti\u1ebfp. N\u1ebfu m\u00e1y ch\u1ee7 ICE (TURN) kh\u00f4ng \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh, to\u00e0n b\u1ed9 ICE s\u1ebd \u0111\u01b0\u1ee3c coi l\u00e0 l\u1ed7i \u1edf giai \u0111o\u1ea1n n\u00e0y v\u00e0 k\u1ebft n\u1ed1i WebRTC s\u1ebd kh\u00f4ng \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp (b\u1ea3ng \u0111i\u1ec1u khi\u1ec3n d\u00e0nh cho nh\u00e0 ph\u00e1t tri\u1ec3n s\u1ebd hi\u1ec3n th\u1ecb<code>ICE \u0111\u00e3 th\u1ea5t b\u1ea1i<\/code>ho\u1eb7c<code>Tr\u1ea1ng th\u00e1i k\u1ebft n\u1ed1i ICE: kh\u00f4ng th\u00e0nh c\u00f4ng<\/code>v.v. s\u1ebd \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb).<\/li><li><strong>C\u1ed1 g\u1eafng l\u1ea5y \u1ee9ng vi\u00ean chuy\u1ec3n ti\u1ebfp TURN (qua TCP\/TLS\/443):<\/strong><br>Ngay c\u1ea3 khi vi\u1ec7c tuy\u1ec3n d\u1ee5ng \u1ee9ng vi\u00ean tr\u1ef1c ti\u1ebfp c\u1ee7a STUN kh\u00f4ng th\u00e0nh c\u00f4ng,<code>M\u00e1y ch\u1ee7 b\u0103ng<\/code>N\u1ebfu m\u00e1y ch\u1ee7 TURN \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh trong<strong>C\u00e1c b\u01b0\u1edbc ti\u1ebfp theo<\/strong>Trong v\u00ed d\u1ee5 n\u00e0y, v\u00ec UDP kh\u00f4ng kh\u1ea3 d\u1ee5ng n\u00ean m\u00e1y kh\u00e1ch s\u1ebd c\u1ed1 g\u1eafng k\u1ebft n\u1ed1i v\u1edbi m\u00e1y ch\u1ee7 TURN b\u1eb1ng TCP ho\u1eb7c TLS (v\u00ed d\u1ee5:<code>l\u01b0\u1ee3t: l\u01b0\u1ee3t.example.com:443<\/code>(N\u1ebfu \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh, b\u1eaft tay TLS s\u1ebd b\u1eaft \u0111\u1ea7u.) May m\u1eafn thay, t\u01b0\u1eddng l\u1eeda cho ph\u00e9p giao ti\u1ebfp HTTPS tr\u00ean TCP 443, do \u0111\u00f3 k\u1ebft n\u1ed1i TURN qua TLS th\u00e0nh c\u00f4ng. M\u00e1y kh\u00e1ch b\u1ea3o m\u1eadt \u0111\u1ecba ch\u1ec9 chuy\u1ec3n ti\u1ebfp tr\u00ean m\u00e1y ch\u1ee7 TURN,<strong>\u1ee8ng vi\u00ean ti\u1ebfp s\u1ee9c<\/strong>Ph\u00eda b\u00ean kia s\u1ebd c\u00f3 \u0111\u01b0\u1ee3c c\u00e1c \u1ee9ng vi\u00ean chuy\u1ec3n ti\u1ebfp, l\u00e0 &quot;\u1ee9ng vi\u00ean \u1ea3o \u0111\u1ec3 giao ti\u1ebfp qua m\u00e1y ch\u1ee7 TURN&quot;. Trong khi \u0111\u00f3, ph\u00eda b\u00ean kia (ph\u00eda t\u1eeb xa) c\u0169ng s\u1ebd c\u00f3 \u0111\u01b0\u1ee3c c\u00e1c \u1ee9ng vi\u00ean chuy\u1ec3n ti\u1ebfp ho\u1eb7c n\u1ebfu \u0111\u00f3 l\u00e0 m\u1ea1ng kh\u00f4ng c\u00f3 v\u1ea5n \u0111\u1ec1, n\u00f3 s\u1ebd c\u00f3 c\u00e1c \u1ee9ng vi\u00ean tr\u1ef1c ti\u1ebfp ho\u1eb7c \u1ee9ng vi\u00ean STUN. Trong m\u1ecdi tr\u01b0\u1eddng h\u1ee3p, n\u1ebfu \u00edt nh\u1ea5t m\u1ed9t b\u00ean c\u00f3 c\u00e1c \u1ee9ng vi\u00ean chuy\u1ec3n ti\u1ebfp, ph\u00eda b\u00ean kia c\u00f3 th\u1ec3 th\u1eed k\u1ebft n\u1ed1i v\u1edbi m\u00e1y ch\u1ee7 TURN \u0111\u00f3.<\/li><li><strong>Thi\u1ebft l\u1eadp k\u1ebft n\u1ed1i ICE (ho\u1eb7c l\u1ed7i cu\u1ed1i c\u00f9ng) th\u00f4ng qua r\u01a1le:<\/strong><br>Khi c\u1ea3 hai \u0111\u1ed1i t\u00e1c \u0111\u1ec1u c\u00f3 \u1ee9ng vi\u00ean kh\u1ea3 d\u1ee5ng (m\u1ed9t ho\u1eb7c c\u1ea3 hai \u1ee9ng vi\u00ean chuy\u1ec3n ti\u1ebfp trong v\u00ed d\u1ee5 n\u00e0y), ICE s\u1eed d\u1ee5ng ch\u00fang \u0111\u1ec3 ki\u1ec3m tra k\u1ebft n\u1ed1i. Khi giao ti\u1ebfp qua m\u00e1y ch\u1ee7 TURN \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp v\u1edbi m\u00e1y ch\u1ee7, n\u00f3 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c chuy\u1ec3n ti\u1ebfp, do \u0111\u00f3 k\u00eanh ph\u01b0\u01a1ng ti\u1ec7n \u0111\u01b0\u1ee3c m\u1edf ngay c\u1ea3 khi UDP kh\u00f4ng truy\u1ec1n tr\u1ef1c ti\u1ebfp gi\u1eefa c\u00e1c \u0111\u1ed1i t\u00e1c. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p giao ti\u1ebfp video v\u00e0 \u00e2m thanh gi\u1eefa nh\u1eefng ng\u01b0\u1eddi d\u00f9ng b\u1eaft \u0111\u1ea7u. Sau khi k\u1ebft n\u1ed1i \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp, c\u00f3 m\u1ed9t s\u1ed1 chi ph\u00ed chung d\u01b0\u1edbi d\u1ea1ng TCP qua TLS, nh\u01b0ng b\u1ea3n th\u00e2n cu\u1ed9c tr\u00f2 chuy\u1ec7n v\u1eabn c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n \u0111\u01b0\u1ee3c. Ng\u01b0\u1ee3c l\u1ea1i, n\u1ebfu c\u0169ng c\u00f3 l\u1ed7i \u1edf \u0111\u00e2y (v\u00ed d\u1ee5: proxy c\u1ee7a c\u00f4ng ty ph\u00e1t hi\u1ec7n v\u00e0 ch\u1eb7n giao ti\u1ebfp TLS kh\u00f4ng ph\u1ea3i HTTP ho\u1eb7c x\u00e1c th\u1ef1c m\u00e1y ch\u1ee7 TURN kh\u00f4ng th\u00e0nh c\u00f4ng), th\u1eadt kh\u00f4ng may, ICE s\u1ebd kh\u00f4ng th\u00e0nh c\u00f4ng v\u00e0 k\u1ebft n\u1ed1i s\u1ebd b\u1ecb h\u1ee7y b\u1ecf. \u1ee8ng d\u1ee5ng c\u1ea7n ph\u00e1t hi\u1ec7n t\u00ecnh hu\u1ed1ng n\u00e0y v\u00e0 th\u00f4ng b\u00e1o cho ng\u01b0\u1eddi d\u00f9ng r\u1eb1ng &quot;kh\u00f4ng th\u1ec3 k\u1ebft n\u1ed1i&quot;, v.v.<\/li><\/ol>\n\n\n\n<p>\u0110\u00e2y l\u00e0 lu\u1ed3ng \u0111\u00e0m ph\u00e1n ICE trong m\u00f4i tr\u01b0\u1eddng kh\u1eafc nghi\u1ec7t m\u00e0 UDP kh\u00f4ng th\u1ec3 s\u1eed d\u1ee5ng \u0111\u01b0\u1ee3c. T\u00f3m l\u1ea1i, c\u00e1c \u1ee9ng vi\u00ean \u0111\u01b0\u1ee3c th\u1eed theo th\u1ee9 t\u1ef1 &quot;Host \u2192 STUN \u2192 TURN&quot;, v\u00e0 n\u1ebfu kh\u00f4ng \u0111\u01b0\u1ee3c, k\u1ebft n\u1ed1i s\u1ebd kh\u00f4ng th\u00e0nh c\u00f4ng. \u0110i\u1ec1u quan tr\u1ecdng l\u00e0 c\u00e1c nh\u00e0 ph\u00e1t tri\u1ec3n ph\u1ea3i hi\u1ec3u \u0111\u01b0\u1ee3c h\u00e0nh vi n\u00e0y v\u00e0 \u00edt nh\u1ea5t ph\u1ea3i bao g\u1ed3m m\u1ed9t m\u00e1y ch\u1ee7 TURN\/TURNS trong danh s\u00e1ch m\u00e1y ch\u1ee7 ICE, \u0111\u1ec3 ngay c\u1ea3 trong tr\u01b0\u1eddng h\u1ee3p x\u1ea5u nh\u1ea5t v\u1eabn c\u00f3 kh\u1ea3 n\u0103ng thi\u1ebft l\u1eadp \u0111\u01b0\u1ee3c giao ti\u1ebfp. Ngo\u00e0i ra, khi nh\u1eadn \u0111\u01b0\u1ee3c y\u00eau c\u1ea7u t\u1eeb ng\u01b0\u1eddi d\u00f9ng, c\u1ea7n ph\u1ea3i kh\u1eafc ph\u1ee5c s\u1ef1 c\u1ed1, ch\u1eb3ng h\u1ea1n nh\u01b0 suy ra s\u1ef1 c\u1ed1 v\u1edbi m\u00f4i tr\u01b0\u1eddng m\u1ea1ng (ch\u1eb3ng h\u1ea1n nh\u01b0 ch\u1eb7n UDP) t\u1eeb th\u00f4ng tin nh\u01b0 &quot;ICE kh\u00f4ng th\u00e0nh c\u00f4ng&quot; v\u00e0 ki\u1ec3m tra xem c\u00f3 thi\u1ebfu c\u00e0i \u0111\u1eb7t m\u00e1y ch\u1ee7 TURN kh\u00f4ng.<\/p>\n\n\n\n<h2>X\u00e2y d\u1ef1ng v\u00e0 c\u1ea5u h\u00ecnh m\u00e1y ch\u1ee7 STUN\/TURN\/TURNS b\u1eb1ng coturn<\/h2>\n\n\n\n<p>N\u1ebfu b\u1ea1n mu\u1ed1n thi\u1ebft l\u1eadp m\u00e1y ch\u1ee7 STUN\/TURN c\u1ee7a ri\u00eang m\u00ecnh, h\u00e3y s\u1eed d\u1ee5ng phi\u00ean b\u1ea3n m\u00e3 ngu\u1ed3n m\u1edf. <strong><a href=\"https:\/\/github.com\/coturn\/coturn\" data-type=\"URL\" data-id=\"https:\/\/github.com\/coturn\/coturn\">coturn<\/a><\/strong>Ng\u01b0\u1eddi ta th\u01b0\u1eddng s\u1eed d\u1ee5ng coturn. coturn l\u00e0 m\u1ed9t tri\u1ec3n khai m\u00e1y ch\u1ee7 h\u1ed7 tr\u1ee3 c\u1ea3 STUN v\u00e0 TURN, v\u00e0 c\u0169ng c\u00f3 th\u1ec3 h\u1ed7 tr\u1ee3 TURNS (TLS) t\u00f9y thu\u1ed9c v\u00e0o c\u00e0i \u0111\u1eb7t. B\u00e0i vi\u1ebft n\u00e0y gi\u1ea3i th\u00edch c\u00e1ch c\u00e0i \u0111\u1eb7t coturn tr\u00ean m\u00e1y ch\u1ee7 Linux v\u00e0 x\u00e2y d\u1ef1ng m\u00e1y ch\u1ee7 cung c\u1ea5p STUN\/TURN\/TURNS, c\u0169ng nh\u01b0 c\u00e1c \u0111i\u1ec3m c\u1ea5u h\u00ecnh. B\u00e0i vi\u1ebft c\u0169ng gi\u1ea3i th\u00edch t\u1ec7p c\u1ea5u h\u00ecnh th\u00f4ng th\u01b0\u1eddng (<code>turnserver.conf<\/code>) c\u0169ng \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb.<\/p>\n\n\n\n<h3>C\u00e0i \u0111\u1eb7t v\u00e0 c\u1ea5u h\u00ecnh c\u01a1 b\u1ea3n<\/h3>\n\n\n\n<h4><strong>c\u00e0i \u0111\u1eb7t<\/strong><\/h4>\n\n\n\n<p>\u0110\u1ed1i v\u1edbi Ubuntu v\u00e0 Debian,<code>th\u00edch h\u1ee3p<\/code>B\u1ea1n c\u00f3 th\u1ec3 c\u00e0i \u0111\u1eb7t g\u00f3i coturn t\u1eeb. V\u00ed d\u1ee5, s\u1eed d\u1ee5ng l\u1ec7nh sau \u0111\u1ec3 c\u00e0i \u0111\u1eb7t v\u00e0 thi\u1ebft l\u1eadp \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng kh\u1edfi \u0111\u1ed9ng.<\/p>\n\n\n\n<div class=\"hcb_wrap\" data-no-translation=\"\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code># Ubuntu\/Debian\u306e\u5834\u5408\nsudo apt-get install coturn\nsudo sed -i &#39;s\/#TURNSERVER_ENABLED=1\/TURNSERVER_ENABLED=1\/&#39; \/etc\/default\/coturn\nsudo systemctl enable --now coturn<\/code><\/pre><\/div>\n\n\n\n<p>\u0110i\u1ec1u n\u00e0y s\u1ebd kh\u1edfi \u0111\u1ed9ng m\u00e1y ch\u1ee7 coturn nh\u01b0 m\u1ed9t daemon. Theo m\u1eb7c \u0111\u1ecbnh, n\u00f3 s\u1ebd ch\u1ea1y t\u1ec7p c\u1ea5u h\u00ecnh <code>\/etc\/turnserver.conf<\/code> Thao t\u00e1c n\u00e0y s\u1ebd t\u1ea3i t\u1ec7p v\u00e0 sau \u0111\u00f3 b\u1ea1n c\u00f3 th\u1ec3 ch\u1ec9nh s\u1eeda t\u1ec7p \u0111\u00f3 (h\u00e3y sao l\u01b0u tr\u01b0\u1edbc khi ch\u1ec9nh s\u1eeda \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o an to\u00e0n).<\/p>\n\n\n\n<h4><strong>C\u00e0i \u0111\u1eb7t c\u01a1 b\u1ea3n<\/strong><\/h4>\n\n\n\n<p> <code>turnserver.conf<\/code>B\u00e2y gi\u1edd, h\u00e3y thi\u1ebft l\u1eadp c\u00e1c m\u1ee5c sau:<\/p>\n\n\n\n<ul><li class=\"\"><strong>t\u00ean mi\u1ec1n v\u00e0 t\u00ean m\u00e1y ch\u1ee7:<\/strong> \u0110\u00e2y l\u00e0 t\u00ean mi\u1ec1n ho\u1eb7c t\u00ean nh\u1eadn d\u1ea1ng c\u1ee7a m\u00e1y ch\u1ee7 TURN. N\u00f3 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng khi x\u00e1c th\u1ef1c m\u00e1y kh\u00e1ch WebRTC, nh\u01b0ng v\u1ec1 c\u01a1 b\u1ea3n n\u00f3 c\u00f3 th\u1ec3 l\u00e0 b\u1ea5t k\u1ef3 chu\u1ed7i n\u00e0o. V\u00ed d\u1ee5: <code>mi\u1ec1n=example.com<\/code>,<code>t\u00ean m\u00e1y ch\u1ee7=example.com<\/code>.<\/li><li class=\"\"><strong>c\u1ed5ng l\u1eafng nghe:<\/strong> S\u1ed1 c\u1ed5ng UDP \u0111\u1ec3 l\u1eafng nghe TURN v\u00e0 STUN. M\u1eb7c \u0111\u1ecbnh l\u00e0 3478.<code>l\u1eafng nghe-ip<\/code>B\u1ea1n c\u0169ng c\u00f3 th\u1ec3 li\u00ean k\u1ebft v\u1edbi m\u1ed9t NIC c\u1ee5 th\u1ec3 v\u1edbi<code>0.0.0.0<\/code>Ch\u00fang t\u00f4i ch\u1ea5p nh\u1eadn t\u1ea5t c\u1ea3.<\/li><li class=\"\"><strong>c\u1ed5ng l\u1eafng nghe tls:<\/strong> \u0110\u00e2y l\u00e0 s\u1ed1 c\u1ed5ng TCP \u0111\u1ec3 l\u1eafng nghe TLS (TURNS). N\u00f3i chung, 443 ho\u1eb7c 5349 \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh. V\u00ed d\u1ee5: <code>c\u1ed5ng nghe tls=443<\/code>.<\/li><li class=\"\"><strong>ip ngo\u00e0i:<\/strong> N\u1ebfu m\u00e1y ch\u1ee7 n\u1eb1m sau NAT, h\u00e3y ch\u1ec9 \u0111\u1ecbnh IP to\u00e0n c\u1ee5c c\u1ee7a ri\u00eang n\u00f3 (\u0111i\u1ec1u n\u00e0y cho ph\u00e9p m\u00e1y ch\u1ee7 nh\u1eadn ra \u00e1nh x\u1ea1 gi\u1eefa IP n\u1ed9i b\u1ed9 v\u00e0 IP b\u00ean ngo\u00e0i). \u0110i\u1ec1u n\u00e0y kh\u00f4ng c\u1ea7n thi\u1ebft n\u1ebfu m\u00e1y ch\u1ee7 c\u00f3 IP to\u00e0n c\u1ee5c tr\u1ef1c ti\u1ebfp.<\/li><li class=\"\"><strong>Ph\u01b0\u01a1ng ph\u00e1p x\u00e1c th\u1ef1c:<\/strong> WebRTC s\u1eed d\u1ee5ng th\u00f4ng tin x\u00e1c th\u1ef1c d\u00e0i h\u1ea1n cho TURN, v\u00ec v\u1eady<code>lt-cred-mech<\/code>(C\u01a1 ch\u1ebf ch\u1ee9ng nh\u1eadn d\u00e0i h\u1ea1n) \u0111\u00e3 \u0111\u01b0\u1ee3c b\u1eadt.<code>ng\u01b0\u1eddi d\u00f9ng=t\u00ean ng\u01b0\u1eddi d\u00f9ng:m\u1eadt kh\u1ea9u<\/code>ho\u1eb7c \u0111\u1eb7t t\u00ean ng\u01b0\u1eddi d\u00f9ng v\u00e0 m\u1eadt kh\u1ea9u theo \u0111\u1ecbnh d\u1ea1ng<code>s\u1eed d\u1ee5ng-x\u00e1c-th\u1ef1c-b\u00ed-m\u1eadt<\/code>(Ph\u01b0\u01a1ng ph\u00e1p sau l\u00e0 x\u00e1c th\u1ef1c d\u1ef1a tr\u00ean m\u00e3 th\u00f4ng b\u00e1o, c\u00f3 hi\u1ec7u qu\u1ea3 trong vi\u1ec7c c\u1ea3i thi\u1ec7n b\u1ea3o m\u1eadt, nh\u01b0ng \u1edf \u0111\u00e2y ch\u00fang t\u00f4i s\u1ebd tr\u00ecnh b\u00e0y ph\u01b0\u01a1ng ph\u00e1p x\u00e1c th\u1ef1c ng\u01b0\u1eddi d\u00f9ng t\u0129nh \u0111\u01a1n gi\u1ea3n l\u00e0m v\u00ed d\u1ee5.)<\/li><li class=\"\"><strong>C\u00e0i \u0111\u1eb7t nh\u1eadt k\u00fd:<\/strong> \u0110\u1ec3 kh\u1eafc ph\u1ee5c s\u1ef1 c\u1ed1<code>t\u1eadp tin nh\u1eadt k\u00fd<\/code>Ch\u1ec9 \u0111\u1ecbnh \u0111\u01b0\u1eddng d\u1eabn t\u1ec7p nh\u1eadt k\u00fd trong<code>d\u00e0i d\u00f2ng<\/code>B\u1ea1n c\u00f3 th\u1ec3 mu\u1ed1n b\u1eadt t\u00ednh n\u0103ng ghi nh\u1eadt k\u00fd chi ti\u1ebft.<\/li><\/ul>\n\n\n\n<h4><strong>C\u00e0i \u0111\u1eb7t t\u01b0\u1eddng l\u1eeda<\/strong><\/h4>\n\n\n\n<p>\u1ede ph\u00eda m\u00e1y ch\u1ee7, \u0111\u1ec3 STUN\/TURN<strong>C\u1ed5ng UDP 3478<\/strong>v\u00e0 cho TURN\/TLS<strong>C\u1ed5ng TCP 443<\/strong>(ho\u1eb7c 5349) ph\u1ea3i \u0111\u01b0\u1ee3c m\u1edf. Ngo\u00e0i ra, TURN relay s\u1eed d\u1ee5ng ph\u1ea1m vi c\u1ed5ng UDP 10000-20000 theo m\u1eb7c \u0111\u1ecbnh, do \u0111\u00f3 h\u00e3y m\u1edf ph\u1ea1m vi c\u1ed5ng n\u00e0y tr\u00ean m\u00e1y ch\u1ee7 (n\u1ebfu c\u1ea7n,<code>c\u1ed5ng nh\u1ecf nh\u1ea5t<\/code>V\u00e0<code>c\u1ed5ng t\u1ed1i \u0111a<\/code>(Ph\u1ea1m vi c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c thay \u0111\u1ed5i v\u1edbi<\/p>\n\n\n\n<p>D\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t v\u00ed d\u1ee5 ph\u1ea3n \u00e1nh c\u00e1c thi\u1ebft l\u1eadp c\u01a1 b\u1ea3n \u1edf tr\u00ean.<code>\/etc\/turnserver.conf<\/code>Sau \u0111\u00e2y l\u00e0 m\u1ed9t v\u00ed d\u1ee5:<\/p>\n\n\n\n<div class=\"hcb_wrap\" data-no-translation=\"\"><pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code># TURN\u30b5\u30fc\u30d0\u306e\u540d\u79f0\u3068\u30ec\u30eb\u30e0\uff08\u30c9\u30e1\u30a4\u30f3\uff09\nrealm=example.com\nserver-name=example.com\n\n# \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a\nlistening-ip=0.0.0.0           # \u3059\u3079\u3066\u306eIP\u30a2\u30c9\u30ec\u30b9\u3067\u5f85\u53d7\nexternal-ip=203.0.113.10       # \u30b5\u30fc\u30d0\u306e\u30b0\u30ed\u30fc\u30d0\u30ebIP\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09\n\n# \u30dd\u30fc\u30c8\u8a2d\u5b9a\nlistening-port=3478            # STUN\/TURN\u7528 UDP\u30dd\u30fc\u30c8\ntls-listening-port=443         # TLS\u7528 TCP\u30dd\u30fc\u30c8 (443\u756a)\nmin-port=10000                 # \u4e2d\u7d99\u306b\u4f7f\u7528\u3059\u308b\u30dd\u30fc\u30c8\u7bc4\u56f2\uff08\u4e0b\u9650\uff09\nmax-port=20000                 # \u4e2d\u7d99\u306b\u4f7f\u7528\u3059\u308b\u30dd\u30fc\u30c8\u7bc4\u56f2\uff08\u4e0a\u9650\uff09\n\n# \u30ed\u30b0\u8a2d\u5b9a\nlog-file=\/var\/log\/turnserver.log\nverbose                        # \u8a73\u7d30\u30ed\u30b0\u3092\u6709\u52b9\u5316\nfingerprint                    # \u30d1\u30b1\u30c3\u30c8\u306bfingerprint\u5c5e\u6027\u3092\u4ed8\u4e0e\n\n# \u8a8d\u8a3c\u8a2d\u5b9a\uff08\u9577\u671f\u8a8d\u8a3c\u65b9\u5f0f\uff09\nlt-cred-mech                   # \u9577\u671f\u8a8d\u8a3c\u3092\u6709\u52b9\u5316\nuser=webrtcuser:secretpass123  # \u30e6\u30fc\u30b6\u540d:\u30d1\u30b9\u30ef\u30fc\u30c9 \u3092\u8a2d\u5b9a\n\n# TLS\/SSL\u8a3c\u660e\u66f8\u306e\u6307\u5b9a\ncert=\/etc\/letsencrypt\/live\/example.com\/fullchain.pem   # \u30b5\u30fc\u30d0\u8a3c\u660e\u66f8\npkey=\/etc\/letsencrypt\/live\/example.com\/privkey.pem     # \u79d8\u5bc6\u9375<\/code><\/pre><\/div>\n\n\n\n<p>\u1ede tr\u00ean, mi\u1ec1n<code>v\u00ed d\u1ee5.com<\/code>Ch\u00fang t\u00f4i l\u1ea5y ch\u1ee9ng ch\u1ec9 Let&#039;s Encrypt v\u00e0 s\u1eed d\u1ee5ng n\u00f3 cho c\u00e0i \u0111\u1eb7t TLS.<code>lt-cred-mech<\/code>Cho ph\u00e9p x\u00e1c th\u1ef1c d\u00e0i h\u1ea1n v\u1edbi<code>ng\u01b0\u1eddi s\u1eed d\u1ee5ng<\/code>\u0110i\u1ec1u n\u00e0y thi\u1ebft l\u1eadp x\u00e1c th\u1ef1c t\u00ean ng\u01b0\u1eddi d\u00f9ng\/m\u1eadt kh\u1ea9u \u0111\u01a1n gi\u1ea3n.<code>s\u1eed d\u1ee5ng-x\u00e1c-th\u1ef1c-b\u00ed-m\u1eadt<\/code>V\u00e0<code>b\u00ed m\u1eadt x\u00e1c th\u1ef1c t\u0129nh<\/code>Ph\u01b0\u01a1ng ph\u00e1p \u0111\u01b0\u1ee3c khuy\u1ebfn ngh\u1ecb l\u00e0 s\u1eed d\u1ee5ng ph\u01b0\u01a1ng ph\u00e1p d\u1ef1a tr\u00ean m\u00e3 th\u00f4ng b\u00e1o \u0111\u1ec3 c\u1ea5p th\u00f4ng tin x\u00e1c th\u1ef1c t\u1ea1m th\u1eddi, nh\u01b0ng ch\u00fang t\u00f4i s\u1ebd kh\u00f4ng \u0111i s\u00e2u v\u00e0o v\u1ea5n \u0111\u1ec1 n\u00e0y \u1edf \u0111\u00e2y.<\/p>\n\n\n\n<h4><strong>Th\u1eadn tr\u1ecdng khi s\u1eed d\u1ee5ng TLS<\/strong><\/h4>\n\n\n\n<p>Khi ch\u1ea1y coturn tr\u00ean c\u1ed5ng 443, b\u1ea1n c\u1ea7n c\u1ea9n th\u1eadn v\u1ec1 quy\u1ec1n c\u1ee7a c\u1ed5ng trong m\u00f4i tr\u01b0\u1eddng Linux. C\u00e1c c\u1ed5ng d\u01b0\u1edbi 1024 \u0111\u01b0\u1ee3c g\u1ecdi l\u00e0 c\u1ed5ng \u0111\u1eb7c quy\u1ec1n v\u00e0 th\u01b0\u1eddng kh\u00f4ng th\u1ec3 m\u1edf \u0111\u01b0\u1ee3c n\u1ebfu kh\u00f4ng c\u00f3 quy\u1ec1n root. G\u00f3i coturn c\u1ee7a Ubuntu m\u1eb7c \u0111\u1ecbnh l\u00e0<code>m\u00e1y ch\u1ee7 turnserver<\/code>V\u00ec l\u1ec7nh n\u00e0y \u0111\u01b0\u1ee3c th\u1ef1c thi b\u1edfi ng\u01b0\u1eddi d\u00f9ng n\u00ean n\u00f3 kh\u00f4ng th\u1ec3 li\u00ean k\u1ebft v\u1edbi c\u1ed5ng 443 theo m\u1eb7c \u0111\u1ecbnh.<code>\/etc\/m\u1eb7c \u0111\u1ecbnh\/coturn<\/code>Thay \u0111\u1ed5i ng\u01b0\u1eddi d\u00f9ng \u0111ang ch\u1ea1y th\u00e0nh root ho\u1eb7c<code>n\u1eafp \u0111\u1eady<\/code>V\u1edbi l\u1ec7nh<code>m\u00e1y ch\u1ee7 turnserver<\/code>v\u00e0o t\u1eadp tin th\u1ef1c thi<code>d\u1ecbch v\u1ee5 li\u00ean k\u1ebft cap_net<\/code>C\u00f3 m\u1ed9t c\u00e1ch \u0111\u1ec3 c\u1ea5p quy\u1ec1n. V\u00ed d\u1ee5, trong tr\u01b0\u1eddng h\u1ee3p sau,<code>sudo setcap cap_net_bind_service=+ep \/usr\/bin\/turnserver<\/code>B\u1eb1ng c\u00e1ch th\u1ef1c hi\u1ec7n l\u1ec7nh n\u00e0y, ngay c\u1ea3 ng\u01b0\u1eddi d\u00f9ng kh\u00f4ng ph\u1ea3i root c\u0169ng c\u00f3 th\u1ec3 li\u00ean k\u1ebft c\u00e1c c\u1ed5ng c\u00f3 s\u1ed1 th\u1ea5p. Ngo\u00e0i ra, h\u00e3y ch\u1ec9 \u0111\u1ecbnh \u0111\u01b0\u1eddng d\u1eabn ch\u00ednh x\u00e1c \u0111\u1ebfn t\u1ec7p ch\u1ee9ng ch\u1ec9 (cert\/pkey) v\u00e0 \u0111\u1eb7t quy\u1ec1n cho t\u1ec7p \u0111\u1ec3 ng\u01b0\u1eddi d\u00f9ng coturn c\u00f3 th\u1ec3 \u0111\u1ecdc \u0111\u01b0\u1ee3c. Sau khi thay \u0111\u1ed5i c\u00e0i \u0111\u1eb7t,<code>sudo systemctl kh\u1edfi \u0111\u1ed9ng l\u1ea1i coturn<\/code>Kh\u1edfi \u0111\u1ed9ng l\u1ea1i d\u1ecbch v\u1ee5 v\u00e0 ki\u1ec3m tra nh\u1eadt k\u00fd xem c\u00f3 l\u1ed7i n\u00e0o kh\u00f4ng.<\/p>\n\n\n\n<h4><strong>Ki\u1ec3m tra ho\u1ea1t \u0111\u1ed9ng<\/strong><\/h4>\n\n\n\n<p>Sau khi kh\u1edfi \u0111\u1ed9ng m\u00e1y ch\u1ee7 coturn, ch\u00fang t\u00f4i s\u1ebd th\u1eed nghi\u1ec7m n\u00f3 b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng m\u00e1y kh\u00e1ch STUN \u0111\u1ec3 ki\u1ec3m tra ho\u1ea1t \u0111\u1ed9ng c\u1ee7a n\u00f3 v\u00e0 c\u0169ng th\u1eed k\u1ebft n\u1ed1i v\u1edbi ICE t\u1eeb \u1ee9ng d\u1ee5ng WebRTC tr\u00ean tr\u00ecnh duy\u1ec7t.<code>kh\u00e1ch h\u00e0ng<\/code>y\u00eau c\u1ea7u(<code>apt-get c\u00e0i \u0111\u1eb7t stun-client<\/code>(C\u00f3 s\u1eb5n \u0111\u1ec3 c\u00e0i \u0111\u1eb7t t\u1ea1i<code>stunclient &lt;m\u00e1y ch\u1ee7 IP&gt; 3478<\/code>B\u1ea1n c\u00f3 th\u1ec3 th\u1eed l\u1ea5y IP b\u00ean ngo\u00e0i c\u1ee7a m\u00ecnh b\u1eb1ng c\u00e1ch ch\u1ea1y l\u1ec7nh sau. Ngo\u00e0i ra, trong tr\u00ecnh duy\u1ec7t c\u1ee7a b\u1ea1n, c\u00e1c \u1ee9ng vi\u00ean ICE s\u1ebd \u0111\u01b0\u1ee3c li\u1ec7t k\u00ea trong nh\u1eadt k\u00fd c\u00f4ng c\u1ee5 d\u00e0nh cho nh\u00e0 ph\u00e1t tri\u1ec3n, v\u00ec v\u1eady<code>srflx<\/code>(M\u00e1y ch\u1ee7 ph\u1ea3n x\u1ea1) \u1ee9ng vi\u00ean v\u00e0<code>ti\u1ebfp s\u1ee9c<\/code>Ki\u1ec3m tra xem b\u1ea1n c\u00f3 nh\u1eadn \u0111\u01b0\u1ee3c \u1ee9ng vi\u00ean kh\u00f4ng. N\u1ebfu kh\u00f4ng, h\u00e3y th\u1eed c\u00e1c \u0111i\u1ec3m sau \u0111\u1ec3 kh\u1eafc ph\u1ee5c s\u1ef1 c\u1ed1:<\/p>\n\n\n\n<ul><li class=\"\">C\u00e1c c\u1ed5ng c\u1ea7n thi\u1ebft c\u00f3 \u0111\u01b0\u1ee3c m\u1edf trong c\u00e0i \u0111\u1eb7t t\u01b0\u1eddng l\u1eeda c\u1ee7a m\u00e1y ch\u1ee7 (iptables ho\u1eb7c nh\u00f3m b\u1ea3o m\u1eadt \u0111\u00e1m m\u00e2y) kh\u00f4ng?<\/li><li class=\"\">URI, c\u1ed5ng v\u00e0 th\u00f4ng tin x\u00e1c th\u1ef1c c\u00f3 \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp ch\u00ednh x\u00e1c trong c\u00e0i \u0111\u1eb7t m\u00e1y ch\u1ee7 ICE ph\u00eda m\u00e1y kh\u00e1ch (\u0111\u01b0\u1ee3c m\u00f4 t\u1ea3 b\u00ean d\u01b0\u1edbi) kh\u00f4ng?<\/li><li class=\"\"><code>turnserver.conf<\/code>c\u1ee7a<code>v\u01b0\u01a1ng qu\u1ed1c<\/code>\u0110\u1ea3m b\u1ea3o c\u00e1c thi\u1ebft l\u1eadp kh\u1edbp v\u1edbi x\u00e1c th\u1ef1c m\u00e1y kh\u00e1ch. (Th\u00f4ng th\u01b0\u1eddng, \u0111\u00e2y kh\u00f4ng ph\u1ea3i l\u00e0 v\u1ea5n \u0111\u1ec1 trong phi\u00ean b\u1ea3n tr\u00ecnh duy\u1ec7t c\u1ee7a WebRTC, v\u00ec mi\u1ec1n \u0111\u01b0\u1ee3c t\u1ef1 \u0111\u1ed9ng ch\u1ec9 \u0111\u1ecbnh, nh\u01b0ng h\u00e3y c\u1ea9n th\u1eadn n\u1ebfu b\u1ea1n c\u00f3 tri\u1ec3n khai t\u00f9y ch\u1ec9nh.)<\/li><li class=\"\">nh\u1eadt k\u00fd coturn (<code>\/var\/log\/turnserver.log<\/code>) v\u00e0 ki\u1ec3m tra xem c\u00f3 l\u1ed7i x\u00e1c th\u1ef1c kh\u00f4ng (<code>NG\u01af\u1edcI D\u00d9NG SAI<\/code>N\u1ebfu c\u00f3 l\u1ed7i nh\u01b0 tr\u00ean th\u00ec t\u00ean ng\u01b0\u1eddi d\u00f9ng\/m\u1eadt kh\u1ea9u kh\u00f4ng kh\u1edbp.<\/li><\/ul>\n\n\n\n<p>V\u1edbi c\u00e1c thi\u1ebft l\u1eadp tr\u00ean, b\u1ea1n s\u1ebd c\u00f3 m\u00e1y ch\u1ee7 STUN\/TURN\/TURNS c\u1ee7a ri\u00eang m\u00ecnh v\u00e0 c\u00f3 th\u1ec3 h\u1ed7 tr\u1ee3 k\u1ebft n\u1ed1i WebRTC trong nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng m\u1ea1ng kh\u00e1c nhau.<\/p>\n\n\n\n<h2>V\u00ed d\u1ee5 v\u1ec1 c\u00e0i \u0111\u1eb7t m\u00e1y ch\u1ee7 ICE cho m\u00e1y kh\u00e1ch WebRTC (JavaScript)<\/h2>\n\n\n\n<p>\u0110\u1ec3 th\u1ef1c s\u1ef1 s\u1eed d\u1ee5ng m\u00e1y ch\u1ee7 STUN\/TURN m\u00e0 ch\u00fang t\u00f4i v\u1eeba x\u00e2y d\u1ef1ng tr\u00ean \u1ee9ng d\u1ee5ng WebRTC (tr\u00ecnh duy\u1ec7t),<strong>C\u00e0i \u0111\u1eb7t m\u00e1y ch\u1ee7 ICE<\/strong>Trong API WebRTC c\u1ee7a JavaScript,<code>K\u1ebft n\u1ed1i RTCPeer<\/code>B\u1ea1n c\u00f3 th\u1ec3 ch\u1ec9 \u0111\u1ecbnh danh s\u00e1ch c\u00e1c m\u00e1y ch\u1ee7 STUN\/TURN khi t\u1ea1o . Ti\u1ebfp theo, ch\u00fang t\u00f4i s\u1ebd tr\u00ecnh b\u00e0y m\u1ed9t v\u00ed d\u1ee5 m\u00e3 c\u1ee5 th\u1ec3 ch\u1ec9 \u0111\u1ecbnh t\u1ea5t c\u1ea3 c\u00e1c m\u00e1y ch\u1ee7 STUN\/TURN\/TURNS v\u00e0 gi\u1ea3i th\u00edch \u00fd ngh\u0129a c\u1ee7a n\u00f3.<\/p>\n\n\n\n<p>\u0110\u1ea7u ti\u00ean, t\u1ea1o \u0111\u1ed1i t\u01b0\u1ee3ng c\u1ea5u h\u00ecnh cho m\u00e1y ch\u1ee7 ICE. Nh\u1eadp t\u00ean mi\u1ec1n c\u1ee7a m\u00e1y ch\u1ee7 c\u1ee7a b\u1ea1n.<code>l\u01b0\u1ee3t.example.com<\/code>(Thay th\u1ebf khi th\u00edch h\u1ee3p). STUN kh\u00f4ng y\u00eau c\u1ea7u x\u00e1c th\u1ef1c, do \u0111\u00f3 ch\u1ec9 c\u1ea7n ch\u1ec9 \u0111\u1ecbnh URI. TURN\/TURNS y\u00eau c\u1ea7u x\u00e1c th\u1ef1c, do \u0111\u00f3 t\u00ean ng\u01b0\u1eddi d\u00f9ng v\u00e0 m\u1eadt kh\u1ea9u c\u0169ng \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh.<\/p>\n\n\n\n<div class=\"hcb_wrap\" data-no-translation=\"\"><pre class=\"prism line-numbers lang-js\" data-lang=\"JavaScript\"><code>const iceConfig = {\n  iceServers: [\n    \/\/ 1. STUN\u30b5\u30fc\u30d0\uff08UDP\/3478\uff09\n    { urls: &#39;stun:turn.example.com:3478&#39; },\n    \/\/ 2. TURN\u30b5\u30fc\u30d0\uff08UDP\/443\u7d4c\u7531\uff09\n    { urls: &#39;turn:turn.example.com:443?transport=udp&#39;, username: &#39;webrtcuser&#39;, credential: &#39;secretpass123&#39; },\n    \/\/ 3. TURN\u30b5\u30fc\u30d0\uff08TCP\/443 + TLS = TURNS\uff09\n    { urls: &#39;turns:turn.example.com:443&#39;, username: &#39;webrtcuser&#39;, credential: &#39;secretpass123&#39; }\n  ]\n};\nconst pc = new RTCPeerConnection(iceConfig);<\/code><\/pre><\/div>\n\n\n\n<p>Tr\u00ean \u0111\u00e2y<code>M\u00e1y ch\u1ee7 b\u0103ng<\/code>M\u1ea3ng n\u00e0y c\u00f3 ba m\u1ee5c.<\/p>\n\n\n\n<ol><li class=\"\"><strong>L\u00c0M CHO\u1eacN:<\/strong> <code>cho\u00e1ng:turn.example.com:3478<\/code><br>Ch\u1ec9 \u0111\u1ecbnh \u0111\u1ecba ch\u1ec9 m\u00e1y ch\u1ee7 STUN c\u1ee7a ri\u00eang b\u1ea1n (n\u1ebfu c\u1ed5ng b\u1ecb b\u1ecf qua, 3478 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng). STUN \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh NAT traversal v\u00e0 l\u1ea5y c\u00e1c \u1ee9ng vi\u00ean. Tr\u00ecnh duy\u1ec7t \u0111\u1ea7u ti\u00ean truy v\u1ea5n m\u00e1y ch\u1ee7 n\u00e0y qua UDP \u0111\u1ec3 l\u1ea5y c\u00e1c \u1ee9ng vi\u00ean Server Reflexive.<\/li><li class=\"\"><strong>L\u01af\u1ee2T (UDP):<\/strong> <code>l\u01b0\u1ee3t: l\u01b0\u1ee3t.example.com: 443? v\u1eadn chuy\u1ec3n = udp<\/code><br>M\u00e1y ch\u1ee7 TURN c\u1ee7a ri\u00eang b\u1ea1n<strong>C\u1ed5ng UDP 443<\/strong>\u0110\u00e2y l\u00e0 thi\u1ebft l\u1eadp \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng. T\u00ean ng\u01b0\u1eddi d\u00f9ng \u0111\u00e3 \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp trong coturn tr\u01b0\u1edbc \u0111\u00f3 l\u00e0m th\u00f4ng tin x\u00e1c th\u1ef1c<code>ng\u01b0\u1eddi d\u00f9ng webrtcuser<\/code>v\u00e0 m\u1eadt kh\u1ea9u<code>m\u1eadt kh\u1ea9u123<\/code>Tham s\u1ed1 truy v\u1ea5n \u0111\u00e3 \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh.<code>?v\u1eadn chuy\u1ec3n=udp<\/code>(N\u1ebfu kh\u00f4ng \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh, tr\u00ecnh duy\u1ec7t s\u1ebd th\u1eed UDP tr\u01b0\u1edbc, v\u00e0 n\u1ebfu kh\u00f4ng th\u00e0nh c\u00f4ng, s\u1ebd th\u1eed TCP.) V\u1edbi thi\u1ebft l\u1eadp n\u00e0y, ngay c\u1ea3 khi k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp s\u1eed d\u1ee5ng STUN th\u00f4ng th\u01b0\u1eddng kh\u00f4ng th\u00e0nh c\u00f4ng, b\u1ea1n v\u1eabn c\u00f3 th\u1ec3 nh\u1eadn \u0111\u01b0\u1ee3c \u1ee9ng vi\u00ean cho chuy\u1ec3n ti\u1ebfp TURN tr\u00ean c\u1ed5ng UDP 443.<\/li><li class=\"\"><strong>QUAY (TLS\/TCP):<\/strong> <code>l\u01b0\u1ee3t: l\u01b0\u1ee3t.example.com:443<\/code><br><strong>TURN v\u1edbi TLS<\/strong>\u0110\u00e2y l\u00e0 thi\u1ebft l\u1eadp cho m\u00e1y ch\u1ee7 TURNS. T\u00ean ng\u01b0\u1eddi d\u00f9ng v\u00e0 m\u1eadt kh\u1ea9u c\u0169ng \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh \u1edf \u0111\u00e2y. Tr\u00ecnh duy\u1ec7t s\u1ebd t\u1ea1o k\u1ebft n\u1ed1i TLS \u0111\u1ebfn m\u1ee5c n\u00e0y tr\u00ean c\u1ed5ng TCP 443 \u0111\u1ec3 l\u1ea5y \u1ee9ng vi\u00ean chuy\u1ec3n ti\u1ebfp TURN. \u0110\u00e2y l\u00e0 \u1ee9ng vi\u00ean chuy\u1ec3n ti\u1ebfp cu\u1ed1i c\u00f9ng v\u00e0 c\u00f3 kh\u1ea3 n\u0103ng thi\u1ebft l\u1eadp giao ti\u1ebfp ngay c\u1ea3 khi giao ti\u1ebfp qua UDP kh\u00f4ng th\u1ec3 th\u1ef1c hi\u1ec7n \u0111\u01b0\u1ee3c.<\/li><\/ol>\n\n\n\n<p><code>K\u1ebft n\u1ed1i RTCPeer<\/code>Khi t\u00e1c nh\u00e2n ICE t\u1ea1o m\u00e1y ch\u1ee7 ICE, n\u00f3 s\u1ebd c\u1ed1 g\u1eafng k\u1ebft n\u1ed1i v\u1edbi c\u00e1c m\u00e1y ch\u1ee7 ICE \u0111\u01b0\u1ee3c ch\u1ec9 \u0111\u1ecbnh theo th\u1ee9 t\u1ef1 v\u00e0 thu th\u1eadp c\u00e1c \u1ee9ng vi\u00ean. \u0110\u1ea7u ti\u00ean, t\u00e1c nh\u00e2n ICE s\u1ebd l\u1ea5y c\u00e1c \u1ee9ng vi\u00ean STUN (srflx), sau \u0111\u00f3 l\u1ea5y c\u00e1c \u1ee9ng vi\u00ean TURN (relay) song song. Sau \u0111\u00f3, thu\u1eadt to\u00e1n ICE s\u1ebd k\u1ebft h\u1ee3p c\u00e1c \u1ee9ng vi\u00ean n\u00e0y, th\u1ef1c hi\u1ec7n ki\u1ec3m tra k\u1ebft n\u1ed1i v\u00e0 ch\u1ecdn tuy\u1ebfn \u0111\u01b0\u1eddng t\u1ed1i \u01b0u. C\u00e1c nh\u00e0 ph\u00e1t tri\u1ec3n kh\u00f4ng c\u1ea7n ph\u1ea3i bi\u1ebft b\u1ea5t k\u1ef3 quy tr\u00ecnh n\u00e0o kh\u00e1c.<\/p>\n\n\n\n<p><strong>\u0111i\u1ec3m:<\/strong> Nh\u01b0 \u0111\u00e3 \u0111\u1ec1 c\u1eadp \u1edf tr\u00ean<strong>Chu\u1ea9n b\u1ecb nhi\u1ec1u \u1ee9ng vi\u00ean<\/strong>l\u00e0 quan tr\u1ecdng. V\u00ed d\u1ee5,<code>l\u00e0m cho\u00e1ng:<\/code>N\u1ebfu b\u1ea1n ch\u1ec9 \u0111\u1ecbnh TURN (UDP), s\u1ebd kh\u00f4ng t\u00ecm th\u1ea5y \u1ee9ng vi\u00ean n\u00e0o trong m\u00f4i tr\u01b0\u1eddng m\u00e0 UDP b\u1ecb ch\u1eb7n v\u00e0 k\u1ebft n\u1ed1i s\u1ebd kh\u00f4ng th\u00e0nh c\u00f4ng. T\u01b0\u01a1ng t\u1ef1, n\u1ebfu b\u1ea1n ch\u1ec9 \u0111\u1ecbnh TURN (UDP), k\u1ebft n\u1ed1i s\u1ebd kh\u00f4ng th\u00e0nh c\u00f4ng trong m\u00f4i tr\u01b0\u1eddng m\u00e0 ch\u1ec9 cho ph\u00e9p TCP. Do \u0111\u00f3, n\u1ebfu c\u00f3 th\u1ec3,<code>xoay:<\/code>V\u00e0<code>l\u01b0\u1ee3t:<\/code>B\u1eb1ng c\u00e1ch \u0111\u01b0a c\u1ea3 hai v\u00e0o m\u00e1y ch\u1ee7 ICE, t\u00ednh d\u1ef1 ph\u00f2ng \u0111\u1ea1t \u0111\u01b0\u1ee3c \u0111\u1ec3 c\u00f3 th\u1ec3 t\u00ecm th\u1ea5y \u00edt nh\u1ea5t m\u1ed9t \u1ee9ng vi\u00ean h\u1ee3p l\u1ec7 trong b\u1ea5t k\u1ef3 m\u00f4i tr\u01b0\u1eddng n\u00e0o (t\u1ea5t nhi\u00ean, m\u00e1y ch\u1ee7 TURN ph\u1ea3i h\u1ed7 tr\u1ee3 c\u1ea3 UDP v\u00e0 TCP\/TLS). M\u00e1y kh\u00e1ch (tr\u00ecnh duy\u1ec7t) t\u1ef1 \u0111\u1ed9ng ch\u1ecdn m\u1ed9t \u0111\u01b0\u1eddng d\u1eabn kh\u1ea3 d\u1ee5ng, do \u0111\u00f3 th\u1ee9 t\u1ef1 c\u1ee7a danh s\u00e1ch kh\u00f4ng ph\u1ea3i l\u00e0 v\u1ea5n \u0111\u1ec1 l\u1edbn. N\u1ebfu t\u00f4i ph\u1ea3i n\u00f3i,<code>iceTransportPolicy<\/code>c\u1ee7a<code>ti\u1ebfp s\u1ee9c<\/code>Tr\u1eeb khi b\u1ea1n ch\u1ec9 \u0111\u1ecbnh \u0111i\u1ec1u n\u00e0y, tr\u00ecnh duy\u1ec7t s\u1ebd \u01b0u ti\u00ean c\u00e1c k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp, v\u00ec v\u1eady n\u1ebfu b\u1ea1n nh\u1eadp m\u1ee5c STUN, b\u1ea1n c\u00f3 th\u1ec3 tr\u00e1nh s\u1eed d\u1ee5ng m\u00e1y ch\u1ee7 TURN m\u1ed9t c\u00e1ch kh\u00f4ng c\u1ea7n thi\u1ebft. Ngo\u00e0i ra, n\u1ebfu c\u00e1c m\u00e1y ch\u1ee7 kh\u00f4ng li\u00ean quan (\u0111\u1ecba ch\u1ec9 kh\u00f4ng t\u1ed3n t\u1ea1i, v.v.) \u0111\u01b0\u1ee3c nh\u1eadp v\u00e0o danh s\u00e1ch m\u00e1y ch\u1ee7 ICE, c\u00f3 th\u1ec3 x\u1ea3y ra s\u1ef1 ch\u1eadm tr\u1ec5 do ph\u1ea3i ch\u1edd h\u1ebft th\u1eddi gian ch\u1edd, v\u00ec v\u1eady t\u1ed1t nh\u1ea5t l\u00e0 ch\u1ec9 nh\u1eadp nh\u1eefng m\u00e1y ch\u1ee7 ch\u1eafc ch\u1eafn kh\u1ea3 d\u1ee5ng.<\/p>\n\n\n\n<p>Cu\u1ed1i c\u00f9ng, h\u00e3y ch\u1ea1y \u1ee9ng d\u1ee5ng WebRTC v\u1edbi thi\u1ebft l\u1eadp n\u00e0y v\u00e0 x\u00e1c minh tr\u1ea1ng th\u00e1i k\u1ebft n\u1ed1i.<code>peerConnection.getStats()<\/code>ho\u1eb7c<code>chrome:\/\/webrtc-internals<\/code>B\u1ea1n c\u00f3 th\u1ec3 ki\u1ec3m tra ICE Candidate v\u00e0 tr\u1ea1ng th\u00e1i k\u1ebft n\u1ed1i b\u1eb1ng (Chrome). N\u1ebfu ho\u1ea1t \u0111\u1ed9ng nh\u01b0 mong \u0111\u1ee3i, n\u00f3 s\u1ebd t\u1ef1 \u0111\u1ed9ng chuy\u1ec3n sang k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp (P2P) trong m\u00f4i tr\u01b0\u1eddng c\u00f3 UDP v\u00e0 k\u1ebft n\u1ed1i qua TURN\/TLS trong m\u00f4i tr\u01b0\u1eddng kh\u00f3 th\u1ef1c hi\u1ec7n.<\/p>\n\n\n\n<h2>S\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa SFU v\u00e0 TURN<\/h2>\n\n\n\n<p>Chuy\u1ec3n ti\u1ebfp WebRTC c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c chia th\u00e0nh &quot;TURN&quot; v\u00e0 &quot;SFU&quot;, nh\u01b0ng vai tr\u00f2, c\u1ea5u h\u00ecnh v\u00e0 c\u00e1ch s\u1eed d\u1ee5ng c\u1ee7a ch\u00fang kh\u00e1c nhau \u0111\u00e1ng k\u1ec3. Sau \u0111\u00e2y ch\u00fang t\u00f4i t\u00f3m t\u1eaft nh\u1eefng kh\u00e1c bi\u1ec7t v\u1ec1 m\u1eb7t k\u1ef9 thu\u1eadt.<\/p>\n\n\n\n<h3>TURN: Relay nh\u01b0 m\u1ed9t gi\u1ea3i ph\u00e1p thay th\u1ebf cho peer-to-peer<\/h3>\n\n\n\n<p>TURN (Traversal Using Relays around NAT) l\u00e0 m\u1ed9t m\u00e1y ch\u1ee7 chuy\u1ec3n ti\u1ebfp ph\u1ee5 tr\u1ee3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong c\u00e1c m\u00f4i tr\u01b0\u1eddng m\u00e0 giao ti\u1ebfp P2P WebRTC kh\u00f4ng th\u1ec3 th\u1ef1c hi\u1ec7n \u0111\u01b0\u1ee3c. M\u00e1y ch\u1ee7 TURN ho\u1ea1t \u0111\u1ed9ng gi\u1eefa c\u00e1c \u0111\u1ed1i t\u00e1c ngang h\u00e0ng v\u00e0 chuy\u1ec3n ti\u1ebfp c\u00e1c g\u00f3i tin khi STUN kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng do NAT ho\u1eb7c t\u01b0\u1eddng l\u1eeda. V\u00ec m\u1ed7i \u0111\u1ed1i t\u00e1c ngang h\u00e0ng g\u1eedi m\u1ed9t lu\u1ed3ng \u0111\u1ebfn t\u1eebng \u0111\u1ed1i t\u00e1c giao ti\u1ebfp ri\u00eang l\u1ebb, n\u00ean c\u1ea5u h\u00ecnh l\u00e0 d\u1ea1ng l\u01b0\u1edbi v\u00e0 TURN \u0111\u01b0\u1ee3c \u0111\u1ecbnh v\u1ecb l\u00e0 &quot;pinch hitter&quot;.<\/p>\n\n\n\n<ul><li><strong>th\u00e0nh ph\u1ea7n<\/strong>: M\u1ed7i ng\u01b0\u1eddi d\u00f9ng truy\u1ec1n \u0111\u1ebfn m\u1ecdi ng\u01b0\u1eddi d\u00f9ng kh\u00e1c th\u00f4ng qua m\u1ed9t r\u01a1le (th\u1ef1c t\u1ebf l\u00e0 m\u1ed9t m\u1ea1ng l\u01b0\u1edbi)<\/li><li><strong>Kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng<\/strong>: Th\u1ea5p (c\u00e0ng nhi\u1ec1u ng\u01b0\u1eddi th\u00ec t\u1ea3i c\u00e0ng cao)<\/li><li><strong>N\u1ed9i dung ph\u00e1t s\u00f3ng<\/strong>: Ch\u1ec9 truy\u1ec1n g\u00f3i tin \u0111\u01a1n gi\u1ea3n, kh\u00f4ng ph\u00e2n t\u00edch ph\u01b0\u01a1ng ti\u1ec7n ho\u1eb7c t\u1ed1i \u01b0u h\u00f3a<\/li><\/ul>\n\n\n\n<h3>SFU: Chuy\u1ec3n ti\u1ebfp hi\u1ec7u qu\u1ea3 cho c\u00e1c cu\u1ed9c g\u1ecdi nhi\u1ec1u b\u00ean<\/h3>\n\n\n\n<p>SFU (\u0110\u01a1n v\u1ecb chuy\u1ec3n ti\u1ebfp ch\u1ecdn l\u1ecdc) l\u00e0 m\u00e1y ch\u1ee7 chuy\u1ec3n ti\u1ebfp th\u00f4ng minh \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng trong c\u00e1c h\u1ed9i ngh\u1ecb web c\u00f3 nhi\u1ec1u ng\u01b0\u1eddi tham gia.<span class=\"swl-marker mark_blue\">M\u1ed7i m\u00e1y kh\u00e1ch g\u1eedi m\u1ed9t lu\u1ed3ng d\u1eef li\u1ec7u \u0111\u1ebfn SFU, sau \u0111\u00f3 SFU s\u1ebd chuy\u1ec3n ti\u1ebfp lu\u1ed3ng d\u1eef li\u1ec7u \u0111\u00f3 \u0111\u1ebfn nh\u1eefng ng\u01b0\u1eddi tham gia kh\u00e1c m\u1ed9t c\u00e1ch c\u00f3 ch\u1ecdn l\u1ecdc.<\/span>N\u00f3 c\u0169ng th\u1ef1c hi\u1ec7n c\u00e1c quy tr\u00ecnh nh\u01b0 ph\u00e1t hi\u1ec7n ng\u01b0\u1eddi n\u00f3i, \u0111i\u1ec1u ch\u1ec9nh ch\u1ea5t l\u01b0\u1ee3ng h\u00ecnh \u1ea3nh v\u00e0 t\u1ed1i \u01b0u h\u00f3a \u0111\u1ed9 tr\u1ec5, cho ph\u00e9p ph\u00e1t s\u00f3ng c\u00f3 kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng v\u00e0 hi\u1ec7u su\u1ea5t cao.<\/p>\n\n\n\n<ul><li><strong>th\u00e0nh ph\u1ea7n<\/strong>: Ki\u1ec3u sao trong \u0111\u00f3 m\u1ed7i m\u00e1y kh\u00e1ch \u0111\u01b0\u1ee3c k\u1ebft n\u1ed1i v\u1edbi m\u1ed9t SFU<\/li><li><strong>Kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng<\/strong>: \u0110\u1eaft ti\u1ec1n (ch\u1ec9 c\u00f3 m\u1ed9t l\u1ea7n truy\u1ec1n ngay c\u1ea3 khi s\u1ed1 l\u01b0\u1ee3ng ng\u01b0\u1eddi t\u0103ng l\u00ean)<\/li><li><strong>N\u1ed9i dung ph\u00e1t s\u00f3ng<\/strong>: C\u00f3 th\u1ec3 ki\u1ec3m so\u00e1t \u0111\u00edch truy\u1ec1n t\u1ea3i v\u00e0 t\u1ed1i \u01b0u h\u00f3a ph\u01b0\u01a1ng ti\u1ec7n<\/li><\/ul>\n\n\n\n<h3>B\u1ea3ng so s\u00e1nh gi\u1eefa TURN v\u00e0 SFU<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th>\u0110\u1eb7c tr\u01b0ng<\/th><th>XOAY<\/th><th>SFU<\/th><\/tr><tr><td>M\u1ee5c \u0111\u00edch<\/td><td>C\u00e1c gi\u1ea3i ph\u00e1p thay th\u1ebf khi kh\u00f4ng th\u1ec3 th\u1ef1c hi\u1ec7n NAT traversal<\/td><td>Giao ti\u1ebfp th\u1eddi gian th\u1ef1c gi\u1eefa nhi\u1ec1u ng\u01b0\u1eddi<\/td><\/tr><tr><td>C\u1ea5u h\u00ecnh truy\u1ec1n th\u00f4ng<\/td><td>L\u01b0\u1edbi (truy\u1ec1n cho nhau)<\/td><td>Ki\u1ec3u sao (m\u1ed9t truy\u1ec1n)<\/td><\/tr><tr><td>Ch\u1ee9c n\u0103ng r\u01a1le<\/td><td>R\u01a1 le \u0111\u01a1n gi\u1ea3n (trong su\u1ed1t)<\/td><td>Chuy\u1ec3n ti\u1ebfp v\u00e0 t\u1ed1i \u01b0u h\u00f3a c\u00f3 ch\u1ecdn l\u1ecdc c\u00f3 s\u1eb5n<\/td><\/tr><tr><td>Kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng<\/td><td>th\u1ea5p<\/td><td>\u0111\u1eaft<\/td><\/tr><tr><td>Ki\u1ec3m so\u00e1t ph\u01b0\u01a1ng ti\u1ec7n truy\u1ec1n th\u00f4ng<\/td><td>kh\u00f4ng c\u00f3<\/td><td>C\u00f3 (v\u00ed d\u1ee5: ph\u00e1t hi\u1ec7n loa, \u0111i\u1ec1u ch\u1ec9nh \u0111\u1ed9 ph\u00e2n gi\u1ea3i)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>TURN ch\u1ec9 l\u00e0 gi\u1ea3i ph\u00e1p cu\u1ed1i c\u00f9ng khi giao ti\u1ebfp P2P kh\u00f4ng kh\u1ea3 thi v\u00e0 l\u00e0 ph\u01b0\u01a1ng \u00e1n b\u1ed5 sung cho m\u1ea1ng l\u01b0\u1edbi P2P.<span class=\"swl-marker mark_blue\">SFU l\u00e0 m\u1ed9t ki\u1ebfn tr\u00fac chuy\u1ec3n ti\u1ebfp \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 c\u00f3 hi\u1ec7u qu\u1ea3 ngay t\u1eeb \u0111\u1ea7u cho c\u00e1c cu\u1ed9c g\u1ecdi nhi\u1ec1u b\u00ean.<\/span>V\u00ec hai kh\u00e1i ni\u1ec7m n\u00e0y c\u00f3 vai tr\u00f2 kh\u00e1c nhau v\u1ec1 c\u01a1 b\u1ea3n n\u00ean \u0111i\u1ec1u quan tr\u1ecdng l\u00e0 kh\u00f4ng \u0111\u01b0\u1ee3c nh\u1ea7m l\u1eabn ch\u00fang khi thi\u1ebft k\u1ebf.<\/p>\n\n\n\n<h2>b\u1ea3n t\u00f3m t\u1eaft<\/h2>\n\n\n\n<p>B\u00e0i vi\u1ebft n\u00e0y cung c\u1ea5p l\u1eddi gi\u1ea3i th\u00edch chi ti\u1ebft cho ng\u01b0\u1eddi d\u00f9ng WebRTC \u1edf tr\u00ecnh \u0111\u1ed9 trung c\u1ea5p \u0111\u1ebfn n\u00e2ng cao v\u1ec1 s\u1ef1 kh\u00e1c bi\u1ec7t k\u1ef9 thu\u1eadt gi\u1eefa STUN, TURN v\u00e0 TURNS, c\u0169ng nh\u01b0 th\u1eddi \u0111i\u1ec3m s\u1eed d\u1ee5ng ch\u00fang, c\u00e1ch x\u00e2y d\u1ef1ng m\u00e1y ch\u1ee7 b\u1eb1ng coturn v\u00e0 m\u1ed9t s\u1ed1 v\u00ed d\u1ee5 m\u00e3, c\u0169ng nh\u01b0 c\u00e1ch ICE ho\u1ea1t \u0111\u1ed9ng trong m\u00f4i tr\u01b0\u1eddng m\u1ea1ng kh\u1eafc nghi\u1ec7t.<\/p>\n\n\n\n<p><strong>l\u00e0m cho\u00e1ng v\u00e1ng<\/strong>N\u00f3 nh\u1eb9 v\u00e0 cho ph\u00e9p giao ti\u1ebfp tr\u1ef1c ti\u1ebfp trong m\u00f4i tr\u01b0\u1eddng NAT.<strong>XOAY<\/strong>cung c\u1ea5p \u0111\u01b0\u1eddng d\u00e2y li\u00ean l\u1ea1c trong nh\u1eefng t\u00ecnh hu\u1ed1ng kh\u00f3 kh\u0103n; v\u00e0<strong>L\u01b0\u1ee3t quay<\/strong>B\u1eb1ng c\u00e1ch k\u1ebft h\u1ee3p nh\u1eefng \u0111i\u1ec1u n\u00e0y, ch\u00fang ta c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng WebRTC ngay c\u1ea3 trong nh\u1eefng m\u00f4i tr\u01b0\u1eddng \u0111\u1eb7c bi\u1ec7t nh\u01b0 trong m\u1ed9t c\u00f4ng ty.<\/p>\n\n\n\n<p>M\u1ed7i lo\u1ea1i \u0111\u1ec1u c\u00f3 \u01b0u v\u00e0 nh\u01b0\u1ee3c \u0111i\u1ec3m ri\u00eang, v\u00ec v\u1eady l\u00fd t\u01b0\u1edfng nh\u1ea5t l\u00e0 b\u1ea1n n\u00ean k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp v\u1edbi STUN b\u1ea5t c\u1ee9 khi n\u00e0o c\u00f3 th\u1ec3 v\u00e0 ch\u1ec9 s\u1eed d\u1ee5ng TURN relay khi th\u1ef1c s\u1ef1 c\u1ea7n thi\u1ebft. Trong qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng WebRTC th\u1ef1c t\u1ebf, b\u1eb1ng c\u00e1ch chu\u1ea9n b\u1ecb nhi\u1ec1u tuy\u1ebfn \u0111\u01b0\u1eddng trong c\u00e0i \u0111\u1eb7t m\u00e1y ch\u1ee7 ICE nh\u01b0 \u0111\u00e3 gi\u1edbi thi\u1ec7u \u1edf \u0111\u00e2y v\u00e0 b\u1eb1ng c\u00e1ch c\u1ea5u h\u00ecnh v\u00e0 v\u1eadn h\u00e0nh coturn \u0111\u00fang c\u00e1ch \u1edf ph\u00eda m\u00e1y ch\u1ee7, b\u1ea1n c\u00f3 th\u1ec3 cung c\u1ea5p giao ti\u1ebfp th\u1eddi gian th\u1ef1c \u1ed5n \u0111\u1ecbnh trong nhi\u1ec1u m\u00f4i tr\u01b0\u1eddng m\u1ea1ng kh\u00e1c nhau.<\/p>\n\n\n\n<p>WebRTC l\u00e0 m\u1ed9t l\u0129nh v\u1ef1c ph\u1ee9c t\u1ea1p k\u1ebft h\u1ee3p API tr\u00ecnh duy\u1ec7t v\u00e0 c\u00f4ng ngh\u1ec7 m\u1ea1ng, nh\u01b0ng vi\u1ec7c hi\u1ec3u c\u00e1ch STUN\/TURN v\u00e0 ICE ho\u1ea1t \u0111\u1ed9ng l\u00e0 \u0111i\u1ec1u c\u1ea7n thi\u1ebft \u0111\u1ec3 t\u1ea1o ra c\u00e1c \u1ee9ng d\u1ee5ng \u0111\u00e1ng tin c\u1eady.<\/p>\n\n\n\n<p>Ch\u00fang t\u00f4i hy v\u1ecdng b\u1ea1n s\u1ebd s\u1eed d\u1ee5ng th\u00f4ng tin trong b\u00e0i vi\u1ebft n\u00e0y \u0111\u1ec3 c\u1ed1 g\u1eafng v\u01b0\u1ee3t qua th\u00e1ch th\u1ee9c NAT traversal trong s\u1ea3n ph\u1ea9m c\u1ee7a ri\u00eang b\u1ea1n. B\u1eb1ng c\u00e1ch \u0111\u00f3, ng\u01b0\u1eddi d\u00f9ng c\u1ee7a b\u1ea1n s\u1ebd c\u00f3 th\u1ec3 t\u1eadn h\u01b0\u1edfng giao ti\u1ebfp li\u1ec1n m\u1ea1ch nh\u1edd x\u1eed l\u00fd k\u1ebft n\u1ed1i \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf kh\u00e9o l\u00e9o \u1edf ch\u1ebf \u0111\u1ed9 n\u1ec1n, th\u1eadm ch\u00ed kh\u00f4ng nh\u1eadn ra \u0111i\u1ec1u \u0111\u00f3.<\/p>","protected":false},"excerpt":{"rendered":"<p>WebRTC l\u00e0 g\u00ec? WebRTC (Web Real-Time Communication) l\u00e0 m\u1ed9t giao th\u1ee9c truy\u1ec1n th\u00f4ng th\u1eddi gian th\u1ef1c cho ph\u00e9p truy\u1ec1n th\u00f4ng th\u1eddi gian th\u1ef1c gi\u1eefa c\u00e1c tr\u00ecnh duy\u1ec7t.<\/p>","protected":false},"author":1,"featured_media":11871,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":""},"categories":[25,9,33],"tags":[],"_links":{"self":[{"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/posts\/11859"}],"collection":[{"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/comments?post=11859"}],"version-history":[{"count":8,"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/posts\/11859\/revisions"}],"predecessor-version":[{"id":11868,"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/posts\/11859\/revisions\/11868"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/media\/11871"}],"wp:attachment":[{"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/media?parent=11859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/categories?post=11859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chat-messenger.com\/vi\/wp-json\/wp\/v2\/tags?post=11859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}