Error Correction Codes for real-time streaming communication are fundamentally different from classical block codes. The transmitter must encode the source stream sequentially, and the receiver must also decode the source symbols in a sequential fashion. We present both the fundamental limits and explicit construction of streaming codes over erasure channels. We show that under delay constraints the structural properties for burst-error correction and isolated-error correction are different. We propose a construction that simultaneously corrects both burst and isolated erasures, and achieves a near optimal rate. Our codes are based on a layering principle, which is found useful in several generalizations. Our simulation results indicate significant performance gains over baseline codes.