Internal commands are buil-in commands.
If you don't know the type of a command, you can use "type" command:
..$ type cd
cd is a shell builtin
..$ type pwd
pwd is a shell builtin
..$ type bash
bash is /bin/bash
There is a trick about "type" command:
..$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
"-a" option shows us is the command duplicated by external command or not.
let's understand it with "time" command:
..$ time pwd
/home/user
real 0m0.000s
user 0m0.000s
sys 0m0.000s
..$/usr/bin/time pwd
/home/user
0.00user 0.00system 0:00.04elapsed 0%CPU
(0avgtext+0avgdata 2240maxresident)k
64inputs+0outputs (1major+83minor)pagefaults 0swaps
So what happened up there:
When we typed "time pwd" we used the internal(built-in) time command
Then we typed "/usr/bin/time pwd" that was the external time command
I hope this is a helpful explanation about difference between internal and external commands.