Have a look at the MSINet component API for use in VC++, VB etc... especially the FTP parts.
Then look up RFC 959 (FTP Protocol).
An API (Application Programming Interface) allows you to hide the nuts and bolts of a process from the programmer through a defined entry point. A protocol *is* the nuts and bolts hidden behind that API.
Just because you have access to the API, does not mean that you know what is really happening behind the scenes, and what is more, there are times when that API is not (or badly) explained, or (as in the case of the good old Wininet api) only a very basic rendering of the underlying protocol is effectivly encapsulated.
Ok, wininet is just an api wrapper for basic HTTP and FTP programming, and these are open protocols defined by open, community developed internet drafts and RFC's, but how about all the rest? Windows shares with SMB? Windows login authentication? MSN Messenger? Nope, you just get an api which (watered down explanation follows) allows you to enter a machine name and a password and returns true or false. From an API viewpoint, it's perfect, but from a protocol point of view, how does a Mac/linux/favorite non-MS connected hardware do the same thing? How is data sent? encrypted, plaintext, BCD? That is all defined in the protocol. No protocol? Then you have to break out Ethereal and reverse engineer it. Oh, sorry, you are in the US, and the DCMA seems to forbid that... and even if it does not, can you personally stand up to a large corporation's legal department?
Cheers,
Daniel