2012-03-07 11 views
11

Tôi đang cố gắng hiểu các kết nối tcp giữa trình duyệt và máy chủ web. Tôi có một máy chủ web chạy trên máy địa phương của tôi, và có thể duyệt đến nó tốt, như mong đợi, bằng cách sử dụng localhost: 3000 hoặc 127.0.0.1:3000. (Tôi đang chạy "đường ray s" và WEBrick.)Tại sao "ngã ba" cần thiết bởi socat khi kết nối với một máy chủ web?

Tôi muốn đặt phần mềm trung gian giữa trình duyệt và máy chủ web, và bắt đầu thử nghiệm với socat. Các công trình sau đây chỉ hoạt động tốt:

socat TCP-LISTEN:8080,fork TCP:localhost:3000 

Tôi có thể duyệt đến localhost: 8080 và mọi thứ hoạt động như mong đợi. Tuy nhiên, nếu tôi bỏ qua đối số ", ngã ba" như vậy,

socat TCP-LISTEN:8080 TCP:localhost:3000 

trang web đường ray cục bộ bị tắt trong trình duyệt.

Tại sao đối số ngã ba đó lại cần thiết? Tại sao không phải trình duyệt < -> kết nối máy chủ web hoạt động mà không có nó?

Trả lời

23

Nếu không có fork, socat sẽ chấp nhận một kết nối TCP duy nhất, chuyển tiếp dữ liệu hai chiều giữa hai điểm cuối cho đến khi kết nối đó vẫn mở, sau đó thoát. Bạn có thể nhìn thấy chính mình này một cách dễ dàng:

  • Run socat trong một cửa sổ terminal
  • Telnet với localhost 8080 trong một cửa sổ terminal. Nó kết nối với cá thể socat.
  • Telnet đến localhost 8080 trong cửa sổ thiết bị đầu cuối thứ ba. Bạn nhận được một kết nối từ chối lỗi, bởi vì socat không lắng nghe các kết nối mới nữa: nó đã chuyển sang để phục vụ một nó đã có.
  • Nhập yêu cầu HTTP vào cửa sổ đầu cuối thứ hai. Bạn sẽ nhận được phản hồi HTTP và sau đó socat sẽ thoát khi kết nối bị đóng.

tùy chọn fork tùy chọn chỉ giúp ngã ba một đứa trẻ mới xử lý kết nối mới được chấp nhận trong khi cha mẹ quay lại chờ kết nối mới.

socat Sử dụng fork() thay vì điều gì đó phức tạp hơn như làm việc trước hoặc kết nối tổng hợp là lý do bạn không muốn triển khai phần mềm trung gian có hiệu suất cao với socat!

+0

Cảm ơn rất nhiều Celada. Điều đó có ý nghĩa tốt. – user691307

+0

Điều tôi thực sự cố gắng làm là viết chương trình "ở giữa" của riêng tôi giữa trình duyệt và máy chủ web. Nó sẽ mở một kết nối TCP máy khách đến máy chủ web và một máy chủ TCP "nghe" trên một cổng khác. Trình duyệt sẽ mở một kết nối máy khách đến cổng nghe. Vì vậy, ở phía bên trình duyệt, có một chuỗi các phiên TCP mở và đóng. Nhưng ở phía máy chủ web, chỉ có một kết nối TCP được thiết lập. Điều đó không thành công. Tôi nghĩ rằng trung gian homebrew của tôi có thể đóng và mở lại kết nối máy chủ web mỗi khi khách hàng bắt đầu và dừng kết nối tcp. âm thanh ok? – user691307

+0

Âm thanh OK, và cũng là điều đơn giản nhất để làm. Mã của bạn sẽ mở một kết nối mới đến máy chủ mỗi khi tác nhân người dùng HTTP thực hiện và đóng chúng cùng một lúc. Đó là công việc ít hơn nhiều so với việc giải thích nội dung của các yêu cầu HTTP để tìm ra khi nào bạn có thể hoặc không thể tinh chỉnh nội dung để tổng hợp một số kết nối tạo thành máy khách trên một kết nối tới máy chủ. Bằng cách đó, việc thực hiện một máy chủ proxy HTTP chính thức! – Celada