Máy chủ TURN là một máy chủ của giao thức Traversal Using Relays around NAT, chuyển tiếp lưu lượng phương tiện giữa hai peer khi kết nối P2P trực tiếp không thể thực hiện được. Theo IETF RFC 5766, 2010, máy chủ TURN hoạt động như phương án dự phòng cuối cùng trong quá trình ICE của WebRTC, đảm bảo kết nối ngay cả với NAT Đối xứng và tường lửa doanh nghiệp.
Những điểm chính
Máy chủ TURN (Traversal Using Relays around NAT) là một dịch vụ mạng được định nghĩa trong RFC 5766 và cập nhật trong RFC 8656, chuyển tiếp lưu lượng UDP và TCP giữa hai client khi kết nối P2P trực tiếp không thể thực hiện được do các hạn chế NAT hoặc tường lửa. Trong kiến trúc WebRTC, máy chủ TURN hoạt động như cơ chế dự phòng cuối cùng, đảm bảo kết nối trong mọi điều kiện mạng.
Khác với STUN, chỉ đơn giản thông báo cho client về địa chỉ bên ngoài của nó, máy chủ TURN tham gia tích cực vào việc truyền dữ liệu. Mỗi peer thiết lập kết nối đến máy chủ TURN và gửi dữ liệu phương tiện của mình đến nó. Máy chủ TURN, đến lượt mình, chuyển tiếp dữ liệu này đến peer kia. Kết quả là không có kết nối trực tiếp giữa các peer — tất cả lưu lượng đều đi qua máy chủ chuyển tiếp, đảm bảo phân phối ngay cả dưới các hạn chế NAT nghiêm ngặt nhất.
TURN là một phần mở rộng của giao thức STUN. Các thông điệp TURN sử dụng cùng tiêu đề 20 byte và cơ chế thuộc tính. Sự khác biệt chính là TURN định nghĩa các loại thông điệp mới (Allocate, Refresh, Send, Data, CreatePermission, ChannelBind) và các thuộc tính cần thiết để quản lý các phân bổ chuyển tiếp. Client tạo một phân bổ trên máy chủ TURN qua thông điệp Allocate, nhận địa chỉ vận chuyển được chuyển tiếp (relayed transport address) và sử dụng nó để gửi và nhận dữ liệu qua máy chủ.
Máy chủ TURN hoạt động theo trình tự các bước sau. Client gửi Yêu cầu Allocate với xác thực (username, credential). Máy chủ xác minh thông tin xác thực và tạo một phân bổ — một liên kết tạm thời của một địa chỉ được chuyển tiếp (IP:cổng trên máy chủ TURN) với client. Máy chủ trả về Phản hồi Allocate với địa chỉ vận chuyển được chuyển tiếp — địa chỉ mà các peer khác sẽ sử dụng để gửi dữ liệu đến client này qua máy chủ TURN.
Sau khi phân bổ được tạo, client có thể gửi dữ liệu qua máy chủ TURN bằng cách sử dụng thông điệp Send Indication hoặc qua các kênh (ChannelBind). Khi nhận dữ liệu từ client, máy chủ TURN kiểm tra quyền (cho phép gửi dữ liệu đến các peer cụ thể) và chuyển tiếp dữ liệu đến peer mục tiêu. Để nhận dữ liệu đến, client phải tạo trước một quyền cho peer mà nó mong đợi dữ liệu; nếu không, máy chủ TURN sẽ loại bỏ gói đến. Quyền được tạo qua thông điệp CreatePermission chỉ rõ địa chỉ IP của peer.
Một phân bổ trên máy chủ TURN có thời gian sống giới hạn — mặc định là 10 phút. Client phải định kỳ gửi Yêu cầu Refresh để gia hạn phân bổ. Thời gian sống được chỉ định bằng giây trong thuộc tính LIFETIME. Nếu không nhận được Refresh, máy chủ sẽ xóa phân bổ và giải phóng địa chỉ được chuyển tiếp. Khoảng thời gian làm mới được khuyến nghị — 5 phút (300 giây) để phòng ngừa mất gói Refresh.
Trong WebRTC, máy chủ TURN được cấu hình qua cấu hình RTCPeerConnection trong mảng iceServers. Các máy chủ TURN có thể sử dụng giao thức vận chuyển UDP, TCP hoặc TLS. Xác thực thường sử dụng thông tin xác thực giới hạn thời gian (thông tin xác thực TURN) được tạo trên máy chủ ứng dụng với thời hạn hiệu lực giới hạn.
Hãy xem xét một ví dụ về cấu hình máy chủ TURN trong JavaScript với xác thực bằng token HMAC-SHA1.
async function createPeerConnection(turnServerUrl) {
const credentials = await fetchTurnCredentials();
const config = {
iceServers: [
{
urls: "stun:stun.l.google.com:19302"
},
{
urls: turnServerUrl,
username: credentials.username,
credential: credentials.credential
}
],
iceTransportPolicy: "all"
};
return new RTCPeerConnection(config);
}
async function fetchTurnCredentials() {
const response = await fetch("/api/turn-credentials");
return response.json();
}
const turnUrl = "turn:turn.example.com:3478";
const pc = await createPeerConnection(turnUrl);
Trong ví dụ này, máy chủ TURN được chỉ định cùng với máy chủ STUN trong một cấu hình ICE duy nhất. Quá trình ICE trước tiên cố gắng sử dụng các ứng cử viên host và các ứng cử viên srflx thu được từ STUN. Nếu kết nối trực tiếp thất bại, ICE tự động chuyển sang ứng cử viên relay thu được từ máy chủ TURN. Tham số iceTransportPolicy: "all" bật các ứng cử viên relay — giá trị thay thế "relay" vô hiệu hóa tất cả các ứng cử viên ngoại trừ TURN, hữu ích cho việc kiểm thử.
Để ngăn chặn sử dụng trái phép, máy chủ TURN yêu cầu xác thực. Phương pháp tiêu chuẩn là thông tin xác thực giới hạn thời gian được tạo trên máy chủ ứng dụng bằng HMAC-SHA1. Máy chủ ứng dụng mã hóa tên người dùng với khóa bí mật của máy chủ TURN và trả về username và credential cho client. Client chuyển chúng vào cấu hình RTCPeerConnection, và trình duyệt sử dụng chúng khi tạo phân bổ trên máy chủ TURN. Khi thông tin xác thực hết hạn, client nhận được thông tin mới từ máy chủ ứng dụng.
TURN và STUN giải quyết các tác vụ vượt NAT liên quan nhưng khác nhau cơ bản về cơ chế và chi phí. TURN chuyển tiếp lưu lượng, đóng vai trò trung gian, trong khi STUN chỉ giúp xác định địa chỉ bên ngoài cho kết nối P2P trực tiếp. Việc lựa chọn giữa chúng phụ thuộc vào loại NAT của peer và yêu cầu về hiệu suất.
| Tiêu chí | STUN | TURN |
|---|---|---|
| Cơ chế | Khám phá địa chỉ bên ngoài | Chuyển tiếp lưu lượng |
| Kết nối | P2P trực tiếp | Qua máy chủ chuyển tiếp |
| Độ trễ | Tối thiểu (đường trực tiếp) | Bổ sung (qua bộ chuyển tiếp) |
| Tải máy chủ | Chỉ các yêu cầu ban đầu | Chuyển tiếp lưu lượng liên tục |
| Chi phí | Thấp (vài yêu cầu) | Cao (lưu lượng máy chủ) |
| Hỗ trợ NAT Đối xứng | Không | Có |
| Băng thông | Chỉ giới hạn bởi kênh P2P | Giới hạn bởi kênh máy chủ |
Trong thực tế, máy chủ TURN chỉ được sử dụng cho các kết nối mà P2P không thể thực hiện được. Theo Google (thống kê WebRTC, 2023), khoảng 15–20% tất cả các kết nối WebRTC yêu cầu chuyển tiếp TURN. 80–85% còn lại thiết lập kết nối qua STUN hoặc các ứng cử viên host cục bộ. Khi thiết kế ứng dụng, bạn nên dự trù ngân sách cho lưu lượng TURN ở mức 15–20% tổng khối lượng phương tiện nếu khán giả của bạn bao gồm người dùng từ mạng doanh nghiệp và các khu vực có hạn chế NAT nghiêm ngặt.
Máy chủ TURN tiêu thụ tài nguyên đáng kể vì tất cả lưu lượng phương tiện đều đi qua nó. Mỗi cuộc gọi đang hoạt động với chuyển tiếp TURN sử dụng băng thông máy chủ bằng tổng thông lượng lưu lượng phương tiện (luồng vào + ra). Đối với cuộc gọi video HD (720p), con số này có thể là 1,5–2,5 Mbps cho mỗi kết nối theo mỗi hướng, tổng cộng 3–5 Mbps lưu lượng tổng thể qua máy chủ TURN.
Có một số lựa chọn triển khai cho cơ sở hạ tầng TURN. Các máy chủ TURN công cộng miễn phí không được khuyến nghị cho môi trường sản xuất do thiếu đảm bảo chất lượng và bảo mật. Các nhà cung cấp thương mại (Twilio Network Traversal Service, Xirsys, Metered) cung cấp TURN như một dịch vụ với giá trên mỗi gigabyte — chi phí điển hình là 0,005–0,02 $ mỗi gigabyte. Tự lưu trữ với coturn (máy chủ TURN mã nguồn mở) yêu cầu một máy chủ có dung lượng băng thông đủ và thiết lập giám sát.
Khi chọn giải pháp máy chủ TURN, hãy xem xét vị trí địa lý người dùng, chi phí lưu lượng và yêu cầu bảo mật. Đối với các ứng dụng có hàng nghìn cuộc gọi đồng thời, coturn tự lưu trữ trên các máy chủ có kênh rộng (1+ Gbps) có thể tiết kiệm chi phí hơn so với các nhà cung cấp thương mại. Đối với các dự án nhỏ với hàng chục người dùng, các dịch vụ TURN thương mại được ưu tiên hơn do không có chi phí quản trị và giám sát.
Câu hỏi thường gặp
Máy chủ TURN là một trung gian chuyển tiếp dữ liệu giữa những người dùng khi họ không thể kết nối trực tiếp. Nếu hai máy tính ở phía sau bộ định tuyến không cho phép kết nối trực tiếp, máy chủ TURN sẽ nhận dữ liệu từ một máy và gửi đến máy kia.
Máy chủ TURN được yêu cầu khi cả hai người tham gia cuộc gọi WebRTC ở phía sau NAT Đối xứng hoặc tường lửa doanh nghiệp chặn lưu lượng P2P. Trong những trường hợp này, STUN không thể giúp được và quá trình ICE tự động chuyển sang ứng cử viên relay thu được từ máy chủ TURN.
STUN đơn giản hiển thị cho máy tính địa chỉ bên ngoài của nó để kết nối trực tiếp. TURN chủ động chuyển tiếp lưu lượng qua chính nó. STUN không tạo tải cho máy chủ, trong khi TURN tiêu thụ băng thông. STUN chỉ hoạt động với một số loại NAT nhất định; TURN luôn hoạt động nhưng tốn kém hơn.
Chi phí của máy chủ TURN phụ thuộc vào nhà cung cấp và khối lượng lưu lượng. Twilio tính phí khoảng 0,005–0,01 $ cho mỗi GB lưu lượng được chuyển tiếp qua TURN. Xirsys tính phí từ 0,007 $ cho mỗi GB. Tự lưu trữ coturn yêu cầu một máy chủ có băng thông ít nhất 100 Mbps, chi phí phụ thuộc vào nhà cung cấp dịch vụ lưu trữ.
Máy chủ TURN của riêng bạn có thể được thiết lập bằng coturn (mã nguồn mở). Quá trình cài đặt bao gồm cấu hình cổng, xác thực (khóa bí mật chia sẻ), chứng chỉ TLS và tường lửa. Tệp cấu hình cơ bản chứa các tham số cho listening-port, realm, user và fingerprint. Sau khi thiết lập, máy chủ được chỉ định trong iceServers của WebRTC với tiền tố turn: hoặc turns: cho TLS.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm