@startuml skinparam shadowing false title Player: one session per client address actor "Player\n1.2.3.4:5555" as player participant "etrelay\nfront :27960" as relay participant "session task\n(ephemeral socket)" as session participant "ET server" as et player -> relay : getchallenge / connect / game packets relay -> session : first packet: open session session -> et : forward (source = ephemeral port) et --> session : reply session --> player : reply sent from front:27960 ...packets both ways, deadline pushed back on each packet... ...2 min without any packet... session -> session : close (socket dropped) note over relay : next packet from 1.2.3.4:5555\nopens a new session @enduml