In all serverless (not including ICE/STUN) implementations of WebRTC, that create a data connection, I've always noticed that the flow is:
What I don't understand is why do we need the second step? In desktop apps, the first step is enough, even if there's a NAT (due to STUN servers). Is this some WebRTC limitation? If so, why?
Besides ICE candidates, SDP contains information about codecs, tracks etc. Signaling server is needed as a channel to establish a connection between peers by exchanging such information.