13/34 Port Các chương

Gói tin tới đúng dịch vụ bằng cách nào?

Port dùng để làm gì?

Trình duyệt vừa hỏi DNS và biết website nằm ở:

203.0.113.9

Có thể xem địa chỉ IP giống như địa chỉ của một ngôi nhà.

Nó giúp dữ liệu tìm tới đúng máy.

Nhưng trong ngôi nhà đó có thể có nhiều chương trình cùng dùng mạng:

Web server
SSH
PostgreSQL

Tất cả đều ở chung một địa chỉ IP.

Vậy khi dữ liệu tới nơi, hệ điều hành biết phải giao nó cho chương trình nào?

Một địa chỉ, nhiều cổng

Hãy tạm hình dung máy tính như một ngôi nhà có nhiều cổng.

203.0.113.9

┌──────────────────────┐
│      Một máy tính    │
│                      │
│  cổng 22   → SSH     │
│  cổng 443  → Web     │
│  cổng 5432 → Postgres│
│                      │
└──────────────────────┘

Địa chỉ IP đưa dữ liệu tới đúng ngôi nhà.

Port cho biết dữ liệu phải đi vào cổng nào.

Ví dụ:

203.0.113.9:443

có thể đọc là:

máy 203.0.113.9
        ↓
     port 443
        ↓
    web server

Nếu dữ liệu được gửi tới:

203.0.113.9:22

hệ điều hành sẽ giao nó cho chương trình đang lắng nghe ở port 22, thường là SSH.

Nếu gửi tới:

203.0.113.9:5432

nó có thể được giao cho PostgreSQL.

Cùng một máy, bốn port đích

Gói tin gửi tới 203.0.113.9

port đích: 443

✓ tới :443

port đích: 22

✓ tới :22

port đích: 5432

✓ tới :5432

port đích: 9999

✕ không ai nhận

Máy chủ

203.0.113.9

hệ điều hành đọc port đích: 9999

:443 Dịch vụ web

đã nhận 1 gói

:22 SSH

đã nhận 1 gói

:5432 Cơ sở dữ liệu

đã nhận 1 gói

Không có dịch vụ nào đang lắng nghe ở port 9999.

Port thực ra chỉ là một con số

Ẩn dụ “cổng” giúp dễ hình dung, nhưng trong máy tính không có cánh cửa nào thực sự mở ra.

Port chỉ là một con số từ 0 đến 65535 nằm trong phần đầu (header) của gói TCP hoặc UDP.

Ví dụ một gói TCP có thể chứa:

IP đích:    203.0.113.9
Port đích:  443

Khi gói tới máy, hệ điều hành nhìn vào port 443 và kiểm tra:

Chương trình nào đang lắng nghe ở port 443?

Nếu web server đang lắng nghe ở đó, dữ liệu được giao cho web server.

Nếu không có chương trình nào lắng nghe ở port đó, sẽ không có chương trình nào nhận dữ liệu.

Máy gửi cũng có port

Có một điều hơi lạ:

Không chỉ server có port. Máy của bạn cũng có.

Ví dụ trình duyệt tạo một kết nối:

192.168.1.20:53142 → 203.0.113.9:443

Ở phía server:

443

cho biết dữ liệu đi tới web server.

Ở phía máy bạn:

53142

giúp hệ điều hành nhận ra kết nối của trình duyệt.

Port này thường được hệ điều hành chọn tạm thời nên gọi là port tạm (ephemeral port).

Ví dụ máy bạn có thể mở hai kết nối:

192.168.1.20:53142 → 203.0.113.9:443

192.168.1.20:53143 → 203.0.113.9:443

Cả hai cùng đi tới port 443 của server.

Nhưng phía máy khách có port khác nhau:

53142
53143

Nhờ vậy hệ điều hành có thể phân biệt hai kết nối.

Một kết nối có hai đầu

Có thể nhìn một kết nối TCP như đường nối giữa hai đầu:

192.168.1.20:53142
          ↕
203.0.113.9:443

Mỗi đầu gồm:

IP + port

Vì vậy một kết nối TCP được phân biệt bằng bốn giá trị:

IP nguồn
port nguồn
IP đích
port đích

Ví dụ:

192.168.1.20:53142
        ↓
203.0.113.9:443

Trong đó:

IP          → tìm đúng máy
port        → tìm đúng nơi nhận dữ liệu trong máy

Vậy trình duyệt giờ đã biết cần gửi dữ liệu tới:

203.0.113.9:443

Nhưng TCP vẫn chưa thể gửi dữ liệu ngay.

Một kết nối TCP bắt đầu như thế nào?

Nguồn bài viết (3)

  1. RFC 6335 — IANA Procedures for Service Name and Transport Protocol Port Number Registry · IETF
  2. RFC 9293 — Transmission Control Protocol (TCP) · IETF
  3. RFC 768 — User Datagram Protocol · IETF