RAWソケットには小さな問題があります。私はそれらを修正するためにネットワークでパケットをキャプチャする必要があります。このために、タイムスタンプのような特別なデータを追加する必要があります。すべて正常に動作しますが、私はMTU(Linux)に問題があります。RAWソケットはMTUを無視する必要があります
上位層のアプリケーションの一部がMTUに近いパケットを生成する場合は、データを追加できません。だから私はシステムのMTUを小さくすることに決めました。だから、私はより小さなパケットを取得し、私のデータを広告することは可能です。しかし、RAW-Socketでパケットを送信しようとすると、動作しません。
IP_MTU_DISCOVERオプションが役立つことがわかった(google、古いStackoverflowスレッドとLinuxのマンページで)。しかしsetsockoptと一緒に使うと何も変わりません。
if ((s = socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)) < 0) {
printf("Error: could not open socket\n");
return -1;
}
char socket_mtu = IP_PMTUDISC_DONT;
setsockopt(s,IPPROTO_IP,IP_MTU_DISCOVER,socket_mtu, 1);
多分それは重要です。 MTUのダウンサイジングは、自分自身のデータを追加すると、結果パケットが1500 + ETH-Headerより大きくならないために行われました。私の問題は、Raw-SocketsがLinuxシステムのローカルMTUを無視するようにすることです。
- IP_MTU_DISCOVERは、MTUに設定された値を無視する正しい方法ですか。
- 私のRAW-SOCKETでは本当にIS IP_MTU_DISCOVERを使用できますか?
- レイヤー3以上のプロトコルのセグメントサイズを減らす方法はありますか?
大きすぎるとsendto()はEMSGSIZE(= 90)を返します。だから私は次のテストを行った。
int k = sendto(s, frame.buffer, frame_len, 0,
(struct sockaddr*)&saddrll, sizeof(saddrll));
printf("K:%i\n", k);
sendto()を呼び出すと、 "k"には "-1"が含まれます。しかし、それがパケットサイズに依存する場合、それは "90"ではないでしょうか?
パケットのサイズを設定すると、MTUを小さくしたいのですが、うまくいきます。少し奇妙です。
すべてのヘルプは
敬具、 アンドレアス