Отправка не фрагментирует пакеты UDP на сервере и получение фрагментированных пакетов на клиенте

Я создал программу на C, которая отправляет данные с UDP-пакетами.

Разъем сделан не фрагментирован используя

int optval = IP_PMTUDISC_DO;
if(setsockopt(sd,IPPROTO_IP,IP_MTU_DISCOVER,&optval,sizeof(int))!=0)
{
    perror("setsocketopt()");
    return 0;
}

Проверка с помощью TSHARK на сервере (виртуализация Debian 8 KVM), для всех пакетов не был установлен фрагмент:

сервер сниффер

Но на клиенте большие пакеты получают фрагментированно!!

Wireshark на стороне клиента

Тогда я понял что-то более проводное. Поле ID IPv4 было установлено в 0!

Я думал, что это может быть из-за эффекта "не фрагментировать" (потому что ни один пакет не будет фрагментирован).

Затем я запустил программу Openvpn и прослушал ее пакеты на сервере, но пакеты имели IPv4 ID!= 0, пока не был установлен фрагмент.

Ребята, вы понимаете, почему это происходит со мной?!

Изменить: Вот еще один пример большого пакета на сервере копии и вставлены из результата tshark.

Frame 1049: 1514 bytes on wire (12112 bits), 1514 bytes captured (12112 bits) on interface 0
Ethernet II, Src: server_mac, Dst: gateway_mac
Internet Protocol Version 4, Src: server_ip, Dst: client_ip
Version: 4
Header Length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
    0000 00.. = Differentiated Services Codepoint: Default (0x00)
    .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
Total Length: 1500
Identification: 0x0000 (0)
Flags: 0x02 (Don't Fragment)
    0... .... = Reserved bit: Not set
    .1.. .... = Don't fragment: Set
    ..0. .... = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: UDP (17)
Header checksum: 0xa52d [validation disabled]
    [Good: False]
    [Bad: False]
Source: server_ip
Destination: client_ip
[Source GeoIP: Unknown]
[Destination GeoIP: Unknown]
User Datagram Protocol, Src Port: 7554 (7554), Dst Port: 45376 (45376)
Data (1472 bytes)   

Как видите, фрагмент не был установлен, в то время как все пакеты, большие, чем PMTU, получают фрагментированные на стороне клиента.

Это пример трассировки пакетов openvpn на том же сервере. как вы видите, по крайней мере, IDv4 ID рассчитан!

Frame 3749: 1455 bytes on wire (11640 bits), 1455 bytes captured (11640 bits) on interface 0
Ethernet II, Src: SERVER_MAC, Dst: GATEWAY_MAC
Internet Protocol Version 4, Src: SERVER_IP, Dst: CLIENT_IP
Version: 4
Header Length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
    0000 00.. = Differentiated Services Codepoint: Default (0x00)
    .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
Total Length: 1441
Identification: 0xcc96 (52374)
Flags: 0x02 (Don't Fragment)
    0... .... = Reserved bit: Not set
    .1.. .... = Don't fragment: Set
    ..0. .... = More fragments: Not set
Fragment offset: 0
Time to live: 64
Protocol: UDP (17)
Header checksum: 0xe252 [validation disabled]
    [Good: False]
    [Bad: False]
Source: SERVER_IP
Destination: CLIENT_IP
[Source GeoIP: Unknown]
[Destination GeoIP: Unknown]
User Datagram Protocol, Src Port: 19234 (19234), Dst Port: 46921 (46921)
Data (1413 bytes)

0 ответов

Другие вопросы по тегам