Turbo codes provide reliable communication at high data rates by combining concepts from block and convolutional codes. They use two convolutional encoders separated by an interleaver, producing redundant parity bits. During iterative decoding, probabilistic information from the first decoder is used as a priori information for the second decoder, and vice versa, improving the estimates of the transmitted bits at each iteration. Turbo codes achieve performance close to the theoretical channel capacity limit with low error rates. They have applications in deep space communications, mobile wireless systems, and other areas requiring high reliability transmission.