Could someone explain to me what a socket is? I see it in many acronyms in context of SSL, etc.
Also, why is it called a socket? Is it purely because it was what a name they invented? Or was it the first name they came up with?
A socket is just a logical endpoint for communication. They exist on the transport layer. You can send and receive things on a socket, you can bind and listen to a socket. A socket is specific to a protocol, machine, and port, and is addressed as such in the header of a packet.
A socket an abstraction. It provides a interface for applications to utilize a system resource (in this case the network connection) in a way that allows the operating system to mediate and organize the use of a limited resource by any number of applications.
If the data being sent through the socket could be thought of as envelopes of mail, then the socket would be your mail box. You attach a mailbox(socket) to your house(program) and put your outgoing mail(data) into it. At a scheduled time the mailman (operating system) comes along and picks up your outgoing mail and drops off any incoming mail in the same mailbox. Your outgoing mail is conveyed on your behalf to the recipient through the mailman's truck(network connection) along with all your neighbors' mail. This allows you to correspond with people far away without the need for the expense, time, difficulty, etc. of delivering the letter yourself.
As for why they're called 'sockets' well, the notion that the inventors get to call it whatever they want probably plays a large role there. Though, it's not a bad name in my opinion :)
In the simplest terms, a socket is a pseudo-file that represents a network connection. Once a socket has been created (using the proper primitives, and the proper parameters to identify the other host), writes to the socket are turned into network packets that get sent out, and data received from the network can be read from the socket.
In one regard, sockets are very similar to pipes: they look just like files to the programs using them, but do not result in read or writes to a disk; rather, they allow communicating with another program (local in the case of pipes, and possibly remote in the case of sockets). They also offer, as you mention, bidirectional communication (much like a pair of properly connected pipes could).
Finally, it is common for programs on a single machine to communicate using standard network protocols, such as TCP; it would be wasteful to go all the way to the network hardware (if any!), computing checksums, etc., just to go back to the same host: that's where Unix domains sockets come in. Those are much like regular sockets, except they connect processes on the same host rather than remote processes, and do not attempt to use any network resources at all. In this way, they are a medium of inter-process communication.
As tripleee mentioned, in the course of the history of BSD, pipes were introduced earlier than sockets, and were reimplemented using sockets once those existed. The same reference, The Design and Implementation of the FreeBSD Operating System, mentions that pipes were then reverted to a non-socket implementation for performance reasons: this certainly underlines the fact that pipes share similarities.
For udp or tcp over IP,
A socket address is the combination of an IP address and a port number.
An IP address is the address of a machine on the internet e.g.
However each machine must be able to provide more than one service, so most machines will provide http (web pages) on port 80, and ssh on port 22, and etc.
However there are other types of socket, see comments below.
Now, what is it?
A socket, or "socket" can be several things:
First of all, it is a thought model and an application programming interface (API). That means you have a set of rules you need to follow and a set of functions that you can use to write programs that do something, according to a precisely specified contract. In this particular case, something means exchange data with another program.
The sockets API widely abstracts the details of "communication" in general. It encapsulates who you talk with and how, all through one (almost) consistent and identical cookie-cutter form.
You do not need to know (and you do not even want to know!) whether you talk to another program on the same computer or on a different computer, or whether there is IPv4 or IPv6 network in between those computers, or maybe some other protocol that you have never heard of.
How does it compare to...
A pipe is a means of one way communication between a reader and a writer (both being programs) on the same computer. It simulates a stream of data (just like e.g. TCP).
A named pipe is, well, simply a pipe which owns a name in the filesystem. That is, it's something that looks and behaves just like a file, it appears in the directory listing and you can open it, write to it, etc etc. Note that you can also create socket special files (that would be a named socket).
A socket, on the other hand, is a means of two way ("duplex") communication, that means you can write to and read from the same socket, and you do not need two separate sockets for a two-way communication.
With that in mind, it is clear that sockets do something much more complicated and generally have more overhead than pipes (which are basically no more than a simple
Yes, sockets are one possible way of inter-process communication (shared memory and pipes being examples of alternatives). All at the same time, they are being used for "networking", as explained above.