(Đối với phần sau tôi sẽ bỏ qua mọi hành động tra cứu DNS hoặc hành động lớp hai, vì đó không phải là phần có liên quan cho câu chuyện NAT.)
Bất kỳ kết nối TCP nào là một bộ gồm bốn phần:
<source IP> <source port> <destination IP> <destination port>
Tóm lại: IP đích được sử dụng để đưa gói đến đúng máy, cổng đích được sử dụng để đưa gói trên máy đó đến đúng chương trình / phiên IP được sử dụng để biết nơi gửi bất kỳ trả lời nào. Tương tự với cổng nguồn. Khi một câu trả lời được gửi, nguồn và đích chỉ được hoán đổi.
Hãy bắt đầu với hai máy tính không có NAT:
- Máy tính có IP
1.1.1.1
- Máy chủ web có IP
3.3.3.3
- Cổng tiêu chuẩn cho HTTP là
80
Khi một máy tính yêu cầu một trang web, trước tiên, nó sẽ chọn một số cổng không sử dụng ngẫu nhiên từ phạm vi ngẫu nhiên (1024-65535). Hãy chọn 2345
. Sau đó, chuỗi sau sẽ xảy ra: Máy tính gửi gói của nó với: IP 1.1.1.1
nguồn 2345
, cổng nguồn , IP 3.3.3.3
đích, cổng đích 80
. Các gói đến máy chủ web, nó thấy IP và cổng riêng của nó 80
, vì vậy nó biết đây là một yêu cầu cho một trang web. Sau đó, máy chủ web sẽ gửi lại trang web trong các gói với IP 3.3.3.3
nguồn, cổng nguồn 80, IP 1.1.1.1
đích, cổng đích 2345
. Máy tính nhận các gói này và biết đó là trang web được yêu cầu, vì số cổng 2345
.
Các kết hợp cổng này thường được viết như vậy: 1.1.1.1:2345
và 3.3.3.3:80
.
Giờ đây, số lượng máy tính trên internet vượt xa số lượng địa chỉ IPv4 hiện có. Để duy trì không gian địa chỉ, một bộ phạm vi địa chỉ riêng đã được giới thiệu, có thể được sử dụng miễn phí để chia sẻ địa chỉ. Những rangese này được gọi là RFC1918 và như sau:
- 192.168.0.0 - 192.168.255.255
- 172.16.0.0 - 172.31.255.255
- 10.0.0.0 - 10.255.255.255
Các địa chỉ này không có trong các bảng định tuyến internet, vì vậy nếu bạn gửi một gói có đích đến trong các phạm vi này trên đường trục của internet, chúng sẽ chỉ bị hủy. Điều này là do hàng triệu người sử dụng cùng một địa chỉ. Những địa chỉ này cần được dịch sang một cái gì đó hữu ích cho internet. Đây là nơi Dịch địa chỉ mạng đến:
Chúng tôi có hai máy tính:
- A:
192.168.0.1
và B:192.168.0.2
- Cổng của họ có một IP công cộng
1.1.1.1
.
- Chúng tôi giữ cùng một máy chủ web.
- Cả hai máy tính đều muốn cùng một trang web từ cùng một máy chủ.
Đầu tiên cả hai máy tính chọn một cổng ngẫu nhiên: giả sử: 192.168.0.1:2345
và 192.168.0.2:5432
.
Máy tính A gửi gói của nó với nguồn 192.168.0.1:2345
và đích 3.3.3.3:80
. Cổng sẽ dịch gói tin này 1.1.1.1:2345
đến đích nguồn 3.3.3.3:80
và ghi nhớ rằng bất kỳ câu trả lời nào cho sự kết hợp này đều được chuyển đến 192.168.0.1
. Vì vậy, khi nó nhận được trả lời với nguồn 3.3.3.3:80
và đích 1.1.1.1:2345
, nó sẽ dịch nó sang nguồn 3.3.3.3:80
và đích 192.168.0.1:2345
và gửi gói tin vào.
Máy tính B gửi gói của nó với nguồn 192.168.0.2:5432
và đích 3.3.3.3:80
. Cổng sẽ dịch gói tin này 1.1.1.1:5432
đến đích nguồn 3.3.3.3:80
và ghi nhớ rằng bất kỳ câu trả lời nào cho sự kết hợp này đều được chuyển đến 192.168.0.2
. Vì vậy, khi nó nhận được trả lời với nguồn 3.3.3.3:80
và đích 1.1.1.1:5432
, nó sẽ dịch nó sang nguồn 3.3.3.3:80
và đích 192.168.0.2:5432
và gửi gói tin vào.
Nếu cả hai máy tính tình cờ chọn cùng một số cổng nguồn, cổng sẽ chỉ chọn một số cổng nguồn ngẫu nhiên miễn phí khác và nhớ dịch cả số cổng. Điều này đôi khi được gọi là PAT (Dịch địa chỉ cổng). Đây về cơ bản là một tập hợp con của NAT.
Có một số triển khai cho tất cả điều này. Cổng chỉ có thể chỉ nhớ "Máy tính X đã sử dụng cổng nguồn Y" và chuyển tiếp mọi thứ có cổng Y sang máy tính X. Nó có thể nhớ rằng Máy tính X đã sử dụng cổng nguồn Y và đích Z "và chỉ chuyển tiếp mọi thứ từ cổng Z sang cổng Y trở lại máy tính X. Hoặc có tùy chọn ghi nhớ toàn bộ bộ dữ liệu và chỉ gửi lưu lượng truy cập đến máy tính X khớp với toàn bộ ip và cổng nguồn / đích.