Điểm:11

Điều gì xảy ra nếu hai hệ thống cục bộ tải xuống cùng một tài nguyên trên cùng một cổng?

lá cờ cn
S.B

Tôi biết bảng NAT. Tôi chỉ muốn biết điều gì sẽ xảy ra nếu hai máy khách trong mạng cục bộ riêng muốn tải xuống chính xác cùng một tài nguyên trên cùng một cổng? Nói cách khác, Khi một gói đến từ máy chủ, làm thế nào bộ định tuyến có thể quyết định máy khách nào sẽ nhận gói này?

Nếu tôi không nhầm, gói đến từ máy chủ có địa chỉ IP đích của bộ định tuyến là công khai và giống nhau cho cả hai, cũng như số cổng của đích cũng giống nhau trong trường hợp này.

Có cơ chế nào trong bộ định tuyến hoặc máy chủ để phát hiện điều này không? hoặc hành vi này thậm chí có thể xảy ra ngay từ đầu?

Tôi đã tìm kiếm các câu hỏi như cái này, điều này có nghĩa là lỗi phát sinh do cổng đang bận nhưng tôi đang hỏi về hai hệ thống riêng biệt.


Cập nhật : Từ các bình luận, tôi nhận ra rằng mình chưa đủ rõ ràng nên hãy để tôi nói lại bằng một ví dụ:

Tôi chỉ quan tâm đến cổng "nguồn" của thiết bị. Giả sử tôi có hai máy tính xách tay (192.168.2.10192.168.2.11), cả hai đều đang tải xuống cùng một tệp từ cùng một máy chủ ở đâu đó trên internet. Mỗi người trong số họ có một hệ điều hành tạo ra một cổng ngẫu nhiên để IP nguồn và cổng nguồn sẽ giống như: 192.168.2.10:6321192.168.2.11:7132. Tôi nghĩ rằng trong NAT, bộ định tuyến sẽ đặt địa chỉ IP (công khai) cùng với các cổng từ máy tính xách tay, vì vậy nếu địa chỉ IP công cộng của bộ định tuyến gia đình là 65.82.23.32, hai gói này sẽ nhận được các IP nguồn và cổng nguồn tương ứng: 65.82.23.32:632165.82.23.32:7132.

Bây giờ khi phản hồi trở lại, bộ định tuyến có thể tìm ra gói nào dành cho máy tính xách tay nào từ số cổng phải không? càng xa càng tốt. Nhưng điều gì xảy ra nếu vô tình hay cố ý hai máy tính xách tay tạo ra cùng một cổng nguồn? Ví dụ : 192.168.2.10:6000192.168.2.11:6000. Bây giờ, bộ định tuyến sẽ đặt địa chỉ IP công khai của nó làm địa chỉ IP nguồn giống như trước đây, nhưng bây giờ nếu nó cố gắng sử dụng các số cổng đó, các gói đó sẽ có cùng một IP nguồn và số cổng nguồn, như: 65.82.23.32:600065.82.23.32:6000.

Đây là lúc tôi bối rối rằng khi phản hồi quay lại, làm cách nào bộ định tuyến có thể quyết định gói nào dành cho máy tính xách tay nào?

Sau câu trả lời của @ mfinni, tôi nhận thấy rằng đây không phải là cách PAT hoạt động! Thiết bị NAT (ở đây là bộ định tuyến) sẽ chỉ định các cổng duy nhất cho từng máy tính xách tay riêng lẻ (địa chỉ IP riêng), sau đó các gói được gửi bằng các cổng duy nhất này (ví dụ: 77777778). Vì vậy, khi phản hồi trở lại, rõ ràng gói nào dành cho máy tính xách tay nào từ các cổng, sau đó bộ định tuyến sẽ chuyển đổi các gói này 65.82.23.32:7777, 65.82.23.32:7778 đến --> 192.168.2.10:6000, 192.168.2.11:6000 tương ứng.

lá cờ se
Bộ định tuyến sẽ nhận ra rằng địa chỉ IP khác. Nhớ.Một gói IP được xác định bởi 4 phần trên dữ liệu, không phải 3, không phải 2 và không phải 1: IP nguồn, cổng nguồn, IP đích, cổng đích
S.B avatar
lá cờ cn
S.B
@slebetman Tôi biết nhưng khi cùng một tệp được tải xuống từ cùng một url (nếu chúng tôi kết nối với cùng một máy chủ web), IP đích và cổng đích giống nhau cho cả hai gói. IP nguồn cũng giống như vậy vì nó là địa chỉ IP của bộ định tuyến. Vì vậy, phần cuối cùng của 4 dữ liệu đó là "cổng" nguồn. Tôi có đúng không?
lá cờ se
Họ không thể giống nhau. Dịch vụ NAT trong bộ định tuyến của bạn phải đảm bảo rằng chúng không giống nhau. Cổng nguồn đi ra từ NAT dù sao cũng là ngẫu nhiên, vì vậy NAT chỉ cần đảm bảo rằng nó ánh xạ bên trong gói với cổng nguồn đến đến đúng PC
lá cờ se
Trừ khi bạn viết NAT của riêng mình, nhưng đó sẽ được coi là một lỗi trong quá trình triển khai NAT của bạn
RonJohn avatar
lá cờ id
"Có bất kỳ cơ chế nào trong bộ định tuyến hoặc máy chủ để phát hiện điều này không?" Bạn **HÃY** biết rằng ai đó đã từng nghĩ về điều này **một lúc nào đó** trong 22 năm qua.
Điểm:44
lá cờ co

Một kết nối TCP (nền tảng cho HTTP và nhiều giao thức khác) là duy nhất (tại một thời điểm nhất định) được xác định bởi 4 tham số:

  • IP cục bộ
  • Cảng địa phương
  • IP từ xa
  • Cổng từ xa

Ngay cả khi bạn thực hiện cùng một yêu cầu hai lần đồng thời từ cùng một máy tính, ngay cả với hai địa chỉ IP giống nhau và cổng đích giống nhau, thì cổng nguồn sẽ khác.

Tương tự như vậy, nếu bạn có hai yêu cầu đến từ hai thiết bị đi qua cùng một thiết bị NAT, thì thiết bị NAT sẽ sử dụng các cổng nguồn khác nhau.Tùy thuộc vào thiết bị, nó có thể giữ lại các cổng nguồn ban đầu (và chỉ thay đổi một cổng nếu có xung đột) hoặc luôn chỉ định một cổng nguồn mới độc lập với cổng nguồn ban đầu.

Sau đó, thiết bị NAT sẽ giữ cho mỗi kết nối một ánh xạ trong bảng dịch của nó cho biết kết nối bên ngoài (IP bên ngoài, cổng nguồn bên ngoài, IP đích, cổng đích) được ánh xạ tới kết nối bên trong (IP máy chủ bên trong, cổng nguồn máy chủ bên trong, đích IP, cổng đích).

S.B avatar
lá cờ cn
S.B
Giải thích tốt. Tôi sẽ chấp nhận đây là câu trả lời. Nó toàn diện và dễ hiểu.
lá cờ cn
Đơn giản và cơ bản như vậy - thực tế là có một cổng NGUỒN cho mọi kết nối máy khách thường bị người mới bắt đầu (và các lập trình viên có kinh nghiệm) bỏ qua điều đó. Tôi thực sự đã có người cho rằng cổng nguồn sẽ giống với cổng đích, cổng này rõ ràng là không hoạt động (tức là máy chủ web thực hiện cuộc gọi http đến máy chủ web khác). Thực tế cơ bản của TCP, giải thích tốt.
lá cờ cn
@TomTom Thực tế, có một vài giao thức thích hợp sử dụng cùng một cổng cho nguồn và đích. Chúng rất hiếm và thường được thiết kế bởi các lập trình viên không thực sự hiểu các điểm tốt hơn của mạng.
lá cờ cn
@Tonny Họ cũng không thể là chủ đạo vì nếu không họ sẽ có một cổng được chỉ định - nằm trong không gian được kiểm soát của các cổng thấp;) Bạn có thể kể tên cho tôi một số người vi phạm đó không? Thực sự chưa bao giờ nghe nói về chúng - nghe có vẻ như các lập trình viên thật ngu ngốc.
lá cờ cn
@TomTom Họ thực sự thích hợp. Tôi đã gặp một vài ứng dụng điều khiển cho thiết bị công nghiệp. Tuy nhiên, không có gì gần đây (như trong "thiên niên kỷ này"). Tôi thực sự không thể nhớ bất kỳ tên nào. Đó là 2 thập kỷ trước. Và ngu ngốc là một thuật ngữ quá nhẹ cho sự điên rồ đó ...
jcaron avatar
lá cờ co
@HagenvonEitzen sẽ trái với toàn bộ mô hình TCP. Kết nối TCP được xác định bởi 4-tuple, không phải bất kỳ 3 nào. Ngoài ra, tôi không chắc mình hiểu trường hợp bạn đang đề cập đến là gì. Nếu bạn đang ở trong tình huống chuyển đổi dự phòng (không đồng bộ hóa các bảng NAT) thì cơ chế tiêu chuẩn cho gói TCP không thể khớp là RST, không phải là ICMP không thể truy cập được.
Hagen von Eitzen avatar
lá cờ cn
@jcaron Xin lỗi, lỗi của tôi.Có vẻ như tôi đã nhầm lẫn vì các màn hình không thể truy cập ICMP cấp cao có xu hướng chỉ đề cập đến địa chỉ và cổng đích - trong khi chúng thực sự * làm * chứa tiêu đề internet đầy đủ bao gồm gửi ip cộng với 64 bit của gói dữ liệu (và do đó có các cổng TCP liên quan ) của gói vi phạm *chính xác* để cho phép tìm ra nỗ lực nào thực sự thất bại.
Điểm:11
lá cờ cn

Bảng NAT biết rằng cổng nguồn trên mỗi máy khách là khác nhau, do đó, nó sẽ không vô tình gửi sai gói đến máy khách nội bộ không đúng. Thiết bị NAT cũng chỉ định các cổng ra ngoài khác nhau và các cổng này KHÔNG giống nhau giữa các máy khách nội bộ khác nhau.

S.B avatar
lá cờ cn
S.B
Ồ Cảm ơn bạn, tôi e rằng ý của bạn là `ip` thay vì `port` trong câu đầu tiên của bạn phải không? bởi vì các cổng được coi là giống nhau.
mfinni avatar
lá cờ cn
Không. Cổng nguồn từ máy khách không được coi là giống nhau. Khi một khách hàng thực hiện một yêu cầu, cổng nguồn cho hầu hết các giao thức sẽ là một cổng miễn phí ngẫu nhiên trong phạm vi cổng tạm thời.
S.B avatar
lá cờ cn
S.B
Đúng vậy, nhưng tôi đặc biệt hỏi về chính xác tình huống mà các cổng nguồn giống nhau, chẳng hạn như tôi cố tình mở cùng một cổng với ổ cắm python.
mfinni avatar
lá cờ cn
Chà, bạn thật ngớ ngẩn khi làm điều đó, nhưng bảng NAT biết các IP nguồn là khác nhau, vì vậy điều tương tự cũng được áp dụng. Các cổng NAT gửi đi chắc chắn sẽ khác, chúng sẽ đến từ phạm vi cổng phù du trên thiết bị NAT.
S.B avatar
lá cờ cn
S.B
Lol, đó là vì sự tò mò. Cảm ơn thông tin của bạn
lá cờ se
@SiousHBakhtiary Hệ điều hành của bạn sẽ ngăn bạn mở cùng một cổng hai lần với lỗi "cổng đang sử dụng" (thường là EADDRINUSE trong triển khai IP thông thường). Những gì bạn CÓ THỂ làm là yêu cầu một quy trình mở MỘT cổng nguồn và giao tiếp với hai quy trình khác thông qua đường ống hoặc bộ nhớ dùng chung, v.v. và hai quy trình ủy quyền yêu cầu của chúng thông qua quy trình đầu tiên. Nhưng trong trường hợp đó, việc định tuyến sẽ 100% tùy thuộc vào bạn vì điều này hiện nằm ngoài giao thức IP.
lá cờ se
@SiousHBakhtiary Có vẻ như python thậm chí không có API để bạn có thể đặt cổng cho máy khách. Bạn chỉ có thể chỉ định cổng máy chủ trong phương thức `.connect()`. Cổng máy khách được gán ngẫu nhiên cho ổ cắm của bạn. Vì vậy, bạn không thể làm những gì bạn định làm trong python. Có thể làm điều đó trong C bằng cách chỉnh sửa thủ công cấu trúc ổ cắm (giả mạo) nhưng nó không chuẩn
S.B avatar
lá cờ cn
S.B
@slebetman Bạn nói đúng, đó là lỗi của tôi khi tôi không đủ rõ ràng. Tôi đã cập nhật câu hỏi với một ví dụ. Vui lòng xem phần "cập nhật".
user49822 avatar
lá cờ pl
@slebetman Ít nhất trên linux, bạn có thể đặt cổng nguồn khi kết nối bằng cách gọi phương thức `.bind()` trước `.connect()`
Điểm:6
lá cờ in

Khi bạn đề cập đến NAT có lẽ bạn đang thực sự đề cập đến giấc ngủ trưa. Cái nào thay đổi cổng nguồn (ít nhất là nếu cần) trong thiết bị NAT. Như vậy cổng nguồn sẽ thay đổi.

Ví dụ iptables MẶT NẠ

Khi thực hiện NAT trong trường hợp này, cũng cần có "theo dõi kết nối", đơn giản là theo dõi xem "cổng bên ngoài" nào liên quan đến "máy khách và cổng nội bộ" nào. Trong iptables, bạn sẽ thường thấy quy tắc LIÊN QUAN, THÀNH LẬP mà sử dụng. Bạn cũng sẽ thấy rằng nếu một bộ định tuyến thực hiện NAPT được khởi động lại, nó sẽ hủy tất cả các kết nối. Mặc dù một bộ định tuyến không có bất kỳ NAT nào thường sẽ chỉ tiếp tục lại bất kỳ kết nối nào. (giả sử rằng nó hoàn tất khởi động lại trước khi máy khách hết thời gian chờ)

S.B avatar
lá cờ cn
S.B
Vâng, vấn đề của tôi là: ví dụ: khi chúng tôi sử dụng cổng 6000 trong ứng dụng của mình, tôi nghĩ rằng cổng đó sẽ được đặt trong gói cùng với IP (công khai) của bộ định tuyến... nhưng câu chuyện có thật là do PAT, một cổng khác được tạo bởi thiết bị NAT (ở đây là bộ định tuyến) được gán cho địa chỉ IP riêng của chúng tôi. Đó là cách bộ định tuyến có thể dễ dàng phân biệt gói nào dành cho địa chỉ IP nào ngay cả khi ban đầu chúng sử dụng cùng một cổng. Tôi có đúng không?
lá cờ se
@SiousHBakhtiary Khi bạn nói cổng 6000, ý bạn là trên máy chủ hay máy khách? Bạn có nhận ra rằng mỗi gói tin trong giao thức IP được xác định bởi 4 bit thông tin đúng không? Không chỉ 2. cổng máy khách (nguồn), IP máy khách (nguồn), đích (máy chủ - Tôi nghĩ đây là ý nghĩa của cổng 6000), IP đích. Vì vậy, ngay cả khi hai máy khách trên cùng một PC tạo kết nối với cổng (đích) 6000, chúng sẽ được hệ điều hành của bạn chỉ định ngẫu nhiên các cổng nguồn khác nhau. Đây là những gì bộ định tuyến (và NAT) sử dụng để xác định định tuyến - cổng nguồn, IP nguồn, cổng đích, IP đích
Điểm:5
lá cờ ru

Bộ định tuyến không sử dụng cùng một số cổng nguồn mà máy tính xách tay tạo ra trong các yêu cầu gửi đi tới mạng WAN, nó tạo ra các cổng nguồn duy nhất của riêng mình. Bảng NAT trong bộ định tuyến chuyển đổi laptop1:6000 thành publicip:N và laptop2:6000 thành publicip:M. Sau đó, nó biết nơi định tuyến các gói đến bằng cổng nào mà lưu lượng truy cập đến từ Internet.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.