戰爭初期,燕軍在軍事、政治、經濟上均處於劣勢,故其戰略為:鞏固北平根據地,利用內線作戰的有利條件,迅速變被動為主動,求得各個擊破。七月五日,朱棣擊敗朱允炆部署在北平的軍隊以後,連克通州(今北京通州區)、薊州(今天津薊州區)、遵化、密雲、居庸關、懷來、開平(今河北赤城獨石口)、龍門(今河北赤城龍關)等地,從而鞏固了北平根據地,為南下進攻打下了基礎。而此時,朱允炆憑借其軍事、政治、經濟上的優勢,集中強大兵力,分進合擊,想迅速將燕軍包圍在北平地區並殲滅之。七月二十四日,以長興侯耿炳文為大將軍,駙馬都尉李堅、都督甯忠為左右副將軍,率師北伐。八月十二日,耿炳文率軍30萬人進駐真定(今河北正定),都督徐凱領兵10萬人紮營河間(今屬河北),都督潘忠駐莫州(今河北任丘),都督楊鬆率軍9000人為先鋒扼雄縣。朱棣乘北伐軍部署未定,率軍主動出擊。八月十五日夜,攻破雄縣,楊鬆全軍覆沒。
二十五日,燕軍直搗真定,敗耿炳文軍於滹沱河,斬首3萬餘級,餘眾入城堅守,燕軍攻城3日不克,棄圍北還。八月底,朱允炆以曹國公李景隆代耿炳文為大將軍,率軍50萬人進駐河間,再圖北伐,並令江陰侯吳高等圍攻水平(今河北盧龍)。九月五日,朱棣隻留下少數兵力防守北平,自率主力往援水平。吳高不戰而走,燕師連下水平、山海關,進取大寧(今內蒙古寧城)。李景隆趁虛率師圍攻北平,不料遭到守城燕師的頑強抵抗。十一月四日,朱棣回師北平,與留守部隊配合作戰,內外夾擊,大敗李景隆軍於鄭村壩(今北京東20裏),斃傷十餘萬人。李景隆退還德州。
建文二年(1400年)四月初一,李景隆率軍60萬人從德州分兵兩路,大舉北伐。朱棣率軍10萬人迎戰。兩軍會戰於白溝河(今河北雄縣境內)。經過數日激戰,李軍大敗,燕師乘勝攻克德州。李景隆退守濟南。燕師跟蹤追擊,進圍濟南,遭到山東參政鐵鉉與都督盛庸的頑強抵禦,圍城3個月而不下,且後方又受到北伐軍的威脅,遂撤圍還師北平。九月,朱允炆以盛庸代李景隆為大將軍,都督平安、吳傑為左右副將軍,再舉北伐。盛庸屯德州,平安、吳傑駐定州,都督徐凱營滄州,互為犄角以困北平。十月,朱棣獲悉盛軍北進,遂佯稱攻遼東而至通州,突然轉師南攻滄州,生擒徐凱,殲萬餘人。燕師進逼德州,誘敗盛軍於城外。其後沿運河而南,連克臨清、館陶、大名、濟寧等地。盛庸、鐵鉉率軍營於東昌(今山東聊城)以扼燕師歸路。十二月二十五日,燕師歸至東昌,遭盛軍截擊,死傷數萬人,主將張玉戰死,被迫還師北平。
建文三年(1401年)春,盛庸率軍20萬人駐德州,吳傑、平安駐真定,互為犄角,伺機出擊。三月,朱棣再次率師南下,大敗盛軍於夾河(今河北武邑境)。閏三月十日,又誘敗吳傑、平安軍於滹沱河。乘勝連克真定、順德(今河北邢台)、廣平(今河北永年)、大名等地。朱允炆為緩兵之計,下詔赦燕王罪,企圖使其懈怠;同時發兵斷其糧道,以迫其北歸,伺機殲滅。朱棣識破此計,於六月中旬,遣都指揮使李遠率輕騎6000人南下,連克濟寧、沛縣等地,焚盛軍糧船數百艘、糧數百萬石,京師(今南京)大震。七月,盛庸乘燕師南下,令平安率萬騎攻北平;大同守將房昭回攻保定。朱棣聞訊,率軍回援,大敗其軍,還師北平。燕師與建文帝軍隊在河北及魯西爭戰兩年有餘,燕師所克城邑旋得旋失,唯占據北平、保定、水平三府。朱棣深感南軍兵多勢眾,曠日持久,攻防俱難,遂決定乘虛直搗京師。
建文四年(1402年)正月,朱棣督軍南下,繞過濟南,連下東阿、東平、汶上、兗州、鄒縣、沛縣、宿州,直抵蒙城、渦河(今安徽境內)。三月初九,於淝河(今安徽境內之北淝水)設伏,擊敗尾隨而來的盛軍4萬餘人。四月,燕師屯小河(即今安徽境內之濉河)。南將都督何福率軍北援,與平安會合,軍勢甚盛,兩軍在齊眉山(今安徽靈璧境內)交戰,燕師損失慘重,軍心動搖。朱允炆在此關鍵時刻,召徐輝祖所部還京,前線力量銳減,何福被迫退守靈璧。燕師迅速切斷其糧道,乘機進擊,大敗何福、平安所部,俘其10萬人,攻克靈璧。至此,朱允炆在淮河以北的主力已基本喪失殆盡。五月初,燕師乘勝南進,一舉突破盛庸淮河防線,連克盱眙、揚州、高郵、泰州、儀真(今江蘇儀征)等地。六月三日,燕師自瓜洲再破盛庸、徐輝祖長江防線,連克鎮江、龍潭。朱允炆聞訊,急忙答應割地求和,朱棣不允。十三日,燕師進抵南京金川門,守將李景隆和穀王朱穗開門迎降,朱允炆在宮中自焚身死(一說出逃為僧)。朱棣即皇帝位稱成祖,改元永樂。建文帝的帝王之旅,匆匆四年即告結束。
家族間的紛爭,孰是孰非,難以定論。朱家天下並沒有因這場爭奪而受到影響,寶座上坐的依然是“朱”姓皇帝,而受苦受難的也依然是天下勞苦百姓。