在二出定襄的戰役中,翕侯趙信投降了匈奴,受到單于的重用。他經常給單于出謀劃策,認為匈奴在北方的自然環境中佔據優勢,以一望無垠的大沙漠作為天然屏障。他覺得漢朝軍隊一定無法越過這片沙漠,就算越過了也一定會耗盡體力,無法戰鬥。但他也許忘了,武帝是一位知疾不可為而為之的英武之君。
而武帝也恰恰猜到了趙信和單于的這點心思,於是和眾將軍商議道:「趙信和匈奴單于一定認為我不敢越過沙漠去發動進攻,所以他們在漠北的戒備不會很嚴密。我們何不趁此機會進行突襲?一定會大獲全勝。」將軍們都表示贊同。
於是,元狩四年(前119)春天,武帝下令,命大將軍衛青、驃騎將軍霍去病分別率領5萬名騎兵從兩個不同的方向進攻匈奴。除騎兵之外,還派了幾十萬名步兵以及運送物資的人緊隨其後,全力保障部隊的戰鬥力和供給。
大將軍衛青從定襄出塞,他的副將有:郎中令李廣任前將軍,太僕公孫賀任左將軍,主爵趙食其任右將軍,平陽侯曹襄任後將軍。這四位將軍統一聽從衛青的指揮。5萬騎兵浩浩蕩蕩向沙漠進發了。這時,沙漠另一邊的匈奴單于和他的謀臣趙信卻並不著急。趙信對單于說:「漢軍就算越過了沙漠,人和馬也一定筋疲力盡了,我們就在這兒等著坐收漢軍的俘虜就行了。」單于覺得有理,於是下令所有的精兵都等候在沙漠的北邊,只等著疲憊不堪的漢軍過來。
馬政戰國後期至漢代,是軍隊陸戰兵種構成發生歷史性變革的時代,以車兵、步兵為主體的兵種構成逐漸被以騎兵、步兵為主體的兵種構成所取代,騎兵成為軍隊中的主要突擊力量。從根本而言,這種變化的產生是由所面臨的軍事問題決定的。周邊諸民族,特別是北方匈奴,成為中原王朝的心腹之患。朝廷為了對付匈奴,開始創建騎兵部隊;而騎兵時代的來臨,則始於武帝反擊匈奴的戰爭。
馬政的推行,是建立強大騎兵軍隊的根本。一方面,統治者高度重視戰馬的飼養和繁殖,設立專門的「馬苑」,並對之進行嚴密防護;另一方面,統治者鼓勵民間養馬,嚴禁良馬出境,以防為敵人所用。至武帝即位之初,馬政已大有成效,「眾庶街巷有馬,阡陌之間成群」。武帝甚至不惜出動大量兵力徵討大宛,尋求品種優良的汗血馬,以改良馬種。這些正是漢朝騎兵部隊得以組建,並取得對匈奴作戰勝利的前提。
這時,衛青率領的部隊已經越過了沙漠,遠遠地觀察到單于列陣等候的士兵。於是,他命令軍隊馬上進入戰鬥狀態,把戰車排列成環形,派身強力壯、尚未感到疲憊的5000名騎兵去抵擋匈奴軍隊。匈奴軍隊也看到了漢朝的軍隊,於是命令一萬餘名騎兵朝漢軍衝去。這時已是黃昏,太陽馬上就要落山了,而天邊又恰好颳起了狂風。沙漠裡風的威力比平原地區大百倍,狂風卷著黃沙和石頭撲面而來,讓人睜不開眼睛。這下子,在沙漠中交戰的漢軍和匈奴軍隊都看不清楚對方了。
衛青沒有退縮,而是藉此機會派兩支分隊從左右兩翼夾擊匈奴,目標直指單于本人。本來單于聽了趙信的話,以為漢軍千裡迢迢越過沙漠,肯定早已沒有力氣打仗了,可沒想到衛青率領的漢軍依然這麼健壯、勇猛,絲毫沒有疲累的樣子,而且漢軍的人數多於自己,天氣又這麼惡劣。單于擔心這麼打下去會對自己不利,於是在天就要黑的時候乘著一輛6匹騾子拉的車,有幾百名精壯騎兵護衛著,拼死衝開漢軍的包圍,向西北方逃去。
由於天色昏暗、風沙漫天,雙方又處在激戰之中,所以沒有人注意到單于逃走了。兩國的軍隊還在奮力廝殺著,雙方死傷人數差不多。後來,一個被漢軍抓住的匈奴俘虜說單于已經趁天黑逃走了,漢軍於是派出輕騎兵連夜追趕,匈奴的軍隊也趁機四散逃走。天快亮的時候,漢軍已追出了二百多裡,但最終還是沒有抓到單于,讓他從指尖底下溜走了,這不可不說是一大遺憾。
不過,漢軍的戰績也還不錯,雖然自己也有損傷,但一共斬殺、俘虜匈奴士兵將近萬人。漢軍一直追到趙信城(趙信降匈奴後所築之城),把城裡囤積的大批糧食運回來補充軍需,運不完的就全部燒毀,不給匈奴留下。本來,按照戰術安排,在衛青與匈奴單于激戰的時候,李廣和趙食其應該率兵從東進軍,與衛青配合,共同夾擊單于。
但由於對地形不熟,他們在沙漠中迷了路,沒有按時趕到。等到衛青結束戰鬥,帶兵回到沙漠以南,才遇到他們。衛青詢問了他們迷路的情況,並派使者把這件事稟報給武帝。按照漢朝軍法,軍隊滯留延誤戰鬥的,軍官要被判死刑。衛青派人到李廣那裡責令他手下的校尉去受審。李廣說:「校尉們沒有錯,是我自己迷了路,我親自去受審。」到了衛青的幕府中,李廣感嘆自己與匈奴打了一輩子仗,卻沒有得到應有的回報,不能再受此辱,於是拔刀自殺了。趙食其被帶回京城,判了死罪。他出錢贖罪,被貶為平民。
戰鬥結束後,匈奴單于逃得很遠,以至於匈奴國人有十幾天都不知道單于的下落。於是,匈奴的右谷蠡王自封為單于。不過,原來的單于最終還是回來了,重新整合了軍隊,右谷蠡王這才去掉了自封的單于稱號。
在大將軍衛青率兵力戰匈奴單于的時候,驃騎將軍霍去病也帶領著5萬騎兵從代郡出塞迎戰匈奴。他的手下沒有副將,於是把李廣的兒子李敢任命為大校,暫且充當副將。霍去病帶領軍隊越過大沙漠,捉住了單于的近臣章渠,殺死了匈奴小王比車耆,又與匈奴左賢王進行了奮戰。翻過離侯山,渡過弓閭河,捉到屯頭王、韓王等三人,以及匈奴的將軍、相國、都尉等83人,一共斬殺和俘虜匈奴達7萬多人,遠遠超過了大將軍衛青的戰果。
在行軍的過程中,霍去病在狼居胥山祭天,在姑衍山祭地,以此來慶祝勝利,從此留下了「封狼居胥」的千古美名。回到長安後,武帝表彰霍去病的戰功,加封他五千八百戶封邑,並把他手下的一批作戰出色的將士都封了侯。右北平太守路博德跟隨霍去病到達檮餘山,共斬殺、俘獲敵軍2700人,被封為符離侯,並賜一千六百戶封邑。
北地都尉邢山跟隨霍去病出徵,俘虜了匈奴小王,被封為義陽侯,並賜一千二百戶封邑。以前投降漢朝的匈奴小王復陸支、伊即靬此次隨霍去病出徵有功,分別被封為壯侯和眾利侯。從驃侯趙破奴、昌武侯安稽隨霍去病出徵有功,每人各加封三百戶封邑。校尉李敢繳獲匈奴的戰旗和戰鼓,被封為關內侯。校尉徐自為被授予大庶長的爵位。另外,霍去病軍隊中受到賞賜的小軍官和士兵也有很多。
漠北戰役之後,武帝的兩員大將衛青與霍去病之間的地位和關係發生了微妙的變化。與霍去病及其部下被重賞的情形不同,漠北大戰的另一大功臣衛青這次卻並沒有得到加封,衛青的部下也沒有得到什麼賞賜。
這次戰役之後,漢朝軍隊中的馬匹數量大大減少。當初,衛青和霍去病的軍隊出塞時,邊塞上的官吏記載的馬匹數量是14萬匹。等到他們收兵返回,馬匹的數量卻只剩下3萬匹,可見戰鬥之慘烈。朝廷增設了「大司馬」的官位,這是軍隊的最高領導職位,衛青和霍去病都當上了大司馬。武帝還專門頒布了法令,使霍去病的官階和俸祿與衛青相等。從此以後,衛青的權勢日益減退,而霍去病的地位則越來越高。這樣一來,原來與衛青親近的許多人都離開他,轉而投奔霍去病。這些見風使舵的人倒也總是能得到一官半爵。
從元光六年(前129)衛青首次出徵匈奴到元狩四年(前119)的漠北大決戰,10年間,在大大小小的各場戰役中,漢軍共斬殺匈奴約18萬人,投降的匈奴有4萬餘人。另外,漢軍還繳獲了匈奴的牲畜約兩三百萬頭,並收回了大片的土地。在匈奴面前,武帝統治下的漢朝廷再也不委曲求全、妥協退讓,而是顯示出強者的姿態,令匈奴人悲嘆:「亡我祁連山,使我六畜不蕃息;失我焉支山,使我婦女無顏色。」不過同時,漢朝的損失也是巨大的。
十幾萬名士兵和二三十萬匹戰馬犧牲在戰場上,戰爭所需要的巨額財力物力支持大大加重了國家和人民的負擔。所以,在漠北大戰之後,匈奴和漢朝雙方都需要休養生息,保持力量。於是,兩國之間的戰爭暫時告一段落。