Trong một máy tính, giữa các quy trình
Đầu tiên chúng ta hãy xem làm thế nào một đơn máy tính phân biệt giữa kết nối đồng thời.
Hầu hết các giao thức truyền tải như TCP, UDP, SCTP sử dụng hai cổng, nguồn và đích - tức là một ở hai đầu của kết nối. Đó là, các gói không chỉ đơn giản là đi "qua" một cổng; thay vào đó họ đi từ cổng X đến cổng Y.
Cổng đích thường nổi tiếng (80 đối với HTTP, 53 đối với DNS,) nhưng cổng nguồn thường được chọn bởi chính HĐH, điều này cũng đảm bảo rằng kết hợp src / dst là duy nhất.
Vì vậy, khi trình duyệt của bạn thực hiện nhiều kết nối "tới cổng 80 của Yahoo", tất cả chúng thực sự có các cổng nguồn khác nhau và HĐH sẽ giữ một bảng ổ cắm như:
PROCESS PROTO LOCAL REMOTE STATE
9894/firefox tcp 192.168.6.175:39163 google.server:80 established
9894/firefox tcp 192.168.6.175:52909 yahoo.server:80 established
17463/chrome tcp 192.168.6.175:64981 yahoo.server:80 established
9894/firefox udp 192.168.6.175:4984 8.8.8.8:53 --
Vì vậy, khi HĐH nhận được gói TCP từ yahoo.server:80
cổng cục bộ 52909, nó có thể ánh xạ nó tới kết nối cụ thể được tạo bởi Firefox.
Điều quan trọng cần lưu ý rằng đây không có gì để làm với NAT chưa , và xảy ra theo cùng một cách ngay cả khi bạn đang trực tiếp kết nối. (NAT sẽ sử dụng nó, mặc dù.)
(Bạn có thể xem bảng này bằng cách sử dụng netstat -n
hoặc các công cụ đồ họa khác nhau trên Windows. Thường thì "cục bộ / từ xa" được gắn nhãn "nguồn / đích", mặc dù điều đó không hoàn toàn chính xác.)
Trong một mạng NATed, giữa các máy tính
Câu trả lời cho câu hỏi của bạn về NAT rất giống nhau, chỉ có mọi thứ được thực hiện ở quy mô lớn hơn.
Bộ định tuyến thực hiện NAT giữ một bảng "trạng thái" chứa cả cổng và địa chỉ bên trong và bên ngoài. Ví dụ: nếu hai yêu cầu HTTP của bạn sử dụng các kết nối TCP riêng biệt, chúng có thể được theo dõi là:
PROTO ORIG-SRC ORIG-DST REPLY-SRC REPLY-DST
6/tcp 192.168.6.42:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:52909
6/tcp 192.168.6.175:39163 yahoo.server:80 yahoo.server:80 your.public.ip.addr:39163
6/tcp 192.168.6.175:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:28330
17/udp 192.168.6.175:4984 8.8.8.8:53 8.8.8.8:53 your.public.ip.addr:4984
Khi bộ định tuyến nhận được gói từ REPLY-SRC (Yahoo) được gửi đến REPLY-DST (địa chỉ IP công cộng của bạn), nó biết rằng đích thực phải được lấy từ cột ORIG-SRC để hoàn tác NAT.
(Nếu không có trạng thái khớp, thì các quy tắc chuyển tiếp cổng được định cấu hình thủ công sẽ được xử lý. Nếu vẫn không khớp, thì gói thực sự có ý nghĩa đối với chính bộ định tuyến.)
Lưu ý cách bảng trạng thái chứa địa chỉ và cổng , cho phép phân biệt nhiều kết nối đến cùng một máy chủ bằng tổ hợp cổng. Trong ví dụ của tôi, hai máy tính vô tình sử dụng cùng một kết hợp cổng, vì vậy kết nối thứ 2 cũng có các cổng được dịch.
(Trên thực tế, một số NAT chỉ nhìn vào cổng và hoàn toàn bỏ qua địa chỉ nguồn; điều này làm giảm số lượng kết nối có thể, nhưng giúp các chương trình ngang hàng thực hiện "cú đấm NAT" dễ dàng hơn rất nhiều.)
Trạng thái như vậy được giữ ngay cả đối với các giao thức không kết nối như UDP hoặc ICMP, vì vậy các mục hết hạn sau một khoảng thời gian không hoạt động mặc dù không có gói "kết nối gần" rõ ràng. (Bảng trạng thái thực sự là một phần của tường lửa, vì vậy ngay cả khi NAT không được thực hiện, bộ định tuyến vẫn có thể sử dụng nó để phân biệt giữa các kết nối "hoạt động" và các gói đi lạc.)
(Nếu bộ định tuyến của bạn dựa trên Linux conntrack -L
hoặc cat /proc/net/nf_conntrack
sẽ hiển thị bảng này. Đối với OpenBSD hoặc pfSense, hãy thử pfctl -s state
.)