2009-12-23 34 views
15

Khi nào yêu cầu IPPROTO_UDP?khi nào yêu cầu IPPROTO_UDP?

Có trường hợp nào UDP là không giao thức mặc định cho SOCK_DGRAM không? (Trường hợp thực sự, không giả "nó có thể là", xin vui lòng ")

tức là, các tình huống mà hai dòng sau đây sẽ không tạo hành vi giống hệt nhau là gì

if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) 
if ((s=socket(AF_INET, SOCK_DGRAM, 0))==-1) 

Trả lời

12

Với những tờ khai:

tcp_socket = socket(AF_INET, SOCK_STREAM, 0); 
udp_socket = socket(AF_INET, SOCK_DGRAM, 0); 
raw_socket = socket(AF_INET, SOCK_RAW, protocol); 

các ip(7) tay trang trong linux nói:

Giá trị hợp lệ duy nhất cho giao thức là 0 và IPPROTO_TCP cho các cổng TCP và 0 và IPPROTO_UDP cho các ổ cắm UDP. Đối với SOCK_RAW, bạn có thể chỉ định một giao thức IP IANA hợp lệ được xác định trong RFC 1700 số được chỉ định là .

Hai dòng trong câu hỏi của bạn sẽ luôn tạo ra kết quả tương tự.

+0

Tôi nghĩ rằng bằng cách sử dụng 'IPPROTO_UDP' intsead của số không phải là kết quả tương tự như bạn nhận được một ổ cắm mà đòi hỏi bạn phải điền vào tất cả các tiêu đề. – WilliamKF

14

Một số hệ điều hành (ví dụ: hạt nhân Linux sau 2.6.20) hỗ trợ giao thức thứ hai cho SOCK_DGRAM, được gọi là UDP-Lite. Nếu được hệ thống của bạn hỗ trợ, nó sẽ được kích hoạt bằng cách cung cấp IPPROTO_UDPLITE làm đối số thứ ba cho lệnh socket().

Nó được phân biệt với UDP bình thường bằng cách cho phép kiểm tra chỉ được áp dụng cho một phần của gói dữ liệu. (Thông thường, UDP checksumming là một nỗ lực tất cả hoặc không có gì.) Bằng cách đó, giao thức có thể có khả năng chống lại sự thất bại kiểm tra do sự phân tán bị phân mảnh, trong trường hợp một số mảnh bên ngoài khu vực được kiểm tra có thể bị mất trong quá trình vận chuyển. Miễn là các mảnh bao gồm phần được kiểm tra đã được nhận thành công, càng nhiều datagram càng tốt vẫn sẽ được gửi đến ứng dụng.

Để tương thích ngược với mã hiện có, tôi nghi ngờ (nhưng tôi không thể đảm bảo) rằng ổ cắm cuộc gọi (AF_INET, SOCK_DGRAM, 0) sẽ tiếp tục mặc định thành UDP bình thường, ngay cả trong các hệ thống hỗ trợ UDP-Lite.

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