先にも書きましたが、USC-4では各オクテットをそれぞれ「群」、次の8ビットを「面」、その次の8ビットを「区」、最後の8ビットを「点」と呼びます。群はMSBをオフにするため128のコードポイント、そして面・区・点には256のコードポイントがあります。このうち、0群0面をBMPと呼びます。UCS-2の範囲はUCS-4でも同じですから、UCS-2は0群0面の区点と考えることができます。つまり、UCS-4でU+0000XXYYと表現できる文字ははUCS-2ではU+XXYYとして考えることができるわけです。
ところで、UCS-2では256×256=65536のコードポイントがありますが実際には65536すべてに文字を割り当てているわけではありません。これらのうち、U+D800〜U+DBFFまでの1024とU+DC00〜U+DFFFまでの1024は、それぞれサロゲート領域1/サロゲート領域2として予約されています。
UTF-16は1文字を2バイト単位の固まり1または2個で構成します。USC-2に収容される文字についてはそのままのコードがUTF-16でも適用されますので2バイトで1文字を表現します。
UCS-2に収まらなかった文字をUTF-16でどのように表現するのかというと、2バイトの固まりを2つ並べて4バイトで1文字を構成して表現します。最初の2バイトの固まりにはサロゲート領域1を、次の2バイトの固まりにはサロゲート領域2を使い4バイトで1文字を構成するわけです。

UTF-16ではサロゲート領域を利用することで、1024×1024でUCS-4の0群16面までを表現することが可能になります。
UTF-16では2バイトもしくは4バイトを1文字として扱うということがわかりましたが、コンピュータで複数バイトを扱う際に気をつけなければいけない問題が1つあります。それがエンディアンです。エンディアンとは、CPUのアーキテクチャに依存します。すなわち、複数バイトのデータをメモリ上にどのように配置するかという方式のことです。大まかにモトローラ系とインテル系に大別できますが、前者がビッグエンディアン方式、後者がリトルエンディアン方式ということになります。
例をWikipediaから引用してみると、
例えば16進数で 0x1234ABCD という4バイトのデータを、データの上位バイトからメモリに「12 34 AB CD」と並べる方式をビッグエンディアン (big endian)、データの下位バイトから「CD AB 34 12」と並べる方式をリトルエンディアン (little endian) という。
つまり、同じデータであっても格納されるバイト列には違いがあるわけです。Unicodeでは両方のエンディアンを認めています。ビッグエンディアンのUTF-16をUTF-16BE、リトルエンディアンのUTF-16をUTF-16LEと呼びます。
ところで、上記のようにUnicodeでは両者のエンディアンが認められているということはデータ交換の際はあるUnicodeデータがどのエンディアンでエンコードされたのかを知る必要がありますが、この目的のため導入されたのがBOMです。
つまり、ファイルの先頭にU+feffの文字を付加してこの並びを判定しようという考えです。ビッグエンディアンでは「fe ff」のまま、リトルエンディアンでは「ff ef」となりますので容易に判定ができるというわけです。(当然ながらU+ffefという文字は使用禁止になっています)
ただし、BOMは必ずしも必須というわけではなく省略することもできますがその場合はビッグエンディアンであるというように規定されています。(ややこしいのですが、これはUTF-16の場合であってUTF-16LEの場合はBOMなしでもリトルエンディアンということになります。じゃあ、UTF-16とUTF-16LEはどう判定するんだ?という疑問が残ります。)