Set a challenging target of 322 runs, the Lankans rode on half-centuries from Kusal Mendis and Danushka Gunathilaka to cross the line in 48.3 overs and register their first win the tournament.
The duo dominated the Indian bolwers to add 159 runs between them and lay the foundation of a successful run chase.
Mendis was the highest scorer among the Sri Lankans, producing a steady 89 runs off 93 balls before being run out thanks to an excellent piece of fielding by Indian pacer Buvneshwar Kumar off his own bowling.
Gunathilaka smashed 76 off 72 deliveries with seven boundaries and two sixes.
Thursday's result throws the group wide open as all the teams in the group -- India, Sri Lanka, Pakistan and South Africa -- have identical records of a win and a draw.
India will now have to beat South Africa in their last group match on June 11 and Sri lanka face a must win contest against Pakistan a day later in quest to qualify from the semi-finals.
Sri Lanka suffered an early jolt when Bhuvneshwar Kumar sent back Niroshan Dickwella in the fifth over.
However, Mendis joined Gunathilaka in the middle and the duo proceeded to turn things around with some superb batting.
After Gunathilaka's dismissal, Mendis and Kusal Perera added 26 runs between them off 29 balls.
However, poor communication between them coupled with an accurate throw by Bhuvneshwar Kumar deprived Mendis of what would have been an extremely well-deserved century.
Angelo Mathews joined Perera in the middle to produce another crucial partnership for Sri Lanka.
The duo added 75 runs between off just 62 deliveries before Perera had to retire due to an injury to his right hamstring.
Perera scored 47 runs off 44 bals with five hits to the fence.
Mathews continued to battle on and remained unbeaten on 52 at the end.
He received excellent support from Asela Gunaratne who scored a quickfire 34 runs off 21 balls with two boundaries and a couple of sixes.
Earlier opening batsman Shikhar Dhawan's 125 powered defending champions India to 321/6 in 50 overs.
Dhawan, who registered his 10th century in One-Day International (ODI) cricket, shared a partnership of 138 with fellow opener Rohit Sharma (78; 79b; 4x6, 6x3).
Dhawan also shared an 82-run stand with Mahendra Singh Dhoni (63; 52b; 7x4, 6x2)) for the fourth wicket as India posted a highly-challenging total.
Asked to bat, the Indian right-left combination of Rohit Sharma and Dhawan laid a solid foundation as they made the most of the shorter length maintained by the Sri Lankan pacers.
Dhawan and Rohit initially ensured that they get through the early overs without any damage and then paced their innings nicely once they got settled.
Both the batsmen showed good cutting, pulling and hooking strore-making techniques as they milked runs mostly through the square of the wicket.
Rohit, having completed his 31st fifty, was cruising until being caught by Thisara Perera off pacer Lasith Malinga. That put India at 138/1 in 24.5 overs.
Then, India lost Virat Kohli (0) and Yuvraj Singh (7) cheaply within the next few overs but Dhawan kept finding fours to keep Sri Lanka at bay.
Captain Kohli disappointed the crowd when he edged behind a delivery from paceman Nuwan Pradeep in the fifth ball of the 16th over.
Yuvraj dragged a ball from Asela Gunaratne on to his stumps, and India score read 179/3 in 33.3 overs.
Even if they were at a spot of bother, Dhawan and new batsman Dhoni showed a lot of positivity, not staying away from punishing poor deliveries.
Dhoni made his intention clear as he opened his account with a six over point off pacer Suranga Lakmal.
His approach helped Dhawan and the latter completed his century in 112 deliveries. A cut towards point off Pradeep brought up his three-figure mark.
Dhawan stepped up after completing his century but his innings was halted at 125, when he couldn't clear Kusal Mendis at long-on off a delivery from Malinga. The Delhi batsman's knock featured 15 fours and a six from the 128 deliveries he faced.
Dhoni, however, continued to flay the Sri Lankan bowlers who erred in line and length, making it easy for him to showcase his brute power.
Later, Kedar Jadhav scored a quickfire 25 not out from 13 deliveries to take India past 320.