Sockets
In short: An endpoint of a network connection, defined by the combination of IP address and port — the programming interface through which applications actually send and receive data.
In more detail: A socket is the concrete implementation of what operating systems provide to programs for establishing network connections (“open a socket”, “bind a socket”). On Windows systems, WinSock takes on this task; on Unix systems, the BSD socket API.
In Depth
A socket is uniquely identified by five values: protocol (TCP or UDP), local IP address, local port, remote IP address, remote port — this “5-tuple” lets the operating system kernel distinguish every single connection unambiguously. For programmers, the socket API provides a few basic operations: socket() (create a new socket), bind() (reserve a local port), listen()/accept() (wait for incoming connections, on the server side), connect() (establish a connection to a server, on the client side) as well as send()/recv() for actually sending and receiving data.
This API is the common foundation on which practically every higher-level network library builds — when a program makes an HTTP request, for example, the HTTP library used internally opens a TCP socket, connects it to the target server and sends the formatted HTTP request over it as raw bytes. For developers this is usually invisible, because modern languages and frameworks hide these low-level details behind more convenient abstractions.