No comments on the fighting, but a few comments on middle-game technique:

is a strange move, making the previous stone at L16 look misplaced. There is a middle-game joseki (N16-O16-M18-M17-L17-N18-K18), which B can use to help fix his shape in sente, at the cost of also strengthening the W group. Here that seems like a reasonably strategy, since the B stones along the top are weak.
After the joseki in the lower left corner, the W invasion at C8 starts another common middle-game joseki. It is time in your Go career to study the continuations, starting with B7 (not B6). It is fairly large for B to defend earlier at E11 to prevent this invasion.

is a contact move, which typically ends up strengthening both sides. But here the lone W stone is weaker than the three nearby B stones, so the strategy seems dubious. I would prefer to simply run out at P13, leaving the position unsettled. A far more positive approach would be to pincer around R9, to start a running fight after both sides jump into the center. In the game sequence, B gives up quite a bit of territory, and it is not clear what compensation he gets.
:b101: and :b105: miss a middle-game tesuji, the sacrifice cut at R7. This cut is worth considering when it will make your opponent over-concentrated to capture the cutting stone. Try playing out some sequences to see if you agree that B can get a better result than in the game.