Introduction

Series Overview: This is Part 1 of our HTTP Server implementation series. We'll start with TCP fundamentals and gradually build up to a full-featured HTTP server.

Before diving into HTTP specifics, we need to understand and implement the foundational TCP layer that HTTP runs on. This first part focuses on creating a basic TCP server that can accept connections and handle data transfer.

TCP Basics

TCP Three-Way Handshake Diagram
TCP Three-Way Handshake Process

TCP (Transmission Control Protocol) provides reliable, ordered, and error-checked delivery of data between applications running on hosts communicating via an IP network.

Key Concepts:

  • Connection-oriented communication
  • Three-way handshake
  • Reliable data transfer
  • Flow control

Basic Implementation

Let's implement a basic TCP server in Go that can:

  • Listen on a specified port
  • Accept incoming connections
  • Handle multiple clients concurrently
  • Read and write data
main.go

package main

import (
    "fmt"
    "log"
    "net"
)

// Server represents our TCP server
type Server struct {
    host string
    port int
}

// NewServer creates a new TCP server instance
func NewServer(host string, port int) *Server {
    return &Server{
        host: host,
        port: port,
    }
}

// Start begins listening for connections
func (s *Server) Start() error {
    listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", s.host, s.port))
    if err != nil {
        return fmt.Errorf("failed to start server: %v", err)
    }
    defer listener.Close()

    log.Printf("Server listening on %s:%d", s.host, s.port)

    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Printf("Error accepting connection: %v", err)
            continue
        }

        // Handle each connection in a goroutine
        go s.handleConnection(conn)
    }
}
                        
Important: Always remember to close connections and handle errors appropriately in production code.