The World Cup winners remain on course to hold both 50-over titles, if they can beat the hosts at Edgbaston on Sunday, after everything appeared to go their way.
Mahendra Singh Dhoni won an important toss, and eventually first-change Ishant Sharma (three for 33) and off-spinner R Ashwin (three for 48) cashed in most.
Then, in pursuit of only 181 for eight, Shikhar Dhawan (68) and then Virat Kohli (58no) settled the issue - the prolific opener albeit after twice being dropped on 18 off Nuwan Kulasekara, by Angelo Mathews at slip and then Kumar Sangakkara behind the stumps. The winners' task was doubtless made easier by having the pick of the conditions, able to bowl first after heavy morning rain had delayed the start and left a legacy of unshifting cloud cover.
Sri Lanka's hopes of revenge for their defeat against India in that World Cup final two years ago took an immediate dent there and then - and they were soon in even more trouble.
They had to graft and scrap for every run, captain Mathews (51) digging in longest.
Bhuvneshwar Kumar and Umesh Yadav exerted a new-ball stranglehold as their opponents found themselves two batsmen down inside the first five overs.
They lost opener Kusal Perera cheaply, caught at second slip trying to drive at Kumar, and worse was to follow when Tillakaratne Dilshan injured himself and had to go off.
Dilshan, who had already hit Yadav for two fours in the over, toppled over as he drove some inswing wide of mid-on for two.
By the time he made it back to the striker's end, it was clear the dangerous opener had hurt his lower right leg quite badly.
He tried to carry on but had to leave the field an over later, with current International Cricket Council playing conditions outlawing the use of runners for injured batsmen.
Sri Lanka avoided the immediate pitfall of more early wickets, but could not gather any momentum as the ball continued to jag around for India's seamers.
Lahiru Thirimanne and Sangakkara became the second and third batsmen to be caught by Suresh Raina at second slip, both fencing at Ishant. Mathews and Mahela Jayawardene did not panic in a fourth-wicket stand of 78 in 19 overs, both benefiting from the scrutiny of DRS.
Dhoni shed his wicketkeeping pads and thought he had Jayawardene lbw for just five, but Aleem Dar had not detected an inside edge, and then Mathews survived on 25 after Richard Kettleborough gave him out to a delivery from Ravindra Jadeja that turned and bounced a little too much.
Mathews batted against type in an 85-ball 50 which contained just one four and a six, hoisted high over wide long-on off Ishant.
After Jayawardene was bowled trying to pull Jadeja in a powerplay which yielded just 12 runs, 16 successive dot balls followed.
Sri Lanka had done their best to establish a platform for the last 10 overs, with wickets in hand. But the snag was that the ball did plenty for the spinners in the overs left to them after seam had dominated, and the most noticeable acceleration was in the regularity of wickets rather than runs scored.
A limping Dilshan returned in the 48th over after a series of attempted big hits went awry against Ashwin and four wickets fell for only 13 runs in 20 balls.
Try as they might, Sri Lanka still appeared well short of a defendable total.
So it proved in a routine India reply memorable chiefly for the second of two politically motivated pitch invasions, from a co-ordinated coterie of Sri Lankans in the crowd.
It also featured another half-century for Dhawan, to go with his two hundreds in the group stages of this tournament.
The left-hander put on 77 with Rohit Sharma, and then another 65 with Kohli.
By the time he was stumped by Sangakkara off Jeevan Mendis' leg-spin, there was no remaining doubt about an outcome confirmed with 15 overs to spare in a match every bit as one-sided as England's victory over South Africa.