Steamworks API предлагает специальный слой абстракции сети -
Steam Networking.
В рамках этого слоя соединение устанавливается между конкретными пользователями по их Steam идентификаторам. Тип соединения между пользователями зависит от конкретных настроек сети. При соединении в открытой сети или в присутствии несимметричного NAT соединение между хостами пользователей будет установлено напрямую. В случае присутствия симметричного NAT соединение будет установлено через специальный Relay-сервер. Steam берет на себя всю рутину с определением типа сети, выбором типа соединения и с его поддержкой во время сеанса игры.
Сама техника определения соединения и установки подключения является широко известной и общепринятой. Это -
NAT Punchtrough. Описывать технологию в ответе бессмысленно, т.к. в сети по этому названию есть очень много документов [
1][
2][
3][
4].
Для определения типа сети у Steam есть набор региональных
STUN-серверов, а так же набор Relay-серверов, выступающих посредниками при соединении в присутствии
симметричного NAT.
Примерно в прошлом году Valve начали выделять Steam Networking в отдельный
продукт с открытым кодом. Продукт явно будет лишен поддержки серверов Steam, однако его открытый код уже сейчас содержит достаточно информации об организации сети подобного уровня.