Lewis Hamilton has closed to within nine points of Nico Rosberg's world championship lead after beating Ferrari's Sebastian Vettel to victory in a tense Canadian Grand Prix.
For the fifth time in nine starts in Montreal, Hamilton emerged victorious but was pushed hard by a two-stopping Vettel after the German stormed past both Mercedes cars and into the lead of the race at the start.
Rosberg finished only fifth, meaning his advantage over Hamilton has shrunk from 43 to nine points in just two races.
The championship leader dropped to 10th on the opening lap after banging wheels with Hamilton as they went side-by-side into Turn One behind the fast-starting Vettel.
Valtteri Bottas was an impressive third from seventh on the grid to give Williams a timely first podium finish of the season.
Max Verstappen claimed fourth for Red Bull, successfully holding off a charging Rosberg late on after the German had dropped from Bottas's tail when he had to make an unscheduled second stop for a slow puncture.
Watch: Lewis Hamilton, Sebastian Vettel and suicidal seagulls!
On the penultimate lap, Rosberg drifted past Verstappen on the long run to the chicane but lost the back end of his Mercedes under braking and spun into the run-off area. Fortunate not to hit anything, he recovered to hold off Kimi Raikkonen for fifth on the final lap.
Having appeared in total control of the championship just three weeks ago with four wins from the opening five races, Rosberg could be overhauled by Hamilton for the first time this season as soon as the next race in seven days' time in Azerbaijan.
In a repeat of the season-opener in Australia, both Mercedes drivers were gazumped by a scintillating start from third-placed Vettel, who was almost immediately ahead of polesitter Hamilton as the lights went out.
Vettel led the early laps from Hamilton but Ferrari locked him into a two-stop strategy when they pitted him for the first time on lap 12, just after a Virtual Safety Car had been called when Jenson Button's McLaren pulled up on the side of the track.
With Mercedes opting for a one-stop with Hamilton, Vettel re-inherited the lead when the world champion came into the pits, but ceded position again with his second stop.
"We overestimated the degradation on the tyres, this is the reason why we called him in. It was the wrong decision," Ferrari team boss Maurizio Arrivabene told Sky Sports F1.
"We don't need to make the story bigger than what it is. Today we made a mistake but the big one is when you lose for this."
On soft tyres which were 13 laps fresher than Hamilton's, Vettel closed to within 4.3s of the lead after his extra stop but made a crucial error when he ran wide at the final chicane - later blaming 'suicidal seagulls' as he hijacked Hamilton's post-victory interview with Sky F1 to plead his case.
Vettel repeated the mistake five laps later and Hamilton was able to enjoy an untroubled run to his second race win in a row and 45th of his career.
"What an amazing day," said a beaming Hamilton. "Today I had another really bad start, I'm not sure why - probably overheating my clutch. Sebastian and Nico got quite a good run down to Turn One and then the tyres were cold, big oversteer, I'm just grateful me and Nico didn't get big damage to our cars.
"Other than that I was just trying to chase this guy [Vettel] down. I won my first grand prix here in 2007 so this is just such a blessing."
Coming off worse from their first-corner clash, as he ran across the grass run-off area, Rosberg ran as high as fourth before the slow puncture dropped him back down to seventh. Although he overtook Daniel Ricciardo and Raikkonen on his return, his recovery ultimately went "pear-shaped" with his failed late overtake of Verstappen.
"In Barcelona, I went round the outside of Lewis and it worked out really well, I went for the same one again today and he did a really hard, racing maneuver," Rosberg told Sky F1.
"We touched and I was off and that's it. It didn't work out, I was very p***** off in that moment but that's racing in the end and it's my job to make sure I'm in front after a battle like that next time."
While Vettel flew to Ferrari's joint-best result of the season, Raikkonen toiled to sixth place with his race undone by a difficult middle stint on supersoft tyres.
The Finn still beat the second Red Bull of Ricciardo, however, who endured what he described as a "scrappy" race having dropped from Verstappen's tail to seventh at the flag.
"Few scrappy parts from my side and I would say the team's side," said the Red Bull driver. "Today was not a clean race from both of us. I locked a brake into Turn 13, then a few of the pitstops and calls were a bit average again. We've got to clean some things up for Sunday."
Force India secured a double points finish, with Nico Hulkenberg and Sergio Perez eighth and 10th respectively, sandwiched by Toro Rosso's Carlos Sainz.
Canadian GP result
1. Lewis Hamilton, Mercedes, 70 laps
2. Sebastian Vettel, Ferrari, +5.0s
3. Valtteri Bottas, Williams, +46.4s
4. Max Verstappen, Red Bull, +53.0s
5. Nico Rosberg, Mercedes, +62.0s
6. Kimi Raikkonen, Ferrari, +63.0s
7. Daniel Ricciardo, Red Bull, +63.6s
8. Nico Hulkenberg, Force India, +1 lap
9. Carlos Sainz, Toro Rosso, +1 lap
10. Sergio Perez, Force India, +1 lap
11. Fernando Alonso, McLaren, +1 lap
12. Daniil Kvyat, Toro Rosso, +1 lap
13. Esteban Gutierrez, Haas, +2 laps
14. Romain Grosjean, Haas, +2 laps
15. Marcus Ericsson, Sauber, +2 laps
16. Kevin Magnussen, Renault, +2 laps
17. Pascal Wehrlein, Manor, +2 laps
18. Felipe Nasr, Sauber, +2 laps
19. Rio Haryanto, Manor, +2 laps
DNF Felipe Massa, Williams
DNF Jolyon Palmer, Renault
DNF Jenson Button, McLaren