Hiểu ip và cổng duy nhất [trùng lặp]


2

Câu hỏi này đã có câu trả lời ở đây:

Trình duyệt của tôi là Firefox, với 3 tab đang mở:

tab1-->google.com
tab2-->yahoo.com
tab3-->msn.com

Tất cả đều sử dụng port 80, và Photoshop cũng vậy: nhập mô tả hình ảnh ở đây Làm thế nào máy tính biết dữ liệu nào thuộc về quy trình nào?


Hãy nghĩ như cổng 80 như một số mở rộng. Tab 1 gọi google trên phần mở rộng 0. Sau đó, nó yêu cầu thư ký cho một số liên lạc trong tương lai. Điều đó không cần phải xảy ra trên cổng 80. Tab Ditto 2 gọi cho người khác và do đó, nó là một cặp IP: 80 khác.
Hennes

Câu trả lời:


4

Tôi sẽ sửa sơ đồ của bạn xem pic dưới đây.

nhập mô tả hình ảnh ở đây

Thật hữu ích khi sử dụng gói từ theo nghĩa chung, ý nghĩa kỹ thuật điện tử, mà không có nhiều thuật ngữ "lớp" ISO OSI lộn xộn.

Một người có một gói và nó có thông tin như IP nguồn, IP IP và sau đó bạn có một số trường khác có thể được gọi là phân đoạn TCP và chúng có các trường như cổng nguồn TCP, cổng TCP.

Đã thêm ghi chú-

Trong các trường hợp phức tạp hơn một chút, bạn có thể có hai kết nối và cùng một IP nguồn truy cập cùng một cổng Dest và IP. nhưng một kết nối sẽ có một cổng tcp cục bộ, một cổng tcp cục bộ khác. Điều đó có thể xảy ra nếu bạn mở nhiều tab trong trình duyệt web, truy cập vào cùng một máy chủ web. Một kịch bản khác là nếu bạn có nhiều NIC. Hãy nhớ rằng IP thuộc về giao diện mạng (điều đó chính xác hơn là nói chúng thuộc về 'máy tính'). Một máy tính có thể có nhiều giao diện mạng, nhiều IP. Một kết nối xảy ra giữa các giao diện mạng.


1
Đó là một phần của câu trả lời, nhưng vẫn thiếu máy chủ 'cục bộ': cổng.
grawity

@grawity tốt, máy chủ lưu trữ cục bộ: cổng không phải là thứ đã khiến anh ấy vấp ngã
barlop

@grawity Tôi đã thêm về khái niệm gói, (vì nó làm rõ khái niệm cổng mà anh ta không hiểu), và điều đó cũng bao gồm một chút về IP nguồn và cổng nguồn. Nhân tiện, tôi nghĩ rằng bức ảnh gốc của tôi hơi thiếu sót 'tôi đã gọi' cổng 'là một định danh khi tôi nghĩ rằng nó không phải là. Vì vậy, tôi đã sửa chữa pic của tôi. (mặc dù tôi sẽ phải xem xét sự khác biệt giữa mã định danh và mã định danh duy nhất)
barlop

Làm thế nào để bạn biết nó không phải là? Nếu bạn đã vẽ hai tab cố gắng kết nối với cùng một 1.2.3.4:80, thì nó sẽ rất phù hợp.
grawity

@grawity đó là một điểm tuyệt vời và đáng để thêm vào pic hoặc tôi thêm một pic khác, mặc dù ảnh của anh ấy cho thấy sự nhầm lẫn khi mỗi tab được kết nối với một máy chủ khác nhau và anh ấy đã không thấy điều đó là có thể, vì vậy tôi đã giải quyết tình huống ông đã đề cập và tại sao nó không phải là một vấn đề.
barlop

13

Kết nối TCP được xác định duy nhất bởi (Máy chủ cục bộ, Cổng cục bộ, Máy chủ từ xa, Cổng từ xa). (Về mặt kỹ thuật, giao thức cũng là một phần của tiêu chí, nhưng nếu chúng ta hạn chế TCP, thì tất nhiên đó là TCP.)

Một ví dụ kết nối với bộ định tuyến:

  • Máy chủ lưu trữ cục bộ: 192.168.2.100 (hoặc tương tự)
  • Cảng địa phương: 50000
  • Máy chủ từ xa: 216.58.208.46 (Google)
  • Cổng từ xa: 80

Nếu bạn mở một kết nối khác với Google, nó sẽ sử dụng một cổng gửi đi khác, do đó, nó vẫn có thể được xác định duy nhất.

Đây cũng là những gì hệ điều hành của bạn sử dụng để định tuyến các gói phản hồi trở lại đúng ứng dụng.


3

Tất cả các ứng dụng sẽ sử dụng một cổng ngẫu nhiên cho "sử dụng nội bộ". Đây được gọi là cảng địa phương.

Bằng cách xem Resmon.exe, trong Networktab, bạn có thể thấy danh sách các kết nối TCP. Đây là kết nối TCP mở mỗi chương trình đã mở. Điều này sẽ hiển thị:

  • Hình ảnh (chương trình đang sử dụng kết nối TCP)
  • PID (đây là Số nhận dạng cá nhân mà ứng dụng đang sử dụng)
  • Địa chỉ cục bộ (IP của máy của bạn 99% thời gian)
  • Cổng cục bộ (cái mà chúng ta đang nói đến - đây là số cổng ngẫu nhiên được gán cho mỗi kết nối TCP để có thể xác định chúng trong Windows)
  • Địa chỉ từ xa (đây là máy chủ / thiết bị mà ứng dụng đang kết nối)
  • Cổng từ xa (cổng mà ứng dụng đang sử dụng)
  • Mất gói & Độ trễ gói (Tỷ lệ mất gói và ... độ trễ tốt - hoặc Ping một số người có thể biết là)

Nhìn chung, mỗi ứng dụng / kết nối TCP (vì một số ứng dụng có thể có nhiều kết nối, chẳng hạn như trình duyệt web có nhiều tab) sẽ có một cổng cục bộ ngẫu nhiên có thể được sử dụng cho mỗi kết nối TCP mở.

BIÊN TẬP:

Cảm ơn @Hennes đã xác định rằng các cổng lớn hơn 1023 và dưới 65536.

Tất cả các cổng lên đến 1023 được dành riêng như cổng 80, v.v. Và 65535 là số cổng tối đa.


3
Trường hợp ngẫu nhiên là> 1023 và <= 65536
Hennes

@ Hennes Sai hennes và bị cắn. Số cổng cao nhất là 65535 (16 bit sẽ đi từ 0-65535). Đó là 65536 số, đi từ cổng đầu tiên 0, lên đến 2 ^ 16 PHÚT 1. và một liên kết để xác nhận rằng cổng cao nhất là 65535 stackoverflow.com/questions/113224/. Vì vậy, nhận xét nâng cao của bạn là sai và dòng cuối cùng câu trả lời của cắn là sai.
barlop

@barlop Được rồi anh bạn, hãy làm lạnh người đàn ông của bạn. Sai lầm đơn giản, nó trông thật kỳ quặc khi tôi đọc nó, nhưng chỉ tin tưởng anh ta. Tôi sẽ chỉnh sửa nó.
Bọ chét cắn

Các cổng sẽ bắt đầu từ 0, nhưng hàng nghìn đầu tiên thường được bảo lưu. Và bạn nói đúng, ý tôi là <2 ^ 16 hoặc <+ 2 ^ 16 -1
Hennes

3

Quá trình máy chủ web trên Máy chủ đang lắng nghe trên cổng 80 cho các kết nối trên địa chỉ IP của chính nó. Một kết nối là một địa chỉ IP một cổng, không chỉ một hoặc khác. Như vậy, máy tính của bạn có thể kết nối với cổng 80 trên 3 địa chỉ IP khác nhau mà không gặp vấn đề gì.

PC của bạn không sử dụng cổng 80 ở đầu cục bộ của kết nối. HĐH sẽ sử dụng cổng cục bộ miễn phí tiếp theo trong phạm vi được viết để sử dụng. Đối với Windows, các cổng bắt đầu từ 1024 (phiên bản cũ hơn) hoặc 16536 (phiên bản mới hơn) được sử dụng để kết nối. Các hộp Linux có xu hướng sử dụng các cổng trong phạm vi cao, trên 38000 hoặc hơn.

Bạn có thể xác nhận hành vi này trong Windows (powershell) với:

netstat -a | findstr <the servers IP address>

hoặc trong Linux (với quyền root):

netstat -ntup | grep <the servers IP address>

và lưu ý các cảng địa phương. Nó không phải là cổng 80.

Ngoài ra, một số máy chủ chỉ lắng nghe các kết nối mới trên một cổng (như FTP) và mở một kết nối mới để thực sự truyền dữ liệu hoặc cung cấp dịch vụ. Tuy nhiên, hành vi này hoàn toàn phụ thuộc vào daemon trong câu hỏi. nếu dịch vụ muốn sử dụng các phương tiện khác để theo dõi các phiên riêng lẻ, bạn có thể tự do làm điều đó và giữ tất cả lưu lượng truy cập trên một cổng duy nhất, như TCP / 80.

Chỉnh sửa: để giải quyết câu hỏi mở rộng của bạn:

Trình duyệt của bạn biết một trang web theo tên miền và địa chỉ IP, không phải theo số cổng. Mỗi hệ điều hành hoặc thời gian chạy ứng dụng cung cấp một phiên bản của phương thức Berkeley Sockets GetHostByName(string name)mà nó sử dụng để tra cứu máy chủ từ xa theo tên miền. Trên lớp TCP, như tôi đã đề cập, bạn không sử dụng TCP / 80 cục bộ (chỉ các máy chủ sử dụng 80 và không có cách nào máy chủ tại MSN nhầm lẫn về việc đó có phải là Google không).

Đáng chú ý là khi một chương trình sử dụng một cổng để gửi dữ liệu, có vẻ như nó sẽ gửi luồng dữ liệu đến cổng cục bộ, nhưng điều quan trọng cần nhớ là trong quá trình tạo cổng đó, một kết nối TCP đã được tạo giữa các máy chủ IP , vì vậy cổng đã biết địa chỉ IP từ xa (chỉ) mà cổng cục bộ được kết nối.


Ngày nay, Windows cũng có một phạm vi cổng phù du cao theo mặc định, bắt đầu từ đâu đó tại 65535-16384.
Daniel B

@DanielB, lưu ý.
Frank Thomas

vâng, bạn đúng. Cổng 80 thuộc về máy chủ. bạn nói, "Như vậy máy tính của bạn có thể kết nối với cổng 80 trên 3 địa chỉ IP khác nhau mà không gặp vấn đề gì". Nếu máy tính của tôi sử dụng một số ip cho mỗi yêu cầu (trong khi mỗi máy tính có ip duy nhất) làm thế nào máy chủ có thể nhận ra tôi? Địa chỉ IP thực của tôi có đóng vai trò NAT không?
m-tech

bạn đã hiểu nhầm tôi, ba địa chỉ là IP của Google, Yahoo IP và MSN IP. bạn chỉ có một địa chỉ IP, với ba cổng khác nhau được ánh xạ ở cuối. như một ví dụ bạn có thể đang sử dụng 16537 cho Google: 80, 16538 cho Yahoo: 80 và 16539 cho MSN: 80.
Frank Thomas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.