Inden for datalogi er klient-server en softwarearkitekturmodel bestående af to roller: klientsystemer og serversystemer, som kommunikerer via et computernetværk eller på den samme computer. En klient-server-applikation er et distribueret system, der består af både klient- og serversoftware. Modellen gør det muligt at fordele arbejdsbyrden effektivt: klientprocessen initierer ofte forbindelsen til serveren, mens serverprocessen normalt lytter og venter på klientanmodninger, behandler dem og returnerer resultater.
Når både klientprocessen og serverprocessen kører på den samme computer, kaldes dette en enkeltopsætning (standalone). I praksis køres klient- og serverkomponenter dog ofte på separate maskiner eller i forskellige containere/tjenester i et datacenter eller i skyen.
En beslægtet arkitektur er peer-to-peer, hvor hver vært eller programinstans både kan fungere som klient og server. I sådanne systemer er ansvar og status ofte symmetriske i modsætning til den centraliserede klient-server-model. Peer-to-peer-arkitekturer forkortes ofte med forkortelsen P2P.
Klient-server-forholdet beskriver, hvordan en klient sender en tjenesteanmodning til en server, hvordan serveren accepterer og behandler anmodningen, og hvordan den returnerer de ønskede oplysninger. Interaktionen mellem klient og server visualiseres ofte med sekvensdiagrammer, som er standardiseret i Unified Modeling Language (UML).
Både klient-server- og P2P-arkitekturer er udbredte i dag. Den grundlæggende type klient-server-arkitektur anvender kun to typer værter: klienter og servere. Denne type kaldes ofte to-niveau arkitektur, hvor klienten udgør det ene lag og serverprocessen det andet.
Klient-server-modellen er en af de fundamentale modeller for netværkscomputere. Mange standardtjenester — som e-mail, webadgang og databaseadgang — er baseret på denne model. For eksempel er en webbrowser et klientprogram, der anmoder om data fra webservere rundt om i verden.
Hvordan fungerer en klient-server-applikation?
- Anmodning: Klienten opretter en forbindelse til serveren og sender en forespørgsel (fx HTTP GET/POST, databaseforespørgsel, SMTP-besked).
- Behandling: Serveren modtager anmodningen, validerer den, udfører nødvendige operationer (læse/skriv til database, behandle logik eller hente filer) og danner et svar.
- Svar: Serveren sender svar tilbage til klienten, som præsenterer eller viderebehandler dataene for brugeren.
- Tilstand: Kommunikation kan være stateless (ingen server-side session gemmes mellem anmodninger, fx HTTP uden session) eller stateful (serveren gemmer sessionsoplysninger mellem anmodninger, fx ved visse databaseforbindelser eller game servers).
Typer af klient-server-arkitektur
- To-lags (client–server): Klient og server direkte kommunikation. Enkel at udvikle, velegnet til små systemer.
- Tre-lags: Præsentationslag (klient), applikationslogik (mellemserver eller applikationsserver) og datalag (database). Øger modularitet og skalerbarhed.
- Multilags/n-lags: Yderligere specialiserede lag (f.eks. cache, API-gateways, mikroservices) for større systemer med krav til høj tilgængelighed og vedligeholdelse.
Protokoller og teknologier
Klient-server-systemer bruger en række standardprotokoller afhængigt af tjenesten: HTTP/HTTPS (web), SMTP/IMAP/POP3 (e-mail), FTP/SFTP (filoverførsel), TCP/UDP (transport), SQL over TCP (database), og mange andre. Valget af protokol påvirker ydeevne, pålidelighed og sikkerhed.
Sikkerhed og pålidelighed
- Autentifikation og autorisation: Sikre at kun godkendte klienter får adgang, og at adgange er begrænsede efter rettigheder.
- Kryptering: Brug af TLS/SSL til at beskytte data under transport.
- Inputvalidering: Forebyg angreb som SQL-injektion og XSS ved at validere og sanitere input på serveren.
- Firewall og netværkssikkerhed: Begræns adgang til servere via netværksregler og segmentering.
- Fejltolerance: Redundans, back-up og overvågning for at sikre høj tilgængelighed og hurtig genopretning ved fejl.
Skalering og ydeevne
Skalering af klient-server-systemer kan ske på flere måder:
- Vertikal skalering: Øge ressourcer (CPU, RAM) på enkelte servere.
- Horisontal skalering: Tilføje flere serverinstanser bag en load balancer for at fordele belastningen.
- Caching: Reducere belastning på servere/database ved at cache ofte anvendte svar (f.eks. via CDN eller in-memory caches).
- Asynkron behandling: Bruge køer og baggrundsprocesser til at afvikle tunge opgaver uden at blokere klientrespons.
Fordele og ulemper
- Fordele: Centraliseret styring af data og logik, nemmere sikkerhedskontrol og backup, skalerbarhed via serverarkitektur, klar rollefordeling mellem klient og server.
- Ulemper: Centraliseret server kan blive enkelt fejlpunkt, kræver oftest mere infrastruktur og vedligeholdelse, potentielt højere latenstid hvis netværksforbindelsen er langsom.
Sammenligning med peer-to-peer
Klient-server er centraliseret: serveren tilbyder ressourcer og tjenester, klienten forbruger dem. I P2P kan hver node både tilbyde og forbruge tjenester, hvilket øger decentralisering og robusthed for visse applikationer (fx fildeling), men ofte på bekostning af central kontrol og konsistens.
Eksempler på anvendelse
- Webtjenester: Browser (klient) → webserver (server) via HTTP/HTTPS.
- E-mail: Mailklient → mailserver via SMTP, IMAP eller POP3.
- Databaser: Applikation (klient) → databaseserver, fx ved forespørgsler i SQL.
- Fjernadgang og API’er: Mobilapp eller frontend kommunikerer med backend-API’er.
Implementeringsovervejelser
- Stateless vs stateful: Stateløse design er ofte nemmere at skalere og fejltolerere; stateful kræver sessionstyring eller delte datalagre.
- Observabilitet: Logging, metrics og tracing hjælper med at forstå systemets adfærd og fejlfinde i distribuerede miljøer.
- Deployment: Moderne deploymentmønstre omfatter containere, orkestrering (f.eks. Kubernetes) og microservices, som påvirker, hvordan klient-server-komponenter designes og skaleres.
Samlet set er klient-server-arkitekturen en fleksibel og veletableret model til opbygning af netværksapplikationer. Den klarlægger roller, gør vedligeholdelse og sikkerhed lettere og kan udvides til både små og meget store systemer ved hjælp af etablerede designmønstre og teknologier.


