Although driving rain and a stiff wind made for tricky conditions, this was an eminently watchable meeting of two attack-minded teams.
The game started at a furious pace with several chances for both sides, the first falling to Twine, whose close-range volley was superbly tipped over by Vigouroux.
Zan Vipotnik was close to scoring with a similar effort for Swansea soon afterwards and, after his volley was deflected over, the home side took the lead from the subsequent corner.
Eom Ji-sung's inswinging corner from the left evaded everyone – with goalkeeper Max O'Leary tangling with Swans winger Ronald – on its way to the back post, where unmarked centre-back Cabango was on hand to side-foot into the far corner.
Bristol City almost levelled immediately, as Twine's delivery was helped on by Knight, but a stretching Armstrong could only prod the ball against the post.
Swansea then hit the woodwork in bizarre circumstances as Cooper blocked Zak Vyner's pass 40 yards out from the visitors' goal and the ball trickled along the floor and hit the post.
All this happened inside the opening 20 minutes and there were more chances before the break, with O'Leary saving Goncalo Franco's powerful strike inside the penalty area.
Both sides continued to push forward in the second half, though Bristol City gradually took control of the game.
Armstrong was clean through on goal when he was denied by Vigouroux, who was called into action again soon afterwards to hold a Twine free-kick.
The visitors kept coming and, having dominated possession and pinned Swansea back in their own half, Liam Manning's men got the goal they deserved as Knight scored with a thunderous header.
Substitute Mark Sykes almost put Bristol City ahead two minutes later, but his header was saved by Vigouroux.
Having had the better of the first half, Swansea were holding on at this stage, but they weathered that difficult spell to earn a draw which seemed a fair outcome for both sides after what was, overall, an even and enjoyable contest.