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.
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?