Private - it's only callable from other functions inside the contract
Internal - is like private but can also be called by contracts that inherit from this one. You can see it as similar to "protected" in other languages
External - can only be called outside the contract. For example using the web3.js or from another contract
Public - can be called anywhere, both internally and externally.