2010-01-04 28 views
16

Tôi đang cố gắng để có được một xử lý về những gì sẽ xảy ra khi một máy chủ xuất bản (trên tcp, udp, vv) nhanh hơn một khách hàng có thể tiêu thụ dữ liệu.điều gì sẽ xảy ra khi máy chủ tcp/udp xuất bản nhanh hơn máy khách đang tiêu thụ?

Trong chương trình, tôi hiểu rằng nếu hàng đợi nằm giữa nhà sản xuất và người tiêu dùng, nó sẽ bắt đầu trở nên lớn hơn. Nếu không có hàng đợi, sau đó nhà sản xuất chỉ đơn giản là sẽ không thể sản xuất bất cứ điều gì mới, cho đến khi người tiêu dùng có thể tiêu thụ (tôi biết có thể có nhiều biến thể hơn).

Tôi không rõ ràng về những gì xảy ra khi dữ liệu rời khỏi máy chủ (có thể là một quá trình, máy hoặc trung tâm dữ liệu khác) và được gửi cho khách hàng. Nếu khách hàng chỉ đơn giản là không thể đáp ứng với dữ liệu đến đủ nhanh, giả sử máy chủ và người tiêu dùng được kết nối rất lỏng lẻo, điều gì sẽ xảy ra với dữ liệu trên máy bay?

Tôi có thể đọc ở đâu để biết chi tiết về chủ đề này? Tôi chỉ cần đọc các chi tiết mức thấp của TCP/UDP?

Cảm ơn

+3

RWIN (Cửa sổ nhận TCP) là lượng dữ liệu mà máy tính có thể chấp nhận mà không xác nhận người gửi. Nếu người gửi chưa nhận được xác nhận cho gói đầu tiên được gửi, nó sẽ dừng lại và chờ và nếu việc chờ đợi này vượt quá một giới hạn nhất định, nó thậm chí có thể truyền lại. Đây là cách TCP đạt được truyền dữ liệu đáng tin cậy. –

+1

UDP không có chức năng tương tự, bởi vì nó không quan trọng nếu các gói UDP được nhận –

Trả lời

17

Với TCP có TCP Window được sử dụng để kiểm soát luồng. TCP chỉ cho phép một lượng dữ liệu nhất định duy trì không được nhận biết tại một thời điểm. Nếu máy chủ đang tạo dữ liệu nhanh hơn máy khách đang tiêu thụ dữ liệu thì lượng dữ liệu không được nhận sẽ tăng lên cho đến khi cửa sổ TCP được 'đầy đủ' tại thời điểm này, ngăn xếp TCP gửi sẽ đợi và sẽ không gửi thêm dữ liệu nào cho đến khi máy khách thừa nhận một số dữ liệu đang chờ xử lý.

Với UDP không có hệ thống kiểm soát luồng như vậy; nó hoàn toàn không đáng tin cậy. Các ngăn xếp UDP trên cả máy khách lẫn máy chủ được phép thả các gói dữ liệu nếu chúng cảm thấy giống như nó, cũng như tất cả các bộ định tuyến giữa chúng. Nếu bạn gửi nhiều gói dữ liệu hơn liên kết có thể phân phối tới ứng dụng khách hoặc nếu liên kết cung cấp nhiều gói dữ liệu hơn mã khách hàng của bạn có thể nhận được thì một số trong số đó sẽ bị vứt bỏ. Mã máy chủ và máy khách sẽ không bao giờ biết trừ khi bạn đã xây dựng một số hình thức giao thức đáng tin cậy trên UDP cơ bản. Mặc dù thực sự bạn có thể thấy rằng các gói dữ liệu KHÔNG bị vứt bỏ bởi ngăn xếp mạng và các trình điều khiển NIC chỉ đơn giản là nhai tất cả các nhóm không có sẵn và cuối cùng là phá vỡ hệ thống (xem this blog posting for more details).

Quay lại với TCP, cách mã máy chủ của bạn giao dịch với Cửa sổ TCP trở nên đầy đủ phụ thuộc vào việc bạn đang sử dụng chặn I/O, I/O không chặn hoặc I/O không đồng bộ.

  • Nếu bạn đang sử dụng chặn I/O thì cuộc gọi gửi sẽ chặn và máy chủ của bạn sẽ chậm lại; hiệu quả máy chủ của bạn hiện đang ở bước khóa với khách hàng của bạn. Nó không thể gửi thêm dữ liệu cho đến khi khách hàng đã nhận được dữ liệu đang chờ xử lý.

  • Nếu máy chủ đang sử dụng I/O không chặn thì có thể bạn sẽ nhận được thông báo lỗi cho bạn biết rằng cuộc gọi sẽ bị chặn; bạn có thể làm những việc khác nhưng máy chủ của bạn sẽ cần phải gửi lại dữ liệu vào một ngày sau đó ...

  • Nếu bạn đang sử dụng I/O không đồng bộ thì mọi thứ có thể phức tạp hơn. Với I/O không đồng bộ bằng cách sử dụng Cổng Hoàn thành I/O trên Windows, ví dụ, bạn sẽ không nhận thấy bất kỳ điều gì khác biệt chút nào. Các thư gửi chồng chéo của bạn sẽ vẫn được chấp nhận tốt nhưng bạn có thể nhận thấy rằng chúng sẽ mất nhiều thời gian hơn để hoàn tất. Các gửi chồng lên nhau đang được xếp hàng đợi trên máy chủ của bạn và đang sử dụng bộ nhớ cho các bộ đệm chồng chéo của bạn và có thể sử dụng cả 'nhóm không được phân trang'. Nếu bạn tiếp tục phát hành gửi chồng lên nhau thì bạn sẽ có nguy cơ làm cạn kiệt bộ nhớ nhóm không được phân trang hoặc sử dụng bộ nhớ có khả năng không bị chặn làm bộ đệm I/O. Do đó với I/O không đồng bộ và các máy chủ COULD tạo dữ liệu nhanh hơn khách hàng của họ có thể tiêu thụ nó, bạn nên viết mã điều khiển luồng của riêng mình mà bạn sử dụng các lần hoàn thành từ các ghi của bạn. Tôi đã viết về vấn đề này trên blog của tôi herehere và khung máy chủ của tôi cung cấp mã tự động xử lý vấn đề đó cho bạn.

Theo như các dữ liệu 'trong chuyến bay' là có liên quan TCP ngăn xếp trong cả hai đồng nghiệp sẽ đảm bảo rằng các dữ liệu đến như mong đợi (tức là theo thứ tự và không có gì mất tích), họ sẽ làm điều này bằng gửi lại dữ liệu như và khi được yêu cầu.

1

Máy chủ không thể nhanh hơn máy khách trong một thời gian dài. Sau khi nó đã nhanh hơn máy khách trong một thời gian, hệ thống mà nó được lưu trữ sẽ chặn nó khi nó viết trên socket (viết có thể chặn trên bộ đệm đầy đủ cũng giống như lần đọc có thể chặn trên bộ đệm trống).

0

TCP Wikipedia article hiển thị định dạng tiêu đề TCP là nơi kích thước cửa sổ và số thứ tự xác nhận được lưu giữ. Phần còn lại của các trường và mô tả ở đó sẽ cung cấp một cái nhìn tổng quan tốt về cách hoạt động của công cụ điều chỉnh truyền dẫn. RFC 793 chỉ định các hoạt động cơ bản; các trang 41 và 42 nêu chi tiết điều khiển luồng.

5

TCP có một tính năng được gọi là flow control.

Là một phần của giao thức TCP, máy khách cho máy chủ biết số lượng dữ liệu có thể được gửi mà không làm đầy bộ đệm. Nếu bộ đệm đầy, client sẽ thông báo cho máy chủ biết rằng nó không thể gửi thêm dữ liệu. Khi bộ đệm được làm rỗng một chút, máy khách sẽ thông báo cho máy chủ rằng nó có thể bắt đầu gửi dữ liệu một lần nữa. (Điều này cũng áp dụng khi khách hàng đang gửi dữ liệu đến máy chủ).

Mặt khác, UDP hoàn toàn khác. UDP chính nó không làm bất cứ điều gì như thế này và sẽ bắt đầu giảm dữ liệu nếu nó đang đến nhanh hơn thì quá trình có thể xử lý. Nó sẽ tùy thuộc vào ứng dụng để thêm logic vào giao thức ứng dụng nếu nó không thể mất dữ liệu (tức là nếu nó yêu cầu luồng dữ liệu 'đáng tin cậy').

1

Nếu bạn thực sự muốn hiểu TCP, bạn cần đọc một bản triển khai kết hợp với RFC; thực thi TCP thực sự không chính xác như được chỉ định. Ví dụ, Linux có một khái niệm 'áp lực bộ nhớ' để bảo vệ chống lại việc chạy bộ nhớ DMA của hạt nhân (khá nhỏ), và cũng ngăn cản một ổ cắm chạy bất kỳ ổ cắm nào khác ngoài vùng đệm.

1

Với TCP, điều này không thể xảy ra.

Trong trường hợp UDP, gói sẽ bị mất.

Các vấn đề liên quan