Tôi đang cố gắng tham gia luồng phát đa hướng IGMP từ máy Centos 8 nhưng sau khi gửi THAM GIA, không có lưu lượng truy cập nào đến từ bộ chuyển mạch.
Kết nối đơn giản:
MUX <-----------> cisco3850 <--------> Centos8
192.168.117.13 192.168.117.21
Công tắc ngược dòng (chất xúc tác cisco 3850) được cung cấp MPEG-TS tới 239.1.1.1:4000 từ MUX.
Tôi đã thử cả hai socat
và chương trình của riêng tôi để mở ổ cắm, tham gia luồng và giữ ổ cắm mở. Cả hai đều gửi cùng một thông báo tham gia IGMP như được xác nhận bởi Wireshark:
Giao thức quản lý nhóm Internet
[Phiên bản IGMP: 3]
Loại: Báo cáo thành viên (0x22)
Đặt trước: 00
Tổng kiểm tra: 0xe9fb [chính xác]
[Trạng thái tổng kiểm tra: Tốt]
Đặt trước: 0000
Số bản ghi nhóm: 1
Bản ghi nhóm: 239.1.1.1 Thay đổi sang chế độ loại trừ
Loại bản ghi: Thay đổi thành Chế độ loại trừ (4)
Len dữ liệu phụ trợ: 0
Số Src: 0
Địa chỉ phát đa hướng: 239.1.1.1
sử dụng thêm tuyến đường ip
Tôi đã tạo các tuyến cho các nhóm phát đa hướng tới giao diện:
Liên kết phạm vi dev eth1 224.0.0.0/4
Liên kết phạm vi dev eth1 225.0.0.0/8
Liên kết phạm vi dev eth1 239.0.0.0/8
và con mèo /proc/net/igmp
cho thấy nhóm đã được tham gia:
con mèo /proc/net/igmp
Thiết bị Idx: Trình báo cáo bộ hẹn giờ của người dùng nhóm truy vấn
3 eth1 : 2 V3
030101E1 1 0:00000000 0
010000E0 1 0:00000000 0
Tôi nghi ngờ đây là sự cố với công tắc chứ không phải sự cố Linux, nhưng khách hàng (người sở hữu công tắc) nói rằng mọi thứ đều ổn.
Tôi có thể làm gì khác về phía Linux để điều tra/khắc phục sự cố này?
Nếu đó là một vấn đề trên công tắc thì sao? Những gì cần phải được cấu hình ở đó? (cần giải thích cho khách hàng)
Để tham khảo, chương trình của tôi tham gia và giữ ổ cắm mở trông giống như:
// Kiểm tra lỗi được bỏ qua cho ngắn gọn
fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
setockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes);
bộ nhớ (&saddr, 0, sizeof(saddr));
saddr.sin_family = PF_INET;
saddr.sin_addr.s_addr = mcastAddr;
saddr.sin_port = htons(cổng);
bind(fd, (struct sockaddr *)&saddr, sizeof(saddr);
cấu trúc ip_mreq mcastReq;
mcastReq.imr_multiaddr.s_addr = mcastAddr;
&mcastReq.imr_interface.s_addr = interfaceAddr;
setockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mcastReq, sizeof(mcastReq);