What's the difference between fallback() and receive() and between payable vs transfer?

I saw there are two type of function available, but I don't understand the difference. If another contract send to my contract for example $100 BUSD, how do I know when I received them?
I saw there are these two function:
fallback() external payable { }

receive() external payable { }

I have to do some logic when another contract send me a token, and I also need to know the address of the token that I received. Which of the two functions should I use?

Also, I have another question.
If I want to send BUSD/BTC/BNB etc from my contract to a wallet address, what's the difference between:
IBEP20(tokenAddress).transfer(to, amount);

I'm on the binance smart chain, but I don't think there is any difference.

Thank you!