Error Control Coding
Error control coding (ECC) is the coding procedure done to control the occurrences of errors. These techniques help in Error Detection and Error Correction. There are many different error correcting codes depending upon the mathematical principles applied to them.  For free-space optics, ECC grants redundancy in laser uplink. The primary technique used for ECC is forward error correction (FEC), which partially mitigates the losses incurred from atmospheric turbulence.
Forward Error Correction (FEC)
FEC, simply, is error protection through redundancy. The transmitter sends a message with an limited number of extra redundant information already present in the signal. Once the signal is received, the receiver will use those redundancies to fix the holes in the information stream. FEC decreases the chance of the receiver having to request re-transmission of a signal, which will delay operations considerably. For example, if a satellite orbiting Uranus sends a re-transmission request, the information uplink delay can be as long as 5 hours.  As such, FEC is implemented primarily when transmission is costly.
However, FEC is not without its drawbacks. FEC is limited to a certain number of encoded error redundancies per signal. If the signal contains too many errors when it is received, it may be impossible to reconstruct even with the FEC redundancies. Also, since redundant information is being sent along with the actual signal, FEC also requires higher transmitter bandwidth, which increases the cost of transmitting information.
Low-Density Parity-Check (LDPC)
LDPC codes are a subsection of FEC that deal with two complicated problems: How do receivers correct errors in enormously long information streams? How do receivers solve so many complicated bit-matching equations? First, the receiver looks for a parity check, which is a bit tacked on to the end of a binary string that ensures the total number of 1s in the string is even or odd.  The parity bits become more numerous if the possibility of errors in the code increases; in this way, parity bits are a safeguard against bit erasure in the data string. Thus, multiple parity bits are used for one string of binary code to prevent complete data loss if there are too many bit errors.
In long strings of code, parity bits can end up densely cluttered. This causes too much redundancy, increasing the computation power needed for the receiver to rebuild the data stream. The solution is to limit the length of code a parity bit can safeguard. Rather than safeguarding a 128-bit binary string, for example, have the parity bit safeguard a 32-bit string. In this way, the parity bits become low-density. This is where the name low-density parity-check originates.
LDPC codes are used extensively in RF communication and have begun to make their way into optical fibers and free-space optics. The coding algorithm is very important for a topic like coherent optical orthogonal frequency division multiplexing (CO-OFDM), an incredibly resilient and efficient technology capable of 1 Tb/s data rates. 
Orthogonal Frequency Division Multiplexing
Wavelength Division Multiplexing
Paper: Comparative Study on Low-Rate Forward Error Correction Codes in Downlink Satellite-to-Ground Laser Communications
Paper: High-Rate Error-Correction Codes for the Optical Atmospheric Channel
Website: Basics of Error Control Codes
NPTEL – Error Control Coding (Conventional) (Linear code block)