Observed communication semantics provide an intuitive notion of equivalence for communicating programs. We give the first observed communication semantics for a session-typed programming language with general recursion. This language, Polarized SILL, also supports channel and code transmission, synchronous and asynchronous communication, and functional programming. We present a framework inspired by testing preorders for defining simulations based on observed communications. We show that the "external" simulations coincide with barbed precongruence. Polarized SILL is defined using a multiset-rewriting-style substructural operational semantics. To ensure that our observed communication semantics is well-defined, we introduce fairness for multiset rewriting systems. We construct a fair scheduler and we give sufficient conditions for traces to be fair.