Partiamo dal concetto che quel che l'utente vede deve essere sempre e solamente UNA pagina, che poi può essere concettualmente divisa in più sezioni. Quindi niente frame, che è ormai risaputo, che creano solo problemi sia di navigaizone all'utente che di mantenimento per il webmaster.

Ci sono diverse soluzioni che puoi applicare.

Innanzitutto le SSI (server side include). Crei delle finte "pagine" contenenti solo la porzione di html che ti serve ripetere in tutte le pagine del tuo sito, e poi le includi nelle pagine vere e proprie nei punti in cui devono apparire. Puoi realizzarlo con tutti i linguaggi lato server nonchè con file html statici aventi l'estensione .shtml

Un'altra soluzione, meno accessibile, è quella di usare AJAX per caricare, al click dei link, solo la porzione di pagina che vuoi che cambi. Dico meno accessibile perchè questa soluzione funziona solo con javascript abilitato, quindi se dovessi adottarla dovresti cercare di pensare anche a un blocco di codice <noscript> che permetta all'utente di navigare il sito qualora il suo browser non supporti javascript.

Infine se lavori in asp.net ci sono le masterpages, che sono simile alle SSI ma funzionano "alla rovescia" nel senso che crei una masterpage contenente tutte le parti comuni (header, menu, ecc) e poi decidi i punti in cui verranno caricati i contenuti variabili, che risiederanno nelle vere e proprie "pagine" del sito, che faranno riferimento alla masterpage tramite un'istruzione apposita.

Ciao