发送不会在服务器上分段UDP数据包并在客户端接收分段数据包

时间:2016-11-23 23:40:13

标签: c networking ip-fragmentation

我在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 virtualizied),所有数据包都没有设置片段:

server sniffier

但是在客户端,大包接收碎片!!

client side wireshark

然后我想到了一些更有线的东西。 IPv4 ID字段已设置为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的数据包跟踪示例。就像你看到它至少有IPv4 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 个答案:

没有答案