Chapter 02 · Instance Architecture, Services, Configuration, Databases, and Files
SQL Server Services, Instances, Ports, Protocols, Endpoints, and Connection Lifecycle
Trace a SQL Server client from instance/service discovery through transport, TDS/TLS, authentication, session creation, and pooling; prove the effective listener and connection with current engine evidence.
Learning outcomes
ServiceHub’s SQL Server process is running, yet an application deployed on another machine reports “server not found.” The operations dashboard says the Windows service is green, so a teammate assumes the database is healthy and reachable. That conclusion collapses several different layers—service state, instance naming, protocol enablement, port discovery, firewall reachability, TLS/authentication, session creation, and application pooling—into one checkbox. This lesson turns those layers into an evidence trail.
Distinguish a Database Engine instance from the operating-system services associated with it, including SQL Server Agent and SQL Server Browser where applicable.
Explain default versus named instances, TCP listeners, dynamic versus static ports, endpoints, and why Windows and Linux deployment models differ.
Trace a connection from server/instance resolution through TCP/TDS, encryption/authentication, session establishment, database context, and client-side pooling.
Use SERVERPROPERTY, catalog views, and connection DMVs to prove the instance and transport actually used by a session.
Diagnose the common failure “the service is running but clients cannot connect” without randomly disabling firewalls or encryption.
The course baseline is ServiceHubLab on SQL
Server 2025 (17.x), with compatibility level 170 where
supported. Chapter 01 used explicit server/build evidence and
a least-privilege servicehub_app login. This
lesson does not require changing the ServiceHub schema; it
investigates how a client reaches that database.
1. A running service is only the first boundary
On Windows, a default Database Engine instance commonly appears
as the SQL Server (MSSQLSERVER) service. A
named instance uses a distinct service identity such as
MSSQL$INSTANCE1. SQL Server Agent is a separate
service that schedules jobs; SQL Server Browser is another
service used for instance/port discovery in Windows scenarios.
Starting one service does not prove the others exist, are
enabled, or are needed.
Linux has a materially different model. SQL Server 2025 on Linux supports a single default instance per host rather than Windows-style named instances, so there is no SQL Server Browser requirement for resolving named instances. If multiple isolated SQL Server engines are needed on one Linux host, containers or VMs provide the isolation and each listener must use a distinct host port. Treat “instance” as a Database Engine boundary, not merely a hostname alias.
Do not copy Windows named-instance instructions into a Linux deployment. Conversely, do not assume that a Windows named instance listens on TCP 1433. Current Microsoft documentation describes named Windows instances as using dynamically assigned TCP ports by default unless you configure a static port.
2. Default instance, named instance, server name, and port are different identifiers
A client can identify a target in several ways. A Windows
default instance is often addressed by hostname alone. A named
Windows instance can be addressed as
SERVER\INSTANCE, in which case instance discovery
may be involved, or directly with a TCP host and port such as
tcp:db01.example.test,51433. A direct host/port
connection removes Browser discovery from the path but still
depends on TCP being enabled, the listener actually binding that
port, network routing/firewall rules, and the server accepting
the login.
Port 1433 is the conventional default-instance TCP port, not a law of SQL Server networking. A default instance can be configured on another port, a named instance can use a static port, and containers routinely publish an arbitrary host port to container port 1433. Production runbooks should record the effective endpoint rather than infer it from the instance name.
SELECT SERVERPROPERTY('MachineName') AS machine_name, SERVERPROPERTY('ServerName') AS server_name, SERVERPROPERTY('InstanceName') AS instance_name, SERVERPROPERTY('IsClustered') AS is_clustered, SERVERPROPERTY('Edition') AS edition, SERVERPROPERTY('ProductVersion') AS product_version, SERVERPROPERTY('ProductUpdateLevel') AS product_update_level;GOSELECT @@SERVERNAME AS configured_server_name, DB_NAME() AS current_database, @@SPID AS session_id;GO
A default instance commonly reports NULL for
InstanceName; that is not evidence that “there is
no SQL Server instance.” Record ServerName,
edition/build, and the endpoint used by the client. A renamed
host can also expose stale @@SERVERNAME metadata
until it is corrected, so no single field should carry the whole
diagnosis.
3. The listener and endpoint must agree with the connection string
SQL Server models network listeners as endpoints. The system TDS endpoint is what ordinary Database Engine clients use. Endpoint metadata is useful for proving configured state, but a catalog row alone does not prove that a remote packet can cross a firewall or that DNS resolves to the intended host.
SELECT name, endpoint_id, state_desc, type_desc, protocol_descFROM sys.endpointsWHERE type_desc = 'TSQL';GOSELECT c.session_id, c.net_transport, c.protocol_type, c.protocol_version, c.encrypt_option, c.auth_scheme, c.local_net_address, c.local_tcp_port, c.client_net_address, c.connect_timeFROM sys.dm_exec_connections AS cWHERE c.session_id = @@SPID;GO
For a TCP connection, local_tcp_port is especially
useful because it tells you which port accepted
this connection. Local same-machine connections can use
shared memory on Windows; in that case TCP-specific address/port
fields can be null. The DMV proves the transport observed by SQL
Server for this session. It does not prove that every client can
reach the same endpoint or that a future pooled connection will
use identical client-side settings.
4. Connection lifecycle: resolution → transport → TDS/TLS → authentication → session
A useful mental model is a sequence of gates. First, the client resolves the target name or instance to an address/port. Second, it establishes the transport, commonly TCP. Third, the client and server perform protocol pre-login negotiation, including encryption behavior appropriate to the driver and server configuration. Fourth, credentials are authenticated. Only after those gates succeed does SQL Server establish a session, apply login defaults, enter an initial database, and begin executing batches.
Connection pooling sits mainly in the client/driver layer. A pool can reuse an existing physical connection for many logical application requests. Therefore “the application opened 500 logical requests” does not necessarily mean SQL Server accepted 500 new TCP/TLS/authentication handshakes. Later observability lessons distinguish sessions, requests, connections, workers, and application-level requests instead of treating them as interchangeable counters.
| Gate | Typical failure | Evidence to collect |
|---|---|---|
| Name/instance resolution | Unknown host/instance or Browser unavailable | Exact connection string, DNS result, Browser/static-port design |
| TCP reachability | Timeout/refused connection | Listener port, firewall/routing, OS socket state |
| TDS/TLS negotiation | Encryption/certificate error | Driver settings, certificate identity, server error log |
| Authentication | Login failed | Authentication mode, login state, error-log reason |
| Database/session setup | Cannot open default database | Login default DB, database state, user mapping |
5. Deliberately wrong approach: “it is SQL Server, therefore use 1433”
A team deploys a Windows named instance OPS. The
service starts successfully, but the application hard-codes
tcp:db01,1433. The instance is actually listening
on a dynamic port. Engineers disable the firewall entirely and
still cannot connect because the client is aimed at the wrong
endpoint.
Service state answers “is the engine process running?” It does not answer “what protocol and port is it listening on?” Query the connection/endpoint metadata locally, inspect the SQL Server Configuration Manager network configuration on Windows, and read the error log for listening-address messages. Then choose either explicit Browser-backed named-instance discovery or an intentionally configured static port.
For predictable server-to-server/app deployments, many teams assign a documented static TCP port to the Windows instance and open only the required network path. Do not change ports in a shared environment without a rollback plan: existing clients, aliases, monitoring, firewalls, AG endpoints, and operational scripts can depend on the current configuration.
6. Hands-on lab: build a connection evidence card
This mandatory lab is read-only and works with a free local Developer/Express instance. Use the supported client you already established in Chapter 01. If you are on Windows and your local client used shared memory, also make one explicit TCP connection to the configured listener so that you can compare transports. Do not enable protocols, change ports, or modify firewall rules merely to make the exercise look like the sample.
USE ServiceHubLab;GOSELECT SYSDATETIMEOFFSET() AS observed_at, SERVERPROPERTY('ServerName') AS server_name, SERVERPROPERTY('InstanceName') AS instance_name, SERVERPROPERTY('ProductVersion') AS product_version, SERVERPROPERTY('Edition') AS edition, DB_NAME() AS database_name, @@SPID AS session_id;GOSELECT session_id, net_transport, protocol_type, encrypt_option, auth_scheme, local_net_address, local_tcp_port, client_net_address, connect_timeFROM sys.dm_exec_connectionsWHERE session_id = @@SPID;GOSELECT name, state_desc, type_desc, protocol_descFROM sys.endpointsWHERE type_desc = 'TSQL';GO
Save the output together with the exact client target you typed, but do not save a password. Your evidence card should answer: Which Database Engine build accepted the session? Was it a default or named instance? Which transport did this session use? If TCP, which local server port accepted it? Was the connection encrypted? Which authentication scheme was reported?
Verification checklist
-
The output identifies the expected SQL Server 2025 lab
instance and
ServiceHubLab. - You can explain why a null instance name can still represent a valid default instance.
- You can distinguish endpoint configuration from end-to-end client reachability.
- You have not changed a listener, Browser service, firewall, or TLS setting merely for the lab.
- On Linux, you explicitly record that the supported model is one default instance per host; multiple engines require containers/VMs and distinct ports.
7. Production judgment and next bridge
Connection incidents should be debugged from the outside inward
or inside outward with evidence, not with random configuration
changes. Record instance identity, configured/listening protocol
and port, DNS/instance discovery, network path, TLS policy,
authentication mode, default database, and driver version. A
green Database Engine service is necessary but insufficient. A
successful sqlcmd connection proves only that one
client path worked under those credentials/settings.
The next lesson moves from “which instance accepted me?” to
“what databases make the instance itself function?” That
distinction matters for recovery: losing master,
corrupting msdb, or exhausting
tempdb has very different consequences from losing
a ServiceHub user table.
Check your understanding
- Why does a running SQL Server service not prove that a remote application can connect?
- What is the difference between a default Windows instance and a named Windows instance from a port-discovery perspective?
- Why is SQL Server Browser not part of the normal SQL Server 2025 on Linux connection model?
- What does sys.dm_exec_connections prove, and what does it not prove?
- Where does connection pooling primarily live: inside SQL Server storage engine or in the client/driver/application layer?
Review the answers
The service proves the engine process started. Reachability also depends on protocol enablement, listener/port, name resolution, routing/firewall, TLS negotiation, authentication, and database/session setup.
A default instance commonly uses the conventional configured port directly; Windows named instances commonly use dynamic ports unless a static port is configured and can rely on Browser/instance discovery when clients specify SERVER\INSTANCE.
Current SQL Server 2025 on Linux supports one default instance per host, so there are no Windows-style named instances for Browser to resolve. Multiple engines are normally isolated in VMs/containers with separate ports.
It reports the transport/authentication/encryption/address state observed for actual SQL Server connections. It does not prove DNS/firewall reachability for every client, certificate hostname validation policy, or future driver behavior.
Pooling is a client/driver/application concern that reuses physical connections; SQL Server sees the resulting connections/sessions, not the application pool’s logical checkout abstraction.
Authoritative references
- Connect to the SQL Server Database Engine — default/named instance connection forms and protocols
- Network protocols and network libraries — TCP defaults, named-instance dynamic ports, and endpoint concepts
- SQL Server 2025 on Linux supported features — single-instance Linux model and Browser-service boundary
- sys.dm_exec_connections — connection transport, encryption, authentication, and address evidence
- SQL Server 2025 servicing history — current 17.x build baseline checked for this chapter