Conceptually, an application has zero or more ns3::Socket objects associated with it, that are created using the Socket creation API of the Kernel capability. The Socket object API is modeled after the well-known BSD sockets interface, although it is somewhat simplified for use with ns3. Further, any socket call that would normally "block" in normal sockets will return immediately in ns3. A set of "upcalls" are defined that will be called when the previous blocking call would normally exit. THis is documented in more detail Socket class in socket.h.
The main purpose of the base class application public API is to provide a uniform way to start and stop applications.