Servers 101 - Lesson 1: What is a "Server"?



"My main server is a 2U rackmount server and it hosts my email server and my web server. My backup server is a desktop, not a server, and it normally runs my database server."

Confusing? You bet. There are servers and servers and servers, and they are all different.

First off, there's software. These servers are programs that provide a service, like an email server or a web server. It doesn't matter where these servers run, laptop, desktop or rackmount; they provide a service and are known as servers.

Next, there's hardware. These servers are computers built from "industrial grade" parts to withstand constant and frequent use, like a rackmount 2U processor frame. These servers are reliable, durable, and fast (as compared to hardware platforms like desktops or laptops that can be temperamental, fragile, or slow) that provide the computing power and data throughput that can accompany use of common programs.

Finally, there's the concept. These servers are systems that provide some value to external bodies. Almost any sort of hardware and software combination could be called a "server", so long as it provides some sort of service.

In this course, we'll explore the "software" variety of server, concentrating on their purpose and design. We'll learn a bit about their construction, and learn how to identify some of the common servers found on many Linux systems. This course will not cover the management, maintenance, or security of any one server; that's the topic of another course.

"What is a server?", "What is a client?"

Imagine that you have a hunger for a flame-broiled hamburger. You go to the counter of your friendly local burger joint, and a bright-eyed youngster asks you "May I take your order?"

You reply "One hamburger, mustard, relish, extra lettuce and tomato, hold the onion.", and wait patiently for a minute or two. Then, after that brief interlude, the bright-eyed youngster says "Here you are - one hamburger, just the way you like it.", and hands you your hot meat sandwich on a bun.

You pay your bill, take your hamburger to a table, and have a juicy, cholesterol-filled lunch.

So, what does a fast food lunch have to do with "servers"? The answer is that your lunchtime activities and the activities performed by a server are alike in many ways. At lunch, we had two immediate participants: the customer who ordered and received the hamburger, and the counter person who took the order and delivered the hamburger. On our computer, we have programs and processes that ask for and receive information, and programs and processes that receive requests and fulfil them. We call the processes that ask for things "clients" and the processes that answer the requests "servers".

The analogy goes deeper than this, though. Both "customer" and "client" initiate their respective interactions and wait for the other participant to act. Both "counterperson" and "server" wait for the other participant to initiate the interaction, and both only participate to the extend of answering the request. In both the computer and the hamburger joint, the counterperson/server handles, serially, many interactions with different customers/clients. Each interaction, computer or restaurant, will consist of at least one back-and-forth exchange, and may span several back-and-forth exchanges before the interaction is complete.

From this analogy, we get a pretty good picture of what a server and a client "is".

A server provides a service. It waits until someone (a client) asks for the service, and it then satisfies that request. The client, on the other hand, finds that it cannot perform some task on it's own, and so it asks the server to perform the task for it. The client waits patiently while the server takes care of the request, and then continues with it's own work when the server replies with the results.

Burger Joint

           customer           person

hunger ----->.
             |  "hamburger please"
             :                '
          (wait)               make burger
             :                '
             :  "here you go" '
 eat <-------'


          client             server    
data ------>
            |  "data please"
            :                  '
         (wait)                 compute data
            :                  '
            :  "here it is"    '