**STUN** (Session Traversal Utilities for NAT) là một giao thức mạng cho phép các máy khách tìm ra địa chỉ công khai của mình, loại NAT mà chúng đang đứng sau và cổng phía Internet được NAT gắn liền với cổng nội bộ nào đó. Thông tin này được sử dụng để thiết lập giao tiếp UDP giữa 2 host mà đều nằm sau NAT router. Giao thức STUN được định nghĩa trong RFC 5389.

Tổng quan về giao thức
----------------------

STUN là một giao thức client-server. Một VoIP phone hay một phần mềm bao gồm 1 STUN client, STUN client sẽ gửi yêu cầu đến STUN server. Server sau đó sẽ gửi trả cho STUN client thông tin về địa chỉ IP công khai của NAT router, và NAT mở cổng nào để cho phép thông tin quay lại mạng.
Thông tin phản hồi từ server cũng cho phép STUN client xác định được loại NAT nào đang được sử dụng, vì các kiểu NAT khác nhau sẽ cần cách quản lý gói tin UDP đến khác nhau. Hệ thống này làm việc được với 3 trong bốn loại NAT: Full Cone, Restricted Cone, và Port Restricted Cone. Trong trường hợp Restricted Cone hay Port Restricted Cone, client phải gửi ra 1 gói tin cho điểm cuối trước khi NAT cho phép gói tin từ điểm cuối trở lại client. STUN không hoạt động được với Symmetric NAT (còn có tên bi-directional NAT), loại NAT này thường được sử dụng trong mạng của các công ty lớn. Với Symmetric NAT, địa chỉ IP của STUN server đối với client khác đối với điểm cuối. Và vì vậy, bản đồ NAT mà STUN server thấy khác với bản đồ mà điểm cuối sử dụng để gửi gói tin cho client.

Khi 1 client tìm ra được địa chỉ ngoài (external) của nó, nó sẽ truyền thông tin này cho những peer khác. Nếu NAT là Full-Cone thì bên nào cũng có thể bắt đầu việc giao tiếp. Nếu là Restricted Cone hay Port Restricted Cone thì cả hai bên phải bắt đầu truyền thông tin cho nhau.

Sử dụng kỹ thuật được mô tả trong STUN RFC không cần sử dụng giao thức STUN. Nó có thể được sử dụng trong thiết kế của giao thức UDP.

Giao thức như SIP sử dụng gói tin UDP để truyền tín hiệu âm thanh/hình ảnh/text trên Internet. Không may nếu cả hai điểm cuối đều nằm sau NAT thì không thể thiết lập kết nối theo cách thông thường. Đó là lý do vì sao cần đến STUN.

Máy chủ STUN được giao tiếp qua cổng UDP 3478, tuy nhiên máy chủ cũng sẽ gợi ý cho các máy khách thử kết nối với IP và số cổng khác (máy chủ STUN có hai địa chỉ IP). Chuẩn RFC quy định rằng cổng này và địa chỉ IP là tùy ý.

Thuật toán
----------

STUN sử dụng thuật toán sau (trích từ RFC 3489) để nhận ra sự có mặt của gateway và firewall NAT (**chú ý**: thuật toán này đã không còn được sử dụng do hiệu quả thấp và chỉ áp dụng với một vài loại NAT routers nhất định. Xem thêm: RFC 5389):

Nếu đường đi kết thúc ở một ô màu đỏ, tức là không thể giao tiếp bằng UDP. Nếu đường đi kết thúc ở một ô màu vàng hay xanh, việc giao tiếp có thể thực hiện.

Thay đổi trong phiên bản mới của STUN (STUN-bis)
------------------------------------------------

Giao thức STUN được sửa đổi tháng 10 năm 2008 với phiên bản RFC5389, với một số thay đổi đáng chú ý như: 

* Thay tên đầy đủ từ "Simple Traversal of UDP through NATs" sang "Session Traversal Utilities for NAT". Thay đổi này có ý đồ đánh dấu sự giáng cấp giao thức STUN. Từ một giải pháp hoàn chỉnh, STUN chỉ còn là một chuỗi các công cụ và cơ chế vượt tường NAT, có thể được sử dụng bởi các giao thức khác. Giao thức hoàn chỉnh nhất hiện thời là ICE, giải pháp trong đó có sử dụng đến STUN.
* Thuật toán tìm ra loại NAT cần vượt bị gỡ bỏ khỏi STUN. Cùng bị xóa sổ là một số thuộc tính (attribute) liên quan đến thuật toán, điển hình như: RESPONSE-ADDRESS, CHANGE-REQUEST, SOURCE-ADDRESS, CHANGED-ADDRESS, REFLECTED-FROM, and MAGIC-COOKIE. Thay vào đó những thuộc tính mới được đưa vào giao thức.
* STUN có thêm tính năng xác thực các gói dữ liệu yêu cầu và hồi đáp STUN với chứng chỉ ngắn hạn hoặc dài hạn.

Tham khảo
---------

RFC 3489 (đã lỗi thời)

RFC 5389

UDP Hole Punching

Vượt tường NAT