Máy chủ web và trình duyệt web của tôi dường như đang sử dụng cổng 80 cùng một lúc


1

Nếu tôi, trên OS X,

  1. Bắt đầu Firefox.
  2. Bắt đầu Google Chrome.
  3. Khởi động máy chủ Ruby on Rails trên cổng 80 (sử dụng RVM)

    rvmsudo rails -p 80
    
  4. Sử dụng lsof để xem những gì đang chạy trên cổng 80

    sudo lsof -i:80
    

Sau đó, tôi thấy "ruby", "firefox" và "Google" trong đầu ra.

Tôi nghe tất cả thời gian mà chỉ có một quá trình có thể nghe trên một cổng. Làm thế nào tất cả những thứ này có thể sử dụng cổng 80 cùng một lúc? Cách Firefox và Chrome sử dụng cổng khác với cách Rails sử dụng cổng như thế nào?


1
Làm thế nào bạn kết luận rằng các quy trình được liệt kê thực sự nghe về bạn địa phương cổng 80?
Run CMD

Tôi biết Rails đang lắng nghe (thông qua WEBrick) bởi vì, đó là máy chủ web và tôi có thể yêu cầu từ trình duyệt web đến máy chủ Rails trên cổng 80, ví dụ sử dụng URL localhost
David Winiecki

Tuy nhiên, tôi nghĩ rằng tôi đã sai khi Firefox và Chrome đang sử dụng địa phương cổng 80 cả.
David Winiecki

Câu trả lời:


1

Sau khi tìm hiểu và cố gắng sudo lsof -isudo lsof -iTCP, Và đọc "Các trình duyệt web có sử dụng các cổng đi khác nhau cho các tab khác nhau không?" , Tôi nghĩ rằng tôi chỉ đọc đầu ra từ lsof không chính xác

Đây là một ví dụ:

$ sudo lsof -iTCP:80
COMMAND  PID  USER      FD  TYPE     DEVICE  SIZE/OFF  NODE NAME
...
firefox xxxx  user  xxxxxx  IPv4  xxxxxxxxx    xxxxxx   TCP 192.168.0.100:12345->stackoverflow.com:http (ESTABLISHED)

Nhìn vào ví dụ này và đầu ra khác từ sudo lsof -i Tôi nghĩ khá rõ ràng rằng dòng này từ Firefox xuất hiện trong đầu ra vì Firefox đang kết nối đến cổng 80 trên một máy chủ từ xa, từ cổng cục bộ 12345. Firefox không kết nối với máy chủ từ xa từ cảng địa phương 80.

Tôi không biết liệu một khách hàng như Firefox có thể kết nối từ cổng 80 hay không trong khi một máy chủ cục bộ đang lắng nghe cổng 80, nhưng những gì đang xảy ra ở đây ít nhất dường như không thách thức ý tưởng đó, bởi vì đó không phải là những gì Firefox đang làm.

sudo lsof -i:80 -s TCP:^LISTEN hiển thị các kết nối tới cổng 80 trên các máy tính từ xa, trừ khi máy khách cục bộ sử dụng cổng cục bộ 80 để kết nối với một cái gì đó. Thật lạ là dường như không có tùy chọn nào để liệt kê địa phương cổng đang được sử dụng.


1
Chỉ có một mô tả ổ cắm có thể tồn tại cho một cổng cụ thể trên một phiên bản hệ điều hành. Tuy nhiên, việc sử dụng khái niệm "quy trình" ở đây là không chính xác, bởi vì có thể chia sẻ mô tả đó với các quy trình con. Rõ ràng, ý tưởng cơ bản là không cần phân biệt đối xử nữa trên lớp vận chuyển, điều này có ý nghĩa vì nó không hiệu quả. Hệ điều hành sẽ không liên kết nhiều hơn một bộ mô tả ổ cắm với một cổng cục bộ (xem man 3posix connect ). Ngoài ra, số cổng phía khách thường bắt đầu từ 1000 theo quy ước để phân biệt với cổng phía máy chủ.
Run CMD

Ngoài ra, cổng ngẫu nhiên mà một ứng dụng sử dụng (trình duyệt yêu cầu HĐH cho một cổng) sẽ từ một phạm vi cao, chắc chắn trên 1024.
Arjan

0

Nói chung tất cả các trình duyệt (phía máy khách) kết nối với cổng 80 trên máy chủ web (phía máy chủ). Vì vậy, ở phía máy chủ chỉ có cổng 80 ở trạng thái nghe. Các trình duyệt sử dụng bất kỳ kết nối TCP nào tới cổng 80 trên máy chủ web.


-1

Câu trả lời ngắn: a port cannot be shared

Vì bạn chỉ có một IP và bạn có thể nhận được rất nhiều dữ liệu đến với bạn cùng một lúc, các cổng đang được sử dụng để gửi dữ liệu đến quy trình có nghĩa là nhận dữ liệu đó. Điều này dẫn chúng ta đến dòng đầu tiên: ports cannot be shared.

Các quy trình phía máy chủ có một cổng cụ thể và chúng không bao giờ thay đổi nó trừ khi bạn làm như vậy, nhưng mặt khác, máy khách chỉ mở một cổng cao ngẫu nhiên và kết nối với máy chủ. Cổng đó có thể được sử dụng lại nhưng quá trình tương tự lại hoặc không, nhưng bạn không bao giờ biết và nó không thành vấn đề.


Đó không phải là một cách tốt để đặt nó. Nói một cách chính xác, bộ dữ liệu (địa chỉ IP cục bộ, cổng TCP cục bộ, địa chỉ IP từ xa, cổng TCP từ xa) cần phải là duy nhất. Tất nhiên, một số triển khai có thể áp đặt nhiều hạn chế hơn để giữ cho nó đơn giản.
Daniel B
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.