Иоанн Скилица так написал о положении сторон перед решающей схваткой, подчеркнув при этом стратегически правильное решение византийцев без промедления развивать первоначальный успех: «Когда Свендослав услышал о взятии Преславы, он пришел в замешательство, однако не оставил свои замыслы, а стал ободрять своих, призывая проявить себя свыше обычного доблестными мужами, и распорядился сделать все остальное, что было нужно. Умертвив всех болгар, находившихся в подозрении, числом около трехсот, он выступил против ромеев. Император же, заняв по пути некоторые города, поставил над ними стратигов и продвигался… опустошая многие укрепления и поселения, которые он отдавал на разграбление воинам. Когда разведчики сообщили о приближении каких-то скифов, он отрядил отобранных воинов, поставив над ними Феодора из Мисфии в качестве военачальника, и поручил ему, идя впереди войска, разузнать о числе врагов и дать знать об этом; если же будет возможно, то попытать их силу перестрелкой. Сам же [император] следовал позади, выстроив все войско в боевой порядок. Подойдя к врагам, Феодор и его воины стремительно напали на них. Росы, опасаясь засады, все двигались вперед; многие из них были ранены, некоторые пали, и они стали отступать. Рассеявшись по соседним горам и поросшим лесом лощинам, которые были глубоки и обширны, они по горным тропам добрались до Дристры. Количество их достигало семи тысяч, напавших же на них и обративших их в бегство ромеев было триста. Присоединившись к Свендославу, скифы подняли с места все множество его войска – а насчитывалось их триста тридцать тысяч – и разбили лагерь в двенадцати милях от Доростола, где с ожесточением и мужеством ожидали приближения императора».
23 апреля под Доростолом состоялось первое столкновение передового отряда византийцев с небольшим русским отрядом (в результате которого почти полностью погибли оба отряда), но главная битва была еще впереди.
Святослав в этот же день встретил противника на ближних подступах к Доростолу и выстроил свое войско в сомкнутом боевом строю. Согласно описанию византийцев, сомкнутые щиты и копья образовывали стену, атаковать которую было крайне трудно. В свою очередь, Иоанн Цимисхий выстроил свою армию в две линии: в первой находились тяжеловооруженная кавалерия, а во второй – лучники и пращники, проводившие обстрел русских войск через первую линию.
Византийцы рассчитывали, что русские воины не выдержат атаки конницы и их «стена» будет прорвана, но она оказалась значительно устойчивее, чем они могли предположить. Всего византийцы провели двенадцать атак, но так и не смогли прорвать сомкнутый строй. Единственным результатом этих атак было то, что воины Святослава организованно отступили за стены крепости.
После безрезультатного боя на следующий день Иоанн Цимисхий выстроил под Доростолом укрепленный лагерь с окружающими его глубоким рвом и земляным валом. 25 апреля к Доростолу подошел византийский флот, что означало начало полной блокады крепости. Вечером Святослав вывел из города свою конницу, но византийцы не решились ее атаковать (сам князь тоже не решился перейти в наступление), и бой не состоялся.
На следующий день под стенами крепости произошло новое крупное сражение. На этот раз, как и в первом бою, Святослав вывел тяжеловооруженных пеших воинов, которые были атакованы византийцами. Ожесточенный бой продолжался еще два дня, и в нем погиб Сфенкел. В конечном итоге русское войско было вынуждено отступить после того, как обозначилась реальная угроза захода в его тыл специально посланного императором отряда.
После закончившегося сражения, которое не принесло ему победы, Святослав дал команду выкопать вокруг крепости ров, что не давало возможности византийцам подойти непосредственно под стены и использовать их многочисленные стенобитные и камнеметные машины.
29 апреля Святослав совершенно неожиданно для противника провел вылазку из крепости в направлении Дуная, в ходе которой захватил большое количество продовольствия (что и дало ему возможность выдерживать последующую осаду) и разгромил захваченный врасплох вражеский отряд.
Далее началась длительная осада, и в конце концов византийцы сумели засыпать часть рва вокруг крепости и придвинуть вплотную стенобитные и камнеметные машины, использование которых сделало падение Доростола вопросом ближайшего времени. Это вынудило Святослава 19 июля выйти из крепости, чтобы попытаться уничтожить машины. Время для диверсионной вылазки было выбрано отнюдь не случайно. За время длительной осады русские воины прекрасно изучили распорядок дня противника. Они знали, что в обед византийцы обязательно получают вино и после принятия пищи большинство из них ложатся спать.
Поэтому Святослав напал на византийцев именно после обеда, и расчет его оказался верен. Сонные и отяжеленные принятым вином византийцы растерялись: осадные машины были сожжены, а их командир убит.
Удачная вылазка воодушевила Святослава, и на следующий день он опять вышел с войском из крепости. Византийцы встретили Святослава, выстроившись фалангой, – несмотря на ожесточенные атаки, ее не удалось пробить, и князь были вынужден отступить обратно в Доростол. Отметим, что после отступления византийцы обнаружили среди погибших русских воинов женщин в доспехах, которые сражались наравне с мужчинами.
21 июля Святослав собрал военный совет, на котором обсуждался вопрос о дальнейших действиях. Все присутствующие, кроме великого князя Киевского, были едины во мнении, что дальше удерживать Доростол не удастся, и расходились лишь во мнении, как надо его покинуть. Предлагались варианты от достижения соглашения с византийцами о пропуске русского войска до неожиданной попытки прорыва. Только сам Святослав решил, что Доростол сдавать он не будет. По свидетельству Льва Диакона великий князь Киевский сказал следующие слова: «Погибнет слава, сопутница русского оружия, без труда побеждавшего соседних народов и, без пролития крови, покорявшего целые страны, если мы теперь постыдно уступим римлянам. И так с храбростью предков наших и с тою мыслью, что русская сила была до сего времени непобедима, сразимся мужественно за жизнь нашу. У нас нет обычая бегством спасаться в отечество, но или жить победителями или, совершившим знаменитые подвиги, умереть со славою».
По решению Святослава 22 июля произошло решающее сражение, причем когда утром русское войско было выведено за крепостные стены, князь приказал запереть за ним ворота – чтобы у его воинов не было соблазна отступить и они бы думали только о победе.
Великий князь Киевский первый перешел в атаку, и после его стремительного нападения византийцы дрогнули. Положение спас лично император, который пришел на помощь своей пехоте с отрядом конницы и сумел сдержать наступление русской дружины.
Дальше главной задачей Иоанна Цимисхия стало добиться окружения русских войск, что сделать было крайне непросто – Святослав предусмотрительно далеко не отходил от крепостных стен, и поэтому использовать свое численное превосходство и провести фланговый охват византийцы не могли. Поэтому император разделил войско на два отряда – один (под командованием патрикия Романа и столоначальника Петра) должен был имитировать отступление и отвести Святослава как можно дальше от крепостных стен, а второй (под командованием Варды Склира) должен был ударить с тыла и отрезать путь отступления.
Однако полностью реализовать это план не удалось. Святослав действительно, как и предполагали византийцы, увлекся преследованием отступающего противника, и Варду Склиру удалось провести окружение. Особенно ему в этом способствовала неожиданная песчаная буря, которая слепила русское войско. Об этой буре упоминает Иоанн Скилица в своем описании боя: «Говорят, что ромеи получили тогда и божественное воспоможение. Ибо в тылу их поднялась буря и ударила в лицо скифам, не давая им возможности осуществить задуманное для битвы». Но, несмотря на все эти неблагоприятные обстоятельства, Святослав сумел прорвать кольцо окружения и вернуться в Доростол – и на этот раз сражения закончилось без четко выраженного победителя.