Sử dụng TCP_DEFER_ACCEPT trong thế giới thực?


15

Tôi đã xem qua hướng dẫn sử dụng Apache httpd trực tuyến và đã gặp một chỉ thị cho phép điều này. Tìm thấy một mô tả trong trang người đàn ông cho tcp:

   TCP_DEFER_ACCEPT (since Linux 2.4)
          Allow a listener to be awakened only when data arrives on the
          socket.  Takes an integer value (seconds), this can bound the
          maximum number of attempts TCP will make to complete the
          connection.  This option should not be used in code intended
          to be portable.

Sau đó, tôi tìm thấy bài viết này nhưng tôi vẫn chưa rõ loại khối lượng công việc này sẽ hữu ích cho việc gì. Tôi giả định rằng nếu httpdcó một tùy chọn cụ thể cho việc này, thì nó phải có một số liên quan đến các máy chủ web. Tôi cũng giả sử từ thực tế đó là một tùy chọn và không chỉ là cách httpdkết nối mạng, mà có những trường hợp sử dụng mà bạn muốn nó và những người khác mà bạn không.

Ngay cả sau khi đọc bài viết, tôi vẫn chưa rõ lợi thế của việc chờ đợi bắt tay ba cách là gì. Có vẻ thuận lợi để đảm bảo rằng nó sẽ không cần phải trao đổi trong trường hợp có liên quan httpdbằng cách làm như vậy trong khi bắt tay vẫn đang diễn ra thay vì có khả năng gây ra sự chậm trễ đó sau khi kết nối được hình thành.

Đối với bài viết, đối với tôi, dường như bất kể TCP_DEFER_ACCEPTtrạng thái của ổ cắm, bạn vẫn sẽ cần bốn gói (bắt tay sau đó dữ liệu trong mỗi trường hợp). Tôi không biết làm thế nào họ đếm ngược đến ba, cũng như làm thế nào điều đó mang lại sự tăng cường có ý nghĩa.

Vì vậy, câu hỏi của tôi về cơ bản là: Đây chỉ là một tùy chọn lỗi thời hoặc có một trường hợp sử dụng thực tế cho tùy chọn này?


Tôi không rõ ý của bạn là gì khi "đếm ngược xuống còn ba", điều này khiến tôi nghi ngờ bạn hiểu nhầm cách bắt tay ba cách. Đây là giao dịch "kết nối mở" TCP và bao gồm tổng cộng 3 gói được truyền. Cho đến khi 3 cái này hoàn thành, không có dữ liệu và không có kết nối nào hợp lệ. Như dữ liệu như vậy không bao giờ yếu tố vào chi phí bắt tay. Sự gia tăng hiệu quả mà có thể thu được từ TCP_DEFER_ACCEPT sẽ là khoảng cách giữa việc hoàn thành 'chấp nhận' TCP 3 way handshake, và các gói dữ liệu đầu tiên (tôi giả sử, chủ yếu vào đây để bình luận về 3 vs 4 way handshake)
Iain

Ngoài ra, đó không phải là về việc tránh 'hoán đổi', mà là không lãng phí tài nguyên. Nếu việc hoán đổi trở thành một yếu tố kích hoạt nhân viên HTTP thì bạn buộc nhân viên của mình phải trao đổi sớm tại điểm chấp nhận trước khi dữ liệu sẵn sàng ... và nếu việc hoán đổi đang xảy ra, điều đó có nghĩa là bạn đang buộc một thứ khác ra khỏi ram ... một cái gì đó có thể đang làm gì đó và bị tráo đổi giữa phần chấp nhận / dữ liệu của bạn ... bất cứ tài nguyên nào - CPU, đĩa, trang in-ram, nếu không có dữ liệu, thì sẽ không có lý do gì.
Iain

Nếu tiến trình worker đã có trong bộ nhớ, thì độ trễ khá thấp so với khả năng sẽ vào đĩa? "Xuống đến ba" là một tham chiếu đến bài viết nói rằng bằng cách nào đó điều này sẽ làm cho nó để gói dữ liệu đầu tiên từ máy khách sẽ nằm trên gói thứ ba.
Bratchley

Ngoài ra, việc hoán đổi lý thuyết sẽ xảy ra dù sao đi nữa, điều này sẽ không thay đổi với tùy chọn TCP này. Tôi không thấy việc lấy khoảng cách ra khỏi kết nối TCP và đặt nó vào việc truyền dữ liệu có lợi như thế nào. Ít nhất là khi bạn thực hiện nó trong khi kết nối TCP hình thành, có khả năng hai điều đó xảy ra song song (giảm lượng thời gian).
Bratchley

Đáng lẽ chỉ nên viết một câu trả lời ... Liên quan đến việc nó là một tùy chọn, tốt, nó không phải là cách các tiêu chuẩn unix "bình thường" hoạt động ... Cụ thể về HTTP, điểm quan trọng là máy khách (trình duyệt web) bắt đầu cuộc trò chuyện với Dòng GET ... Vì vậy, máy chủ không quan tâm đến kết nối thực tế, chỉ là dữ liệu đầu tiên. Trái ngược với việc nói rằng SMTP yêu cầu khách hàng đợi cho đến khi máy chủ đưa ra thông báo "biểu ngữ chào mừng 220". Tức là máy chủ đó cần biết về kết nối chứ không phải trên dữ liệu.
iain

Câu trả lời:


14

(để tóm tắt ý kiến ​​của tôi về OP)

Cái bắt tay ba chiều mà họ đang đề cập đến là một phần của thiết lập kết nối TCP, tùy chọn trong câu hỏi không liên quan cụ thể đến điều này. Cũng lưu ý rằng trao đổi dữ liệu không phải là một phần của bắt tay ba cách, điều này chỉ tạo ra kết nối TCP ở trạng thái mở / thành lập.

Liên quan đến sự tồn tại của tùy chọn này, đây không phải là hành vi truyền thống của ổ cắm, thông thường luồng xử lý của ổ cắm được đánh thức khi kết nối được chấp nhận (vẫn còn sau khi bắt đầu ba cách bắt đầu) và đối với một số hoạt động giao thức bắt đầu tại đây ( ví dụ: máy chủ SMTP gửi một dòng chào 220), nhưng đối với HTTP, thông điệp đầu tiên trong cuộc trò chuyện là trình duyệt web gửi dòng GET / POST / etc của nó và cho đến khi điều này xảy ra, máy chủ HTTP không quan tâm đến kết nối (ngoài thời gian nó ra), do đó đánh thức quá trình HTTP khi chấp nhận ổ cắm hoàn thành là một hoạt động lãng phí vì quá trình sẽ ngay lập tức ngủ lại để chờ dữ liệu cần thiết.

Mặc dù có lập luận chắc chắn rằng việc đánh thức các quy trình nhàn rỗi có thể khiến chúng 'sẵn sàng' để xử lý thêm (tôi đặc biệt nhớ việc đánh thức các thiết bị đầu cuối đăng nhập trên các máy rất cũ và cho chúng chui từ trao đổi), nhưng bạn cũng có thể lập luận rằng bất kỳ máy nào có hoán đổi quy trình cho biết đã tạo ra nhu cầu đối với tài nguyên của nó và việc thực hiện thêm các nhu cầu không cần thiết có thể làm giảm hiệu suất hệ thống - ngay cả khi hiệu suất rõ ràng của luồng riêng lẻ của bạn cải thiện (điều đó cũng có thể không, một máy cực kỳ bận rộn sẽ bị tắc nghẽn trên đĩa IO. làm chậm những thứ khác nếu bạn đổi chỗ và nếu bận, giấc ngủ ngay lập tức có thể tráo đổi ngay lập tức). Nó dường như là một canh bạc, và cuối cùng, canh bạc 'tham lam' không nhất thiết phải trả giá trên một cỗ máy bận rộn,

Lời khuyên chung của tôi về mức độ điều chỉnh hiệu suất đó là không đưa ra quyết định theo chương trình về điều gì là tốt nhất, nhưng cho phép người quản trị hệ thống và hệ điều hành làm việc cùng nhau để giải quyết các vấn đề quản lý tài nguyên - đó là công việc của họ và họ rất nhiều phù hợp hơn để hiểu khối lượng công việc của toàn bộ hệ thống và hơn thế nữa. Đưa ra lựa chọn và lựa chọn cấu hình.

Để trả lời cụ thể câu hỏi, tùy chọn này có lợi cho tất cả các cấu hình, không phải ở mức độ bạn có thể nhận thấy ngoại trừ tải cực lớn của lưu lượng HTTP, nhưng về mặt lý thuyết là cách "đúng" để thực hiện. Đây là một lựa chọn vì không phải tất cả các hương vị Unix (thậm chí không phải tất cả Linux) đều có khả năng đó, và do đó đối với tính di động, nó có thể được cấu hình không được đưa vào.


Cảm ơn vì tóm tắt tuyệt vời. Mặc dù tải máy chủ và quá trình hoán đổi / đánh thức là một lợi thế tiềm năng (một sắc thái như bạn đã đề cập), có những lợi ích rõ ràng nếu bạn nhìn vào máy chủ HTTP phục vụ các máy khách có độ trễ cao và thấp. Ví dụ, khi chạy máy chủ web Apache, có sẵn một số quy trình / luồng máy chủ cố định, điều đó có nghĩa là một số lượng máy khách cố định có thể được phục vụ tại bất kỳ thời điểm nào. Vì vậy, không phải việc sử dụng lên Up một quy trình máy chủ trong khi gói dữ liệu của dữ liệu từ một khách hàng chưa đến có thể có nghĩa là quy trình máy chủ có thể phục vụ một khách hàng khác trong thời gian đó.
Ram

-1

Tôi không rõ lợi thế của việc chờ đợi bắt tay ba cách là gì.

Bắt tay ba chiều là một giao thức phổ biến trong điện thoại thoại:

  1. Máy chủ : "Xin chào, Epiphyte Corp"
  2. Người gọi : "Xin chào, đây là Randy."
  3. Máy chủ : "Vâng, tôi có thể giúp gì cho bạn?"
  4. Người gọi : cơ thể của cuộc gọi bắt đầu yêu cầu một trò đùa

Chúng rất quan trọng trong TCP để đảm bảo rằng kênh được thiết lập. Nếu Khách hàng bắt đầu gửi nội dung cuộc gọi trước khi nghe (3), có khả năng Máy chủ không nghe hoặc chưa sẵn sàng. Nghe (3) không đảm bảo rằng Máy chủ không bị cháy tự phát ngay sau khi truyền nhưng điều đó làm tăng sự tin cậy mà Máy chủ sẵn sàng nhận.

Như đã lưu ý trong Wikipedia về Bắt tay :

  1. Alice [Máy ​​chủ] trả lời bằng tin nhắn xác nhận có số xác nhận y + 1, mà Bob [Client] nhận được và anh ta không cần phải trả lời .

Vì vậy, nếu bạn sẵn sàng từ bỏ một chút chắc chắn rằng máy chủ đã sẵn sàng, Máy chủ có thể bỏ qua bước (3) và khách hàng sẽ chỉ cho rằng máy chủ đã sẵn sàng. Điều này biến việc trao đổi giao thức ở trên thành:

  1. Máy chủ : "Xin chào, Epiphyte Corp"
  2. Người gọi : "Xin chào, đây là Randy."
  3. Người gọi : "Bạn có biết bất kỳ câu chuyện cười nào về Imelda Marcos không?"

Đó không chỉ là sự tự tin, bạn gửi trước khi 3way hoàn thành và dữ liệu của bạn được cung cấp. Cách các kết nối TCP được thiết lập trong các ngăn xếp hệ điều hành hiện đại thực tế không có dữ liệu kết nối nào được ghi trong bảng cho đến phần thứ 3 của kết nối, yêu cầu của thông báo thứ 3 trước khi bất kỳ tài nguyên nào được sử dụng đều được thực hiện thông qua việc sử dụng "Cookies Cookies" và ngăn chặn "Tấn công Syn" (là gói bắt tay giả mạo-source-ip 1. gói 3 của nó làm suy yếu ip giả mạo đó.). Do đó, không có kết nối hoặc mục nào cho nó tồn tại trước thời điểm này.
iain

Nghe (3) không đảm bảo rằng Máy chủ không bị cháy tự phát ngay sau khi truyền nhưng điều đó làm tăng sự tin cậy mà Máy chủ sẵn sàng nhận.
msw

Tăng? Từ số không? Vâng, tôi đoán theo nghĩa đen là đúng, nhưng hầu hết mọi người sẽ ngụ ý có / một số / cơ hội trước khi gói 3 tăng lên. Và không có. Đó chỉ là cụm từ "tăng sự tự tin" mà tôi không thích, và tôi không nghĩ bao thanh toán trong 0,001% "các vấn đề lớn trong thế giới thực" giúp giải quyết vấn đề rõ ràng. Chắc chắn, chiến tranh hạt nhân có thể xảy ra trước khi máy chủ nhận được gói, rất nhiều điều có thể xảy ra.
Iain

Ngoài ra tôi chỉ chọn đoạn cuối, trong đó bạn ngụ ý bước 3 là tùy chọn. Nó không, hoàn toàn không. Đọc lại đoạn văn, bước 3 là "trả lời alice với một xác nhận". đó không phải là tùy chọn. bob trả lời rằng (một bước thứ 4 lý thuyết) là.
iain
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.