First of all, I'll just say that I haven't tried making an ftp program before in any language. Maybe you could search for an ftp component. I think Indy is a major internet components package so it might have an ftp component. Having said that, I have developed a file transfer program in C with WinSock but that was using a simple protocol I made up myself.
FTP stands for File Transfer Protocol. As you can guess, it lets you transfer files from one computer to another. One computer acts as a server, and many others can be it's client. In your case, you might run the server (which waits to detect anyone trying to connect) and your friend might run an ftp client. Your friend would try and connect to your server, with passwords of course. Now, he can request files from your computer and download them. Of course, you can be the client and he can be the server, but they are two separate programs. There's also nothing to stop you from running a client and server at the same time so you both can download files from each other.
As for the protocol part it's basically just an agreement. I'm not familiar with the ftp protocol so I'll just give a generalised example. When you want to download a file, you might send the string 'get filename'. Now if there wasn't an agreement on what each string means, the server wouldn't understand your request. So the protocol might say that 'get filename' means that the client wants to download the filename file. So the protocol is basically just a formalised set of rules that enable clients and servers to understand each other. That's why there can be so many different ftp clients and servers. They're all different programs but because they use the same protocol, each can understand the other.
It's very similar to HTTP.
If you're still unsure on anything, don't hesitate to ask.