אף שפעמים רבות מתואר וארו בספרות העתיקה כטיפש ממוצא נחות (וליוויוס אף מזכיר מסורת מפוקפקת שלפיה אביו היה קצב) שהיה אחראי על תבוסת הרומאים בקרב, לא נכון להניח שהוא פעל בניגוד לעמדת ההנהגה ברומא. למעשה, הסנאט הרומאי הוא שלחץ על הקונסולים לתקוף את צבאו של חניבעל וליזום את הקרב. למרות התבוסה בקרב, הקריירה הפוליטית של וארו לא נפגעה, והוא המשיך ליהנות מאמון הסנאט גם לאחריו. הוא אף זכה בפיקוד צבאי בשנים 208 ו-207 לפנה"ס, והוביל את המשלחת לחצרו של פיליפוס החמישי בשנת 205 לפנה"ס. בסופו של דבר נבחר לצדו לוקיוס אמיליוס פאולוס לכהונה המקבילה.
המבנה המקובל של הצבאות בתקופה הנדונה היה להציב את הרגלים במרכז המערך, ואת הפרשים בשני האגפים. הרומאים פרסו את צבאם בהתאם לכך, אך מבנה הקרקע של השטח בו נערך הקרב, והרצון לרכז כוח מכריע מול מרכז מערך צבאו של חניבעל, כדי להביא לשבירתו המהירה, גרמו להם להציב את הלגיונות במערך עמוק פי כמה מהמקובל בצבא הרומאי (לפי חוקר אחד, רוחב החזית של כל לגיון לא עלה על 300 מטר).
חניבעל שינה במקצת את הפריסה המקובלת של כוחות הרגלים שלו. הוא הציב במרכז המערך של צבאו את הלוחמים האיבריים והגאליים, שרובם לא היו מצוידים בשריון גוף, ואת הרגלים הכבדים שלו (הלובים מאפריקה), שהיו בעלי חימוש ומיגון טוב יותר, הציב בשני האגפים של מרכז צבאו, בנקודות החיבור בין הרגלים שלו לבין הפרשים, שהוצבו באגפים. מרבית הפרשים של חניבעל, כולל הפרשים הגאליים הכבדים, הוצבו באגף השמאלי של הצבא הקרתגני, בצמוד לנהר ומול כנף הפרשים הרומיים (החלשה יחסית), ואילו הפרשים הנומידיים הקלים הוצבו מול הפרשים של בעלות הברית האיטלקיות באגף הקרתגני הימני. ההיסטוריון היווני פוליביוס אשר תיאר את הקרב, כתב שכוחות הרגלים במרכז המערך הקרתגני הוצבו במבנה דמוי חצי סהר (או קשת), הפונה כלפי חוץ מול מרכז המערך של הצבא הרומאי.
מהלך הקרב.
שלב ראשון – קרב הפרשים.
הקרב החל, בהתאם למקובל באותה תקופה, בהתכתשות של החיילים קלי החימוש משני הצדדים. בקרב קאנאי פרסו היריבים את חייליהם הקלים במרחק ניכר מהכוח העיקרי, כדי שאלו יספקו מסך הגנה שמאחוריו יוכל להתפרס הצבא העיקרי. מטרה אחרת של ההתכתשות המקדימה בין הכוחות הקלים הייתה לפגוע ככל הניתן בחיילי האויב בעזרת קלעים, כידוני הטלה וחצים. ההתכתשות בין החיילים הקלים הסתיימה תוך זמן קצר וללא יתרון לצד כלשהו, והחיילים הקלים נסוגו לאחור על מנת לאפשר לכוח העיקרי לפתוח בקרב.
במקביל להתכתשות המקדימה בין החיילים קלי החימוש, הסתערו הפרשים הכבדים של חניבעל, שהוצבו באגף הצמוד לנהר, על הפרשים הרומים שניצבו מולם. מניתוח השוואתי של קרב הפרשים עולה, שהרומאים היו ערוכים בעומק של 10 שורות, בחזית שרוחבה כ-500 מטר, בעוד הפרשים של חניבעל נערכו במבנה עמוק בהרבה (כ-25 שורות).
הקרב נפתח במטח כידונים שהטילו הפרשים הקלטים על הפרשים הרומאים, בעקבותיו הסתערו הפרשים הקלטים והאיברים, שנהנו מעדיפות מספרית גדולה, על יריביהם. לאחר פרק זמן קצר של לחימה קשה ועקובה מדם בשטח צר, שלא איפשר תמרון, הובסו הפרשים הרומים ושרידיהם נמלטו משדה הקרב. לפי פוליביוס, כמעט כל הפרשים הרומאים נהרגו בקרב ובמרדף שבא בעקבותיו, אך ככל הנראה תיאור הקרב אצל ליוויוס, לפיו רק כמחצית מהפרשים אבדו, אמין יותר.
לאחר שהפרשים הקלטים והאיברים הביסו את הפרשים הרומאים, הם לא המשיכו במרדף אחריהם כמקובל, אלא נעו מסביב למערך הצבא הרומאי, ותקפו מהעורף את פרשי בעלות הברית הרומאיות באגף השמאלי של הצבא הרומאי, שרותקו לחזית שלהם על ידי הפרשים הנומידים של חניבעל.
אף שהנומידים נהנו מיתרון מספרי קל על יריביהם (כ-4,000 לעומת 3,600) הם לא ניסו להסתער עליהם, אלא ניצלו את השטח הרחב שעמד לרשותם, שלא הוגבל על ידי מכשול טבעי כמו הנהר, ונקטו בטקטיקה המועדפת עליהם, התקפות פגע וברח תוך הטלת כידונים קלים על יריביהם. מטרת הפרשים הנומידים לא הייתה להבקיע את מערך האויב, אלא למנוע מפרשי בעלות הברית הרומאיות מרחב תמרון, ולרתק אותם למקומם. הסתערות הפרשים הקלטים והאיברים הכבדים על עורפם של פרשי בעלות הברית שברה את שורותיהם, ושרידיהם נסו משדה הקרב.
עזרובעל שלח את הפרשים הנומידים למרדף אחר פרשי בעלות הברית הנמלטים, ואלה טבחו בהם ביעילות כזו שפוליביוס מזכיר רק 300 פרשים מקרב בעלות הברית שהצליחו לחמוק משדה הקרב. לפי ליוויוס, מעט יותר מ-1,000 פרשים הצליחו להימלט. כך או כך, אין מחלוקת על כך שמרבית הפרשים של בעלות הברית נהרגו או נשבו. הפרשים הכבדים לא הצטרפו למרדף, אלא תקפו את חיל הרגלים הרומי מעורפו.
שלב שני – קרב הרגלים.
בזמן שפרשיו של חניבעל הביסו את פרשי הצד השני, ניטש קרב קשה בין כוחות הרגלים של הצדדים היריבים, כאשר הלגיונות הרומיים תקפו את הרגלים הקלטים והאיברים במרכז המערך של הצבא הקרתגני. שמירת התקשורת בין היחידות השונות במסגרת הצבאות העתיקים הייתה בעייתית ביותר, והקשתה על המפקדים לשמור על שליטה בכוחותיהם במהלך הקרב. מכיוון שהיה קושי לשמור על מבנה מסודר במהלך הסתערות על כוחות האויב, והיות שהשמירה על מבנה חצי הסהר של כוחות הרגלים שלו הייתה מרכיב חשוב מאוד בתוכנית הקרב של חניבעל, סביר להניח שהוא הורה לכוחותיו להישאר בעמדותיהם, ולחכות עד אשר הכוחות הרומיים יתקרבו לטווח הטלת הכידון.
בדרך כלל היו קווי הצבאות היריבים מקבילים זה לזה, אך לא במקרה זה. בתחילה ניטש הקרב רק בנקודת ההשקה הצרה יחסית בין חצי הסהר הקרתגני לקו הרומי. בגלל צורת הפריסה הקרתגית, לא יכלו הרומאים להשתמש בכידוני הפילום שלהם בצורה יעילה. בדרך כלל הטילו כל החיילים בקו הרומי הראשון את כידוניהם בכוחות האויב בראשית הקרב, אך הפעם נמצאו רוב כוחות הרגלים של חניבעל מחוץ לטווח הטלת פילום, ולכן לא הושגה המטרה של ריכוך כוחות האויב לפני תחילת ההסתערות עליו. יתר על כן, בשל עומק המערך הרומי – עשרות שורות – נמנע מחיילי השורות האחוריות להטיל את כידוניהם. גרגורי דאלי חוזר על הערכתו של גולדוורת'י שרק שש השורות הראשונות היו יכולות להטיל את כידוניהן בבטחה, ללא חשש פגיעה בחיילים הרומאים בשורות הקדמיות. גם הקלטים והאיברים היו חמושים בכידונים, אך השפעתם על הצד השני הייתה פחותה עקב המיגון הכבד יחסית של הרגלים הרומאים.
לאחר מטח הכידונים באה ההסתערות. החרבות הרומאיות הקצרות הצטלבו עם החרבות הארוכות של הקלטים ועם חרבותיהם של האיברים. החרבות הקלטיות הארוכות התאימו יותר לחיתוך מאשר לדקירה, והקלטים ניסו לפגוע ביריביהם בעיקר בראש ובצוואר, שלא היו מוגנים על ידי השריון והמגן. האיברים השתמשו בחרבות הדומות לאלו שהיו בשימוש הרומאים, אך בניגוד ליריביהם, לא היו מצוידים בדרך כלל בשריון גוף.
איכות המיגון והחימוש של הלגיונרים הרומיים והעדיפות המספרית שלהם החלו לתת את אותותיהם. הרגלים הקלטים והאיברים נאלצו להתפרס על חזית רחבה יותר, משום שלא היו ערוכים בקו ישר כמקובל, ולכן המערך שלהם לא היה עמוק דיו. הם לא היו מסוגלים לעמוד מול הלחץ שהפעילו עליהם עשרות אלפי הלוחמים הרומיים ובעלי בריתם, שהיו ערוכים בעומק רב, והחלו לסגת בהדרגה לאחור בהתאם לתוכנית הקרב של חניבעל. קודקוד חצי הסהר החל להתכופף לאחור עד אשר הפך לקו ישר, ובהמשך לחצי סהר הפוך שקודקודו המאיים להישבר פונה לכיוון השני. היה זה אחד מרגעי השיא של הקרב – אילו נשבר מרכז הקו הקרתגני, היו הרומאים יכולים לתקוף את כוחותיו של חניבעל מעורפם ולהביסם. גם אלמלא הצליחו הרומאים לתקוף את הקרתגנים מעורפם אחרי פריצת שורותיהם, הרי שהיו מצליחים לחמוק מהמלכודת שהכין להם חניבעל. לפי תיאור הקרב אצל ליוויוס ופוליביוס, הקו הקרתגני נפרץ לפחות במקומות אחדים, והלגיונרים הרומיים נמצאו בעיצומו של מרדף אחרי הרגלים הקלטים והאיברים הנסוגים, אולם סביר יותר להניח שהקו הקרתגני במרכז התכופף, אך לא נשבר לחלוטין.
שלב שלישי – כיתור והשמדה.
התקדמות הלגיונות הרומיים לעומק המערך של הצבא הקרתגני, חשפה את אגפיהם להתקפת נגד. הם לא שמו לב לכך שהם נדחקים בהדרגה לתוך טריז הולך וצר, שנתחם משני עבריו על ידי גושי הרגלים הלובים הכבדים של חניבעל, שהיו ממוגנים היטב וחמושים בנשק רומי שנלקח שלל בקרבות קודמים. הקרתגנים לא נסוגו תחת הלחץ הרומאי, ושמרו על מיקומם המקורי בשדה הקרב. כאשר נראה היה שהמרכז הקרתגני עומד להישבר, הם ביצעו פנייה של 90 מעלות ותקפו את הרגלים הרומיים באגפיהם. גרגורי דאלי מעריך שמטח כידונים הקדים את הסתערות הלובים. התקפת הנגד שיבשה לחלוטין את מערך הלגיונות הרומיים, וכאוס השתרר בשורותיהם. הצפיפות הרבה לא אפשרה ליחידות המשנה של הלגיונות לתמרן כהלכה, לשנות את מערכן כדי להתייצב מול המתקפה הקרתגנית, והקשתה עליהן להתגונן ביעילות.
ייתכן שהצבא הרומאי היה מצליח להתאושש, להתארגן מחדש ולהדוף את ההתקפות על אגפיו, אך זמן קצר לאחר מכן הצטרפו למתקפה הפרשים הכבדים של חניבעל, תקפו את הלגיונות הרומיים מעורפם, והשלימו את כיתורם. מה שהתרחש לאחר מכן דמה יותר לטבח מאשר לקרב של ממש. החיילים הרומיים, שהצטופפו בתוך שטח צר והותקפו מכל עבר, לא יכלו להתגונן ביעילות, ודרסו זה את זה במהומה שנוצרה. רוב המפקדים נהרגו או נפצעו, ושרשרת הפיקוד הרומית השתבשה לחלוטין, באופן שלא איפשר היחלצות מהמצב הקשה אליו נקלעו. עד רדת החשיכה חדל הצבא הרומאי מלהתקיים ככוח לוחם.