伺服器怎麼運作?從 Port、封包到監聽請求的世界

更新日期: 2025 年 4 月 3 日

當你打開瀏覽器輸入一個網址,例如 https://example.com,然後按下 Enter,不到幾秒鐘你就能看到一個網頁畫面出現在眼前。

這個過程看似簡單,實際上背後發生了許多運算與溝通,而這些動作幾乎都是由「伺服器」在背後默默完成的。

但伺服器是什麼?它到底怎麼接收使用者的請求,又是如何回應的?

如果你是剛踏入程式開發世界的新手,這篇文章將會一步步揭開伺服器運作的神秘面紗。

從 Port、封包開始,到程式如何監聽請求,再帶你認識 HTTP 與 HTTPS 的差別,讓你更清楚整個網路通訊的流程。


什麼是伺服器?

📌 伺服器其實就是一台特殊任務的電腦

說到「伺服器」(Server),很多人腦中可能會浮現一個巨大的機櫃,或者一間冷氣開很強的機房。

不過從本質上來說,伺服器其實就是一台開著特定程式的電腦,它的任務就是等待、接收並處理來自用戶的請求。

不同於你平常用來上網、打遊戲或寫報告的個人電腦,伺服器是專門為「提供服務」而存在的機器。這些服務可能是:

  • 提供網頁內容(像 Google、YouTube 的首頁)
  • 儲存與傳送圖片或影片(像 Instagram、Netflix)
  • 提供資料查詢或更新功能(像線上購物網站的商品查詢)
  • 處理使用者登入、註冊等帳號行為
  • 接收 API 請求,並回傳 JSON 資料給前端應用程式

這些行為的共通點就是:用戶(也就是我們)發送一個請求,伺服器收到後會回應相對應的資料,這樣的機制就像是在「點餐」一樣,客人點什麼,廚房就做什麼。

伺服器不是一定要長得「高大上」

從技術的角度來看,只要有安裝好伺服器程式、開啟特定的 port 並能夠接受網路請求的電腦,就可以稱為伺服器

舉例來說:

  • 你自己的筆電,只要用 Node.js 開一個伺服器,理論上就能當伺服器來用(例如:localhost:3000
  • 網路上的虛擬主機(VPS)、雲端服務(像 AWS、GCP)提供的機器,基本上都是遠端的伺服器
  • 一間公司可能在內網裡設有檔案伺服器、資料庫伺服器、郵件伺服器等等,負責不同任務

🌐 舉例說明:打開網頁時發生了什麼?

以最常見的情境為例,當你在瀏覽器中輸入 https://example.com 並按下 Enter,背後其實發生了以下事情:

  1. 瀏覽器送出一個請求(Request),透過網路傳送給 example.com 對應的伺服器。
  2. 該網站的伺服器收到請求後,確認你要的資源(例如首頁 HTML 檔案)。
  3. 伺服器組裝回應(Response)資料,傳送回使用者的電腦。
  4. 瀏覽器根據伺服器回傳的 HTML、CSS、JavaScript 資料,開始渲染網頁。

整個過程只花你幾秒鐘,但其實在網路背後早已完成了一次高效率的「點餐與送餐」流程,這全都要感謝伺服器隨時待命、處理任務的能力。

✅ 總結一句話:

伺服器就像是網路世界中的「店家櫃台」,永遠在線上,等待你的請求,並給你對應的資料或回應。

理解這一點,會讓你在學習網站開發的過程中更加得心應手,不再只是「按按鍵就出現畫面」這麼神秘而已。

接下來,我們會進一步認識伺服器是怎麼「開門迎客」的,也就是 —— Port 是什麼?

延伸閱讀:


什麼是 Port?為什麼它在網路世界中這麼重要?

📌 Port 是資料傳輸的「通道編號」,幫助一台電腦分工處理不同任務

在網路通訊的世界裡,每台電腦的 IP 位址就像一棟建築物的門牌號碼,用來標示這台電腦在網路中的位置。

不過,一棟建築物裡可能有許多部門、辦公室,每個部門負責不同的事情。這時,我們需要「房間號碼」來讓信件寄到正確的位置。

在網路世界中,這些房間號碼就是 Port(埠口)

一個 Port 就是一個特定服務的通訊入口,每個 Port 對應一個獨立的應用程式或通訊通道。

🧠 埠口原本的意思是什麼?為什麼叫「Port」?

Port 這個詞在原意上指的是港口、碼頭,船隻可以停靠在港口裝卸貨物、進出城市。

而在網路領域中,「Port」這個詞被借用來代表一個資料傳輸的接收點,資料(像一艘艘貨船)會被送到電腦上的某個 Port,就像船停靠在指定的港口,等待卸貨與處理。

這樣的命名方式,是為了幫助人們更直覺地理解資料流動的流程——從遠端送出,經過網路,最後停靠在電腦中的一個「資料入口」。

每個 Port 負責不同的通訊工作

一台電腦可以同時執行多種服務,例如網站伺服器、資料庫、聊天系統等。

為了讓這些服務互不干擾,它們會各自使用不同的 Port。

常見的 Port 舉例如下:

Port 號碼用途
80提供 HTTP 網頁(不加密)
443提供 HTTPS 網頁(加密傳輸)
21FTP 檔案傳輸服務
3000常見的前端開發伺服器
8080另一個常見的測試伺服器 Port

這些 Port 就像是同一棟大樓中不同部門的分機號碼,幫助資料準確送達。

flowchart LR
    Client[客戶端] --> Internet[網際網路]
    Internet --> Firewall[防火牆]
    Firewall --> Server[伺服器]
    
    subgraph Server[伺服器]
        Port80[埠口 80<br />HTTP 網頁服務] 
        Port443[埠口 443<br />HTTPS 安全網頁服務]
        Port22[埠口 22<br />SSH 遠程管理]
        Port21[埠口 21<br />FTP 檔案傳輸]
        Port3306[埠口 3306<br />MySQL 資料庫]
        Port25[埠口 25<br />SMTP 電子郵件發送]
        Port53[埠口 53<br />DNS 網域名稱解析]
        Port3389[埠口 3389<br />RDP 遠程桌面]
        PortOther[其他常用埠口]
    end
    
    Client -- HTTP --> Port80
    Client -- HTTPS --> Port443
    Client -- SSH --> Port22
    Client -- FTP --> Port21
    Client -- MySQL --> Port3306
    Client -- SMTP --> Port25
    Client -- DNS --> Port53
    Client -- RDP --> Port3389


延伸閱讀:初學者入門:什麼是「服務」?從軟體設計談起

為什麼不能只用一個 Port 處理所有請求?

當我們第一次學習網路伺服器的時候,很自然會問:

「既然一台電腦有 IP 地址可以接收資料,那我是不是只要開一個 Port,就能讓所有服務一起用這個通道處理?」

表面上看起來好像可以簡化很多事情,但實際上這樣做會產生嚴重的衝突與混亂,原因如下:

🧩 每個 Port 僅能對應一個程式:就像一支電話只有一位接聽者

在作業系統層級,每個 Port 在同一時間只能被一個應用程式所佔用

這是因為當資料傳入該 Port 時,作業系統需要知道該把這些資料交給哪一個應用程式處理。

如果兩個程式同時試圖「監聽」同一個 Port,系統就會無法判斷資料應該交給誰,進而導致錯誤,像是:

  • 程式啟動失敗(因為 Port 被佔用)
  • 封包被錯誤接收或無法處理
  • 應用程式之間互相干擾

你可以把它想像成這樣:

如果一支電話只有一支聽筒(Port),你不可能同時讓兩個人去接這通電話。否則,兩人都會搶著聽、誰也聽不清楚,甚至會接到錯的內容。


網路通訊靠的是「封包」:你送出去的其實是一份資料包裹

當你在瀏覽器中輸入一個網址(例如 https://example.com),然後按下 Enter,看似簡單的動作,其實背後啟動了一個完整的「請求-回應」流程

而這一切的傳遞媒介,就是我們這一段要介紹的主角——封包(packet)

你可以把封包想像成一個「資料包裹」,它會從使用者的電腦出發,經過網路的路由節點,一路被送到對應的伺服器。

然後伺服器打開封包、閱讀內容,再根據需求做出回應(再送一個封包回來給你)。

一個封包的結構:Header + Body 就像是信封與信件內容

封包的設計其實很有邏輯,它大致分為兩個主要部分:

🔹 1. Header(標頭):資料的「外包裝」與指引資訊

封包的 Header 就像是一張寫在信封上的地址單與備註,它不包含你真正要傳送的資料,但卻負責引導整封信正確抵達目的地。

Header 中會包含以下資訊:

項目說明
來源 IP / Port你這台電腦的 IP 位址與所用的 Port(方便對方知道怎麼回封)
目標 IP / Port你想要聯絡的伺服器位址與服務 Port(例如 port 443)
請求方式HTTP 方法:GET、POST、PUT、DELETE 等,說明你想對伺服器做什麼事
User-Agent表明你用的是哪種瀏覽器、作業系統等資訊
Cookie帶上登入狀態或個人化資訊
語言偏好(Accept-Language)讓伺服器知道你偏好中文還是英文等

📌 重點:Header 是讓封包「有頭緒地」送達並說明目的的地方,但不包含資料本體。

🔸 2. Body(主體):你真正想傳送的內容

封包的 Body 則是這一趟通訊的「主角」,真正要傳遞的資料會被包在這裡。

根據請求的性質,Body 的內容可能會是:

  • 使用者填的表單資料(例如註冊帳號)
  • JSON 格式的 API 傳輸資料(常見於前後端溝通)
  • 上傳的圖片、音樂或檔案
  • 任意字串、參數等資料

有趣的是,某些請求(例如 GET 請求)是不包含 Body 的,因為它只想向伺服器「索取資料」,而不是「送出資料」。

封包送到伺服器後,發生了什麼事?

當封包透過網路抵達伺服器,接下來就是伺服器的工作:

  1. 解析 Header:
    • 確認這個封包是給哪個服務(依 Port 分派)
    • 判斷用戶想執行的操作(GET?POST?)
    • 讀取 cookie、語言等額外資訊,調整行為
  2. 處理 Body:
    • 根據封包中傳來的資料,進行查詢、儲存、驗證、上傳等操作
    • 然後伺服器會組裝自己的回應資料,再「打包成另一個封包」送回給使用者

這一來一往的封包交換,就是我們在瀏覽網頁、使用 App、傳送訊息時背後默默進行的資料交換過程。

✉️ 封包比喻:就像是「快遞寄信」流程

為了幫助你更具體地理解,這裡用一個生活中的比喻:

封包的部分對應日常生活的…
Header寄件人 / 收件人地址、註記、運送方式等
Body信件內容、附件、填寫表格
伺服器郵局收件櫃台,收件後根據內容做處理
回應封包郵局回信給你(寄件確認、資料回覆)

✅ 小結:封包是讓網路世界溝通順暢的基礎單位

  • 當你發送請求,實際上是送出一個「封包」
  • 封包分為 Header(導引與說明)Body(實際內容)
  • 伺服器根據 Header 決定如何處理封包,再根據 Body 執行任務
  • 封包是現代網際網路中不可或缺的通訊單位

伺服器怎麼「聽」請求?——監聽 Port 的概念

📌 程式必須主動打開 Port,才能接收來自外部的請求

前面我們提到,一台電腦上可以開啟很多個 Port,每個 Port 就像一個專用的通訊管道。

但這些管道平常是關閉的,只有當某個程式「主動打開」某個 Port 並準備好「監聽」的時候,資料才有辦法被接收並處理。

換句話說,只有開門迎客,才有人能進來。

程式範例:用 Node.js 開一個監聽 Port 的伺服器

我們可以用一段簡單的 Node.js 程式來示範這個概念:

const express = require('express');
const app = express();

app.listen(3000, () => {
  console.log('伺服器正在監聽 port 3000');
});

這段程式的作用是:

  • 告訴作業系統:「我要接管 Port 3000,請把所有送到這個 Port 的請求都轉給我」
  • 一旦程式啟動,它就會進入「等待」狀態,直到有請求進來
  • 當使用者(例如瀏覽器)發送請求到 http://localhost:3000,這支程式就會被觸發、處理請求並回應內容

這種程式設計模式稱為 事件導向(event-driven)架構,Node.js 正是以這種模式運作的代表。

🔁 所謂「監聽(listen)」本質上就是一個不斷運作的等待迴圈

當伺服器程式開始監聽某個 Port 時,它就像是在背景裡啟動了一個無限迴圈,大致會做以下事情:

  1. 檢查有沒有新的封包進來
  2. 如果有,分析這個封包屬於哪一種請求(GET、POST、PUT 等)
  3. 根據請求內容,觸發對應的邏輯(例如回傳一個 HTML 或資料)
  4. 回應用戶,然後回到迴圈的起點,繼續等待下一個請求

這就是為什麼伺服器常被形容為「隨時待命的程式」,它的本質就是不斷重複上面的流程,直到你手動關掉它。

類比說明

這一切聽起來還是有點抽象嗎?沒關係,讓我們用一個類比幫助你理解:

網路世界的元素類比成現實世界的…
電腦(IP)一座城市
Port(埠口)城市裡的不同港口
封包(Packet)一艘艘運送資料的貨船
Header / Body船單 / 船上的貨物內容
程式的監聽功能港口的接收人員與報關流程

📦 網路請求流程就像貨船停靠港口:

  1. 使用者發送請求(寄出貨船)
  2. 封包透過網路(航道)前進,依照 IP 尋找目標電腦(城市)
  3. 到達電腦後依照 Port(港口)決定去哪一個服務
  4. 港口的接收人員(伺服器程式)檢查船單(Header)、打開貨物(Body)
  5. 根據內容給出對應的回應(回船、通知處理結果)

這個比喻能幫助你理解為什麼 Port 如此重要:它是整個系統中讓資料不迷路、能正確處理的分流機制

✅ 小結

  • Port 是讓一台電腦能處理多種服務的必要機制
  • 每個 Port 只能被一個程式使用,不能共用
  • 伺服器會主動監聽 Port,接收請求並回應結果
  • 用「港口與貨船」的比喻能更直覺理解網路通訊的流程

延伸補充:HTTP 與 HTTPS 有什麼不同?為什麼加密這麼重要?

在你每天瀏覽網頁、登入網站、線上購物時,背後其實使用的是一種叫做 HTTP(或 HTTPS) 的通訊協定。

這個協定規定了「用戶端(你)和伺服器之間怎麼傳資料」,就像是雙方說話的語言規則。

但你可能會注意到,有些網址開頭是 http://,而有些是 https://,甚至瀏覽器還會幫你顯示一個小鎖頭 🔒 —— 這代表什麼意思?

HTTP:明文傳輸,像是大聲朗讀給路人聽

  • 全名: HyperText Transfer Protocol
  • 傳輸方式: 明文傳輸(Plain Text)
  • 預設通訊 Port: 80

當你使用 HTTP 傳送資料時,資料在網路上是未加密的原始內容,任何經過資料通道的中間設備(例如 Wi-Fi 路由器、網路供應商、駭客的攔截工具)都可以看到這些資料。

這就好比你在大馬路上寄信,不裝信封,直接把內容寫在明信片上。郵差、路人都可以偷看你寫了什麼。

⚠️ HTTP 的資安風險

以下是幾個實際風險情境:

  • 登入密碼被竊取:你在使用 HTTP 網站登入帳號,密碼就會以明文在網路中傳輸,駭客只要攔截一次,就能盜用你的帳號。
  • 表單資料外洩:填寫的個資(像姓名、地址、電話)都可能被第三方看到。
  • 內容遭篡改:有人可以在資料送達你電腦之前偷偷改掉內容,例如注入惡意程式碼。

HTTPS:加密傳輸,像是上鎖的信封寄件

  • 全名: HyperText Transfer Protocol Secure
  • 傳輸方式: 加密傳輸(使用 SSL / TLS 加密協定)
  • 預設通訊 Port: 443
  • 瀏覽器小鎖頭: 🔒 代表網站啟用 HTTPS 加密

HTTPS 是 HTTP 的升級版本,在資料傳送前會先透過 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)進行加密

這種加密技術會在用戶端和伺服器之間建立一條安全的「加密通道」,確保資料無論經過多少跳轉節點,都無法被第三方讀取或竄改。

就像是你把信件裝進上鎖的保險箱裡,再交給快遞運送。除了收件人以外,誰都無法打開這份資料。

🔐 HTTPS 帶來的好處

優點說明
保護隱私密碼、信用卡、個資等都不會在傳輸過程中外洩
防止竄改傳輸過程中的內容無法被中途修改
提高信任感使用者看到 🔒 鎖頭或綠色網址列會更安心
搜尋排名加分Google 等搜尋引擎會優先推薦使用 HTTPS 的網站
必備條件若網站要使用如 Web Push、地理位置存取、PWA 等新功能,必須是 HTTPS 協議下才能啟用

🧪 小補充:SSL vs TLS?

你常常會聽到「SSL 憑證」、「TLS 加密」,這兩者到底有什麼關係?

  • SSL(Secure Sockets Layer) 是早期的加密技術,但已經逐漸淘汰
  • TLS(Transport Layer Security) 是現在主要使用的標準,更安全、更現代
  • 雖然現在用的其實是 TLS,但大家還是習慣叫「SSL 憑證」,其實指的是同一件事

為什麼 HTTP 和 HTTPS 要使用不同的埠口?

簡短答案是:

因為 HTTP 和 HTTPS 是兩種不同的協定,它們彼此不相容,需要不同的處理方式與程序,因此必須使用不同的埠口來分開。

1. HTTP 和 HTTPS 使用的是不同的協定流程

雖然 HTTPS 是「加密過的 HTTP」,但它在連線建立的過程中,其實比 HTTP 多了一個加密階段(SSL/TLS 握手),這兩者在技術上是完全不一樣的通訊協議流程。

  • HTTP:直接交換明文資料
  • HTTPS:先進行 TLS 握手協議 → 雙方建立加密通道 → 再交換資料

如果使用相同的埠口,伺服器一開始就無法知道「這個請求到底是明文的 HTTP 還是加密的 HTTPS」,無從判斷要用哪一種方式處理,可能導致解析失敗、資料錯亂,甚至回應錯誤。

2. 伺服器程式需要根據埠口來決定使用哪一種協定

在實務上,大部分的 Web 伺服器(像 Nginx、Apache、Node.js)都會根據「Port 號」來決定使用哪一種協定來處理封包。

Port 號碼處理協定程式會這樣理解
80HTTP不用加密,直接處理明文資料
443HTTPS啟用 TLS 解密流程,建立安全連線

這樣的設定讓伺服器可以同時開兩個 Port,分別接收 HTTP 和 HTTPS 請求,運作起來互不干擾,穩定又清晰。

3. 歷史沿用與標準化設計

早期在網際網路協定被定義的時候(RFC 標準),就已經為各種常用的協定分配了「知名埠口(Well-known Ports)」,例如:

協定Port
HTTP80
HTTPS (HTTP over SSL/TLS)443
FTP21
SSH22

這種標準化設計好處是:

  • 使用者不需要每次輸入網址時指定 Port(例如:只要輸入 https://example.com,瀏覽器會自動幫你連到 443)
  • 瀏覽器與伺服器的行為更一致,減少錯誤

🧪 如果硬要讓 HTTP 和 HTTPS 共用同一個 Port,會怎樣?

雖然在理論上可以寫一支超複雜的程式來「動態分析請求是否加密」,但這會:

  • 增加程式負擔與錯誤風險
  • 延遲回應時間(必須先解析是什麼協定)
  • 破壞原本的標準流程,導致瀏覽器與中介設備無法正常處理

所以實務上絕對不會讓兩者共用同一 Port,而是分開來做,這樣設計更清晰、也更安全。

✅ 小結:使用不同 Port,是為了清楚分工與穩定運作

  • HTTP 和 HTTPS 雖然服務內容類似,但技術層面完全不同
  • 使用不同的 Port(80 和 443),可以幫助伺服器判斷要採用哪一種協定流程
  • 這是網路標準化的設計,已被廣泛採納,符合協定與安全性需求

延伸閱讀:HTTP 與 HTTPS 的差別:新手完整指南


結語:理解伺服器是寫程式的起點

不論你是要學前端還是後端,了解「伺服器怎麼運作」都會是你邁向網路開發的重要基礎。

從 port 的角色、封包的組成,到伺服器監聽的原理,這些觀念會在你日後寫 API、串接資料或是部署網站時,不斷派上用場。

希望這篇文章能幫助你對網路世界有更清晰的認識,未來學習起來也更加順利!

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *