公元前200年(汉高祖七年)冬季,汉高祖刘邦亲率32万大军,出征匈奴,同时镇压韩王信叛乱。随行的主要谋士是陈平、娄敬,将领有樊哙、夏侯婴、周勃等。汉军进入太原郡后,连连取胜,产生了麻痹轻敌的思想。刘邦到达晋阳后,听说匈奴驻兵于代谷(今山西省繁峙县至原平市一代),于是先派人侦察冒顿虚实。而冒顿将其精锐士兵、肥壮牛马等隐藏起来,只显露出年老弱小的士兵和瘦弱的牲畜,派去的使臣十余批回来都说匈奴可以攻击。刘邦派刘敬(娄敬)再去出使匈奴,刘邦率骑兵先到达平城(今山西省大同市),此时汉军步兵还未完全赶到。冒顿单于见汉兵蜂拥赶来,在白登山设下埋伏。
刘邦带领兵马一进入包围圈,冒顿单于马上指挥40万匈奴大军,截住汉军步兵,将刘邦的兵马围困在白登山,使汉军内无粮草、外无援兵,不能相救。刘邦发现被包围后,组织突围,经过几次激烈战斗,也没有突围出去。双方损失很大,一直相持不下。汉军在被围了七天后,粮食也快吃完了,饥寒交迫,危在旦夕。冒顿单于本来与韩王信的部下王黄和赵利约定了会师的日期,但他们的军队没有按时前来,冒顿单于怀疑他们同汉军有勾结,就采纳了阏氏的建议,打开包围圈的一角,让汉军撤出。当天正值天气出现大雾,汉军拉满弓安上箭,从已经解除包围的一角慢慢地走出,才得以脱险。
刘邦为了休养生息,要嫁长公主与匈奴和亲,吕后不答应,日夜哭泣,刘邦改以宗室女为公主,嫁给冒顿单于,并派刘敬作为使者陪同前往。此外汉朝每年送给匈奴大批棉絮、丝绸、粮食、酒等。自此,汉与匈奴约定结为兄弟,各自以长城为界,两国的关系得到暂时的缓和。