9.8. Cổng (Ports)

Địa chỉ IP cho biết gói tin dành cho host nào. Một host hiện đại chạy nhiều chương trình cùng lúc -- trình duyệt web, ứng dụng chat, cuộc gọi video, tác vụ sao lưu -- và mỗi chương trình đó đang gửi và nhận gói tin song song. Tầng IP không có cách nào phân biệt chúng; nó chỉ chuyển mọi gói tin đến cho "host". Phải có thứ gì đó quyết định gói tin nào thuộc về chương trình nào.

Số cổng là câu trả lời. Mỗi gói tin ở tầng transport mang thêm hai trường ngoài header IP: cổng nguồncổng đích. Mỗi trường là một số nguyên 16-bit, nên có 65535 số cổng khả dụng trên mỗi host. Kết hợp với địa chỉ IP, cổng xác định một endpoint cụ thể bên trong một host -- cuộc trò chuyện cụ thể của một chương trình cụ thể.

A single host box on the right with an IP address labelled at the top. Three programs inside the host are labelled "HTTP server", "video call", "chat client", each connected to a different port number labelled 80, 5004, and 4321 respectively. Three arrows arrive at the host from the network, each tagged with a destination port; each arrow lands on the matching program.

Nhiều chương trình chia sẻ một địa chỉ IP; cổng đích định tuyến mỗi gói tin đến đến đúng chương trình.

9.8.1. Các cổng nổi tiếng

1024 số cổng đầu tiên được dành riêng theo quy ước cho các dịch vụ tiêu chuẩn. Một vài cổng mà bạn sẽ gặp:

  • 22 -- SSH (giao thức Secure Shell, dùng để đăng nhập từ xa được mã hóa).

  • 53 -- DNS, Domain Name System (được trình bày trên Tên và DNS).

  • 80 -- HTTP, Hypertext Transfer Protocol -- giao thức không mã hóa của web.

  • 123 -- NTP, Network Time Protocol (cách các thiết bị đồng bộ đồng hồ từ máy chủ thời gian).

  • 443 -- HTTPS, HTTP qua TLS (Transport Layer Security, lớp mã hóa tiêu chuẩn cho các giao thức internet) -- giao thức đằng sau mọi trang web hiển thị biểu tượng ổ khóa trên trình duyệt.

Quy ước này cho phép trình duyệt kết nối tới http://example.com mà không cần chỉ định cổng -- nó mặc định là 80 vì đó là cổng nổi tiếng cho HTTP. Một camera kết nối tới máy chủ web cũng làm điều tương tự.

Trên 1024, số cổng không bị giới hạn và bất kỳ chương trình nào cũng có thể yêu cầu một cổng. Máy chủ cơ sở dữ liệu (5432 cho PostgreSQL, 3306 cho MySQL), máy chủ ứng dụng, và các giao thức tùy chỉnh đều nằm ở đâu đó trong dải số cao hơn.

9.8.2. Cổng tạm thời (Ephemeral ports)

Máy chủ lắng nghe trên một cổng đã biết. Clients dùng một cổng khác ở phía của họ, được chọn mới cho mỗi kết nối đi ra.

Khi camera kết nối tới máy chủ web trên cổng 443, cuộc trò chuyện diễn ra giữa

camera IP : <some-port>     <-->     server IP : 443

<some-port> là một cổng tạm thời -- MicroPython chọn một số chưa được dùng từ dải số cao, sử dụng nó trong suốt thời gian kết nối, rồi giải phóng sau đó. Tập lệnh không cần quan tâm số nào được chọn; tầng socket xử lý điều đó.

9.8.3. Lắng nghe so với nói chuyện

Vai trò mà một cổng đảm nhận phụ thuộc vào phía nào của cuộc trò chuyện. Hai trường hợp khác biệt:

  • Một cổng lắng nghe thuộc về một chương trình muốn nhận các kết nối chủ động. Chương trình báo với MicroPython "mọi gói tin đến địa chỉ của tôi tại cổng 80 là của tôi", và chờ đợi. Máy chủ làm điều này.

  • Một cổng đã kết nối thuộc về một chương trình muốn khởi tạo một cuộc trò chuyện. Chương trình chọn (hoặc yêu cầu MicroPython chọn) một cổng tạm thời, gửi một gói tin với cổng đó làm cổng nguồn và cổng nổi tiếng của máy chủ làm cổng đích, rồi dùng cùng cặp cổng đó cho phần còn lại của cuộc trò chuyện.

Một chương trình có thể làm cả hai cùng lúc, giữ các cổng khác nhau cho mỗi vai trò. Một camera có thể lắng nghe trên cổng 8000 cho các kết nối HTTP đến từ giao diện người dùng cấu hình đồng thời giữ một kết nối HTTPS ra ngoài tới máy chủ từ xa trên cổng 443. Hai vai trò không ảnh hưởng lẫn nhau -- mỗi cuộc trò chuyện được xác định bởi bộ bốn (src IP, src port, dst IP, dst port) đầy đủ, và không có hai cuộc trò chuyện nào dùng chung bộ bốn đó.

9.8.4. Điều cổng mở ra

Với các cổng đã có mặt, tầng transport cuối cùng có thể giải quyết bài toán phân phối từ chương trình đến chương trình. Một gói tin giờ đây mang đủ thông tin để được định tuyến không chỉ tới đúng host (địa chỉ IP) mà còn tới đúng socket bên trong host đó (số cổng).

Hai trang tiếp theo trình bày hai dạng mà tầng transport cung cấp trên nền tảng địa chỉ đó: UDP (User Datagram Protocol -- mỗi gói tin độc lập, không đảm bảo) và TCP (Transmission Control Protocol -- một luồng dữ liệu có kết nối, đáng tin cậy và có thứ tự).