ウェブページhttp://www.tenouk.com/Module43a.htmlに従って、raw ソケット経由で udp パケットを送信する rawudp プログラムを作成しました。次に、特定のポートでudpパケットをリッスンするudpサーバーを作成しました。コードは次のようになります。
...
sd = socket(AF_INET, SOCK_DGRAM, 0);
bind(sd, (struct sockaddr *)&ipaddr, sizeof(ipaddr));
size = recvfrom(sd, msgbuf.text, 2000, 0, (struct sockaddr *)&sin, &sin_len);
... // print the recevied udp packet
rawudp を使用して udp パケットを udp サーバーに送信した場合、送信元 IP アドレスと宛先 IP アドレスが異なっていても問題ありません。ただし、送信元 IP アドレスと宛先 IP アドレスが同じ場合、udp サーバーは udp パケットを受信できませんでした。
tcpdump を使用して udp パケットをキャッチしようとしました。そして、同じ送信元と宛先のIPアドレスを使用すると、tcpdumpがudpパケットを表示できることがわかりました。送信元と宛先の IP アドレスが同じで、どこかで udp パケットがドロップされたように見えたため、udp サーバーのソケットで受信されませんでした。
以下はいくつかのログです (ログで IP アドレスが更新されました)。2 つのケースの唯一の違いは、送信元 IP アドレス (192.168.0.26 対 192.168.0.226) でした。
私はこの問題に行き詰まりました。誰かが私を助けることができますか。前もって感謝します。
udp クライアント側 (rawudp):
case 1> rawudp 192.168.0.26 18321 192.168.0.226 19702 test.bin # using different source and destination ip addresses
size of ip header: 20
size of udp header: 8
read 69 bytes from file test.bin successfully.
socket() - using SOCK_RAW socket and UDP protocol is OK.
setsockopt() is OK.
total length of IP packet: 97
0000: 4500 6100 0000 4000 4011 CD8F C0A8 001A
0010: C0A8 00E2 4791 4CF6 004D 0000 0104 0401
0020: FF00 0105 084E 0600 5225 1183 0406 0501
0030: 5211 3840 0D05 2735 2109 02C0 0023 0101
0040: 8080 448D 30C0 0300 9005 093C 5E56 8791
0050: 4B2D B7C0 082A 0000 2900 0000 0412 0C95
0060: 00
sendto() is OK.
case 2> rawudp 192.168.0.226 18321 192.168.0.226 19702 test.bin # using same source and destination ip addresses
size of ip header: 20
size of udp header: 8
read 69 bytes from file test.bin successfully.
socket() - using SOCK_RAW socket and UDP protocol is OK.
setsockopt() is OK.
total length of IP packet: 97
0000: 4500 6100 0000 4000 4011 CCC7 C0A8 00E2
0010: C0A8 00E2 4791 4CF6 004D 0000 0104 0401
0020: FF00 0105 084E 0600 5225 1183 0406 0501
0030: 5211 3840 0D05 2735 2109 02C0 0023 0101
0040: 8080 448D 30C0 0300 9005 093C 5E56 8791
0050: 4B2D B7C0 082A 0000 2900 0000 0412 0C95
0060: 00
sendto() is OK.
UDP サーバー側:
case 1>
udp server receive 69 bytes from ip address 192.168.0.26 port 18321, sin_len 16
02:13:24.252841 IP 192.168.0.26.18321 > 192.168.0.226.19702: UDP, length 69
0x0000: 4500 0061 0000 4000 4011 0198 c0a8 001a E..a..@.@.......
0x0010: c0a8 00e2 4791 4cf6 004d 0000 0104 0401 ....G.L..M......
0x0020: ff00 0105 084e 0600 5225 1183 0406 0501 .....N..R%......
0x0030: 5211 3840 0d05 2735 2109 02c0 0023 0101 R.8@..'5!....#..
0x0040: 8080 448d 30c0 0300 9005 093c 5e56 8791 ..D.0......<^V..
0x0050: 4b2d b7c0 082a 0000 2900 0000 0412 0c95 K-...*..).......
0x0060: 00
.
02:13:39.500469 IP 192.168.0.226.18321 > 192.168.0.226.19702: UDP, length 69
0x0000: 4500 0061 0000 4000 4011 00d0 c0a8 00e2 E..a..@.@.......
0x0010: c0a8 00e2 4791 4cf6 004d 0000 0104 0401 ....G.L..M......
0x0020: ff00 0105 084e 0600 5225 1183 0406 0501 .....N..R%......
0x0030: 5211 3840 0d05 2735 2109 02c0 0023 0101 R.8@..'5!....#..
0x0040: 8080 448d 30c0 0300 9005 093c 5e56 8791 ..D.0......<^V..
0x0050: 4b2d b7c0 082a 0000 2900 0000 0412 0c95 K-...*..).......
0x0060: 00
同じホストでrawudpとudpサーバーを実行すると、送信元と宛先のIPアドレスを同じに設定すると、updサーバーはrawudpからudpパケットを受信できます。しかし、udp サーバーとは別のホストで rawudp を実行すると、それらの IP アドレスを同じに設定すると、udp サーバーは rawudp から upd パケットを受信できませんでした。どちらの場合も、tcpdump は udp サーバー側で udp パケットをキャッチできます。
後者の場合、送信元と宛先の IP アドレスが同じ UDP パケットのみが影響を受けます。それらを別々に設定すると、upd サーバーは常に udp パケットを受信できます。lo
パケットがインターフェイスから受信されない場合、カーネルが同じローカル IP アドレスを持つパケットをドロップできるかどうかはわかりません。