2010-03-05 24 views
6

Tôi đang triển khai một ứng dụng từ xa. Máy chủ sẽ xử lý & hiển thị dữ liệu theo thời gian thực dưới dạng hoạt ảnh. (một loạt các hình ảnh, để được chính xác) Mỗi ​​lần, một hình ảnh được trả lại, nó sẽ được chuyển giao cho khách hàng nhận iPhone thông qua UDP.Gửi một lượng lớn dữ liệu được xử lý thời gian thực qua UDP tới iPhone từ máy chủ

tôi đã nghiên cứu một số UDP và tôi biết những điều sau đây:

  • UDP có kích thước tối đa khoảng 65k.

  • Tuy nhiên, có vẻ như iPhone chỉ có thể nhận gói 41k UDP. iPhone dường như không thể nhận được gói lớn hơn.

  • Khi gửi nhiều gói, nhiều gói đang bị loại bỏ. Điều này là do quá trình xử lý UDP quá khổ.

  • Giảm kích thước gói tăng số lượng gói không bị giảm, nhưng điều này có nghĩa là cần phải gửi thêm gói.

Tôi chưa bao giờ viết các ứng dụng UDP thực tế thực sự trước đây, vì vậy tôi cần một số hướng dẫn về truyền thông UDP hiệu quả. Trong trường hợp này, chúng tôi đang nói về việc chuyển hình ảnh được hiển thị trong thời gian thực từ máy chủ được hiển thị trên iPhone.

Nén dữ liệu có vẻ bắt buộc, nhưng trong câu hỏi này, tôi muốn tập trung vào phần UDP. Thông thường, khi chúng ta triển khai các ứng dụng UDP, chúng ta có thể làm gì để thực hành tốt nhất cho lập trình UDP hiệu quả nếu chúng ta cần gửi nhiều dữ liệu không ngừng trong thời gian thực?

+0

Có lý do cụ thể nào bạn chọn UDP qua TCP không? –

Trả lời

9

Giả sử rằng bạn có một lý do rất cụ thể và tốt cho việc sử dụng UDP và rằng bạn cần tất cả dữ liệu của bạn đến (tức là bạn không thể chịu đựng được bất kỳ mất dữ liệu) sau đó có một vài điều bạn cần phải làm (điều này giả định một ứng dụng uni-cast):

  1. Thêm số thứ tự cho tiêu đề cho mỗi gói
  2. Ack mỗi gói
  3. Thiết lập bộ đếm thời gian truyền lại để gửi lại gói nếu không có ack recv'ed
  4. Theo dõi thời gian chờ RTT (thời gian chuyến đi khứ hồi) để bạn biết thời gian đặt bộ hẹn giờ của mình là
  5. . quan trọng đối với ứng dụng của bạn
  6. Tăng kích thước bộ đệm trên ổ cắm ứng dụng khách.

Ngoài ra, bạn có thể gửi quá nhanh đến nỗi bạn đang bỏ gói trong nội bộ trên máy gửi mà không cần phải lấy NIC ra trên dây. Trên một số hệ thống nhất định, hãy chọn chọn cho ghi-ablity trên ổ cắm gửi có thể giúp với điều này. Ngoài ra, việc kết nối cuộc gọi trên ổ cắm UDP có thể tăng tốc hiệu suất dẫn đến các gói dữ liệu bị giảm ít hơn.

Về cơ bản, nếu bạn cần đảm bảo phân phối dữ liệu theo thứ tự của mình hơn là bạn sẽ triển khai lại TCP trên UDP. Nếu lý do duy nhất bạn sử dụng UDP là độ trễ, thì bạn có thể sử dụng TCP và vô hiệu hóa Nagle Algorithm.Nếu bạn muốn dữ liệu được đóng gói với độ trễ thấp đáng tin cậy, một khả năng khác là SCTP, cũng với Nagle bị vô hiệu hóa. Nó cũng có thể cung cấp giao hàng không theo thứ tự để tăng tốc độ nhiều thứ hơn nữa.

Tôi muốn giới thiệu "Unix Network Programming" của Steven có phần UDP nâng cao và khi nào thích hợp để sử dụng UDP thay vì TCP. Như một lưu ý, ông đề nghị chống lại bằng cách sử dụng UDP cho chuyển dữ liệu số lượng lớn, mặc dù thực tế là điều này đang trở nên phổ biến hơn nhiều trong những ngày này để streaming các ứng dụng đa phương tiện.

0

gói nhỏ có lẽ là tốt hơn so với các gói tin lớn :-)

+0

Xin lỗi, nhưng điều này không giúp gì cả. Bạn có thể vui lòng xây dựng thêm? – Karl

+1

Thực hành tốt các ứng dụng UDP là giữ kích thước gói theo kích thước MTU sao cho không có phân mảnh. Lưu ý rằng kích thước MTU nói chung là khá thấp. Giống như 1396 byte. –

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