Turbo Codes are a large category of code where, as in conventional codes, channel time is divided into small equal sized chunks (called bauds) and signal strength is, for each baud, one of two values.
In turbo codes the receiver achieves synchronicity somehow but decodes the gamut of signal strengths into more than two levels.
Typically 2 or 3 bits are derived for each baud of the signal.
Assuming that noise is Gaussian lets one improve the channel capacity by using this extra information.
(Low density parity checked codes achieve the same theoretical performance.
Both assume Gaussian noise.)
The transmitter produces a redundant stream of bits into the channel and the receiver typically (always?) first creates a candidate decoding from the high bits of the respective bauds.
If this does not produce one of the valid code words then the lower order bits can be consulted to find a better code word.