Thực tế đầu tiên:
UDP có trường kiểm tra 16 bit bắt đầu từ bit 40 của tiêu đề gói.Đây bị (ít nhất) 2 điểm yếu:
- Checksum là không bắt buộc, tất cả các bit đặt thành 0 được định nghĩa là "Không checksum"
- nó là một 16 bit Trả phòng tổng theo nghĩa hẹp của từ, vì vậy nó dễ bị hư hỏng không bị phát hiện.
Điều này đồng nghĩa với việc tổng kiểm tra tích hợp của UDP có thể hoặc không đủ tin cậy, tùy thuộc vào môi trường của bạn.
thực tế thứ hai:
Một mối đe dọa thậm chí thực tế hơn courruption dữ liệu dọc theo giao thông là mất gói sắp xếp lại: USP không đảm bảo về
- tất cả các gói đến (cuối cùng) đến tất cả
- các gói để đến cùng một chuỗi như được gửi
thực sự UDP không có cơ chế tích hợp để xử lý tải trọng lớn hơn gói duy nhất, xuất phát từ thực tế, rằng nó không được xây dựng cho điều đó.
Kết luận:
Phụ thêm gói sau khi gói như nhận được mà không cần các biện pháp bổ sung là bị ràng buộc để tạo ra một nhận dòng khác nhau từ send suối trong tất cả các môi trường rất favourablest, làm cho nó một ít hơn giao thức tối ưu cho tập tin trực tiếp. chuyển khoản.
Nếu bạn làm muốn hoặc phải sử dụng UDP để chuyển tệp, bạn cần phải xây dựng các phần đó, không thể thiếu trong TCP mà không phải UDP vào ứng dụng. Có một câu nói mặc dù, rằng điều này rất có thể sẽ dẫn đến một reimplementation inefrior của TCP.
Triển khai thành công bao gồm nhiều giao thức chia sẻ tệp ngang hàng, nơi bảo vệ chống gián đoạn kết nối và mất gói hoặc sắp xếp lại cần phải là một phần của chức năng apllication để đánh bại hoặc giảm thiểu bộ lọc.
khuyến nghị thực hiện:
gì đã làm việc cho chúng ta là một thực hiện cửa sổ chunked: Tải trọng được tách ra thành những phần có chiều dài cố định và thuận tiện, (chúng tôi sử dụng 1023 byte) một mảng tình trạng của N khối như được giữ vào cuối gửi và nhận.
Về phía gửi:
- Một UDP thông điệp được inititated, có chứa một đoạn như vậy, số thứ tự của nó (nhiều hơn một lần) trong dòng và một checksum hoặc băm.
- Các vết mảng tình trạng đoạn này là "gửi/chờ" với timestamp
- Gửi điểm dừng, nếu mảng tình trạng đầy đủ (gửi cửa sổ) được tiêu thụ
Về phía nhận:
- các gói đã nhận được kiểm tra với tổng kiểm tra của họ,
- gói bị hỏng được negativly thừa nhận nếu tất cả các bản sao của số thứ tự đồng ý, bỏ khác
- Các gói OK được đánh dấu trong mảng trạng thái là "đã nhận/đang chờ xử lý" với dấu thời gian
- Lời cảm ơn hoạt động bằng cách gửi gói ack nếu đủ khối nhận được để điền vào gói ack hoặc dấu thời gian của dấu "nhận/đang chờ xử lý "phát triển quá cũ (một số ms đến khoảng 100ms).
- Gói Ack cần kiểm tra, nhưng không cần giải trình tự.
- Chunks, mà một ack đã được gửi đi, được đánh dấu là "ack/chờ" với timestamp trong mảng tình trạng
Về phía gửi:
- gói Ack được tiếp nhận và kiểm tra , các gói bị hỏng bị loại bỏ
- Các khối, đã nhận được ack, được đánh dấu là "ack/done" trong mảng trạng thái
- Nếu đoạn đầu tiên trong mảng trạng thái được đánh dấu "ack/done", trạng thái mảng trượt lên, cho đến khi đoạn đầu tiên của nó một lần nữa không được thực hiện.
- Điều này có thể phát hành một hoặc nhiều đoạn chưa gửi được gửi đi.
- cho các phần trong trạng thái "đã gửi/đang chờ xử lý", thời gian chờ trên dấu thời gian kích hoạt gửi mới cho đoạn này, vì đoạn gốc có thể đã bị mất.
Về phía nhận:
- Tiếp nhận đoạn i + N (N là chiều rộng cửa sổ) đánh dấu đoạn i như ack thực hiện, trượt lên cửa sổ/nhận. Nếu không phải tất cả các khối trượt ra khỏi cửa sổ nhận được được làm thành "ack/pending", đây là lỗi không thể khôi phục.
- cho các đoạn trong trạng thái "ack/pending", một thời gian chờ trên dấu thời gian kích hoạt mã mới cho đoạn này, vì thư ack gốc có thể đã bị mất.
Rõ ràng là cần có một loại thông báo đặc biệt từ phía gửi, nếu cửa sổ gửi trượt ra cuối tệp, để nhận tín hiệu ACK mà không gửi đoạn N + i, chúng tôi đã triển khai chỉ đơn giản là gửi N khối hơn tồn tại, nhưng không có trọng tải.
Nguồn
2013-04-02 18:13:32
Đây là chính xác những gì tôi đã nói: * ... làm cho nó một giao thức ít hơn tối ưu để chuyển tập tin trực tiếp * amd * điều này rất có thể sẽ dẫn đến việc tái triển khai không hợp lệ của TCP *. Khuyến nghị thực hiện của tôi bắt đầu với * Nếu bạn muốn hoặc phải sử dụng UDP *, vì vậy tôi hoàn toàn với bạn. 1. Bạn nên sử dụng TCP, 2. chỉ khi bạn phải sử dụng UDP, sau đó ... –
Cảm ơn câu trả lời kỹ lưỡng. Cách tiếp cận này được gọi là "quay trở lại N ARQ"? – Reek