 that can be decoded with feasible complexity and quickly enough. Two revolutionary developments in the 1990s (Turbo and LDPC codes) now make it possible to achieve very nearly the theoretical channel capacity. Types of ECC There are two main types of ECC: block coding and convolutional coding. In block coding, the input is divided into blocks of k digits. The coder then produces a block of n digits for transmission, and the code is described as an (n,k) code. Each block is coded and decoded entirely separately from all other blocks. In convolutional coding, the coder input and output are continuous streams of digits. The coder outputs n output digits for every k digits input, and the code is described as a rate-k/n code. If the input digits are included unmodified in the coder output, the code is described as systematic. The additional digits introduced by the coder are then known as parity or check digits. As well as the conceptual attractiveness of systematic codes, they have the advantage that a range of decoder complexities is made possible. The simplest decoder can simply extract the unmodified input digits from the coded digit stream, ignoring the parity digits. A more sophisticated decoder can use the parity digits for error detection and a full decoder for error correction. Unsystematic codes also exist, but they are less commonly used. Forward and Feedback Error Correction In Forward Error Correction (FEC) the decoder applies error correction to the received codeword, and it can also detect some errors that it cannot correct. However, no return path from the receiver to the sender is assumed. Either block or convolutional codes can be used for FEC. In feedback error correction, for which only block codes can be used, the receiver only attempts to detect errors and sends return messages to the sender, which cause repeat transmission if any errors are detected in a received block. In the OSI model for packet data networks, this function is carried out within the data link layer by the return to the sender