建安四年,袁绍组织十万大军,战马万匹,进驻黎阳(今河南浚县东北),企图直捣许昌,一举消灭曹操。建安五年正月,曹操为了避免腹背受敌,率军东进徐州,击溃与袁绍联合的刘备,逼降关羽,占据下邳(今江苏邳县南)。接着进驻易守难攻的官渡,严阵以待。二月,袁绍派大将颜良南下,包围了白马(今河南滑县东)。曹操只有两万兵马,力量对比悬殊,于是采取声东击西、分其兵力的作战方针。
四月,曹操率军从官渡到延津(今河南延津北),作出要北渡黄河袭击袁绍后方的姿态,袁绍急忙分兵西迎曹军。曹军乘势进袭白马,杀袁绍大将颜良,袁绍闻讯派兵追来,曹军又斩袁绍大将文丑。曹军士气大振,然后还军官渡,伺机破敌。七月,袁军主力进至官渡北面的阳武(今河南原阳东南)。八月,接近官渡,军营东西长达数十里。曹操在敌众我寡的情况下,采取积极防御的方针,双方在官渡相持了数月。在这期间,曹操一度准备放弃官渡,退守许昌。荀提出,撤退会造成全面被动,应该在坚持中寻找战机,出奇制胜。曹操依其议。十月,袁绍派淳于琼率兵一万多押送大量粮食,囤积在袁军大营以北约四十里的故市、乌巢(今河南延津东南)。沮授建议袁绍派兵驻扎粮仓侧翼,以防曹军偷袭,遭袁绍拒绝。谋士许攸也提出,趁曹军主力屯驻官渡、后方空虚的机会,派轻兵袭许昌,袁绍又不采纳。
至此时,双方还是袁绍占据优势,但袁绍刚愎自用的性格使袁军失去了好几次攻破曹操的机会,袁绍的谋士给袁绍所提出的策略确实是真实可行的。在意见没有被采纳后,许攸一怒之下,投奔了曹操,并告知曹操袁军的虚实,以及袁绍用酒徒淳于琼守乌巢的信息,而乌巢是袁绍的粮食基地。在这场博弈里出现了严重的信息不对称,曹操此时掌握了袁绍最重要的信息,而袁绍对曹操却不甚知之,此时的曹操已经没有粮饷,如果袁绍率军出击,恐怕历史就要改写。袁绍既不知道曹操虚实,也不知自己的重要军事机密已经泄露。
而曹操听闻许攸的建议后果断地决定留曹洪、荀攸固守官渡大营,亲自率领步骑五千偷袭乌巢,半夜到达,乘袁军毫无准备,围攻放火,焚烧军粮。袁绍误认为官渡曹营一定空虚,派高览、张率主力攻打,而只派少量军队援救乌巢。结果官渡曹营戒备森严,防守坚固,未能攻下。同时,曹操却猛攻乌巢,杀死守将淳于琼,全歼袁军,烧毁全部囤粮。消息传来,袁军十分恐慌,内部分裂,张、高览率所属军队投降曹操。曹操乘机出击,大败袁军,歼敌七万余人。袁绍父子带八百骑兵逃回河北。两年后,袁绍郁愤而死。此役为曹操统一北方奠定了基础。