【问题标题】:Android Bad UDP length > IP PAYLOAD lengthAndroid Bad UDP 长度 > IP PAYLOAD 长度
【发布时间】:2015-03-14 15:25:25
【问题描述】:

我编写了一个 Android 程序来接收多播数据包。 代码在下面。 问题是我可以收到正常的数据包, 但我无法接收错误 UDP 长度 > IP PAYLOAD 长度的数据包。 我猜这些伪造的数据包被某人下垂了。 如何在Android中接收假数据包,谢谢!

public class SSDP extends Thread {

/**
 * Default IPv4 multicast address for SSDP messages
 */
public static final String ADDRESS = "239.100.10.100";
public static final String LOG_TAG = "SSDP";
public static final boolean DEBUG = false;

private SocketAddress mMulticastGroupAddress = new InetSocketAddress("239.100.10.100", 2060);
private MulticastSocket mMulticastSocket;
private DatagramSocket mUnicastSocket;
private NetworkInterface mNetIf;
private Context mContext;
private boolean mRunning = false;
private byte[] mFrameNumber, mNowFrameNumber, mSequenceNumber, mNowSequenceNumber;
private ByteArrayBuffer mReadBuffer;
private boolean mLast = false;

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}

public SSDP(Context ctx) throws IOException {
    mContext = ctx;
    mNetIf = Utils.getActiveNetworkInterface();
}

@Override
public synchronized void start() {
    mRunning = true;
    super.start();
}

@Override
public void run() {

    try {
        mMulticastSocket = new MulticastSocket(2060);
        mMulticastSocket.setLoopbackMode(true);
        mMulticastSocket.joinGroup(mMulticastGroupAddress, mNetIf);

        mUnicastSocket = new DatagramSocket(null);
        mUnicastSocket.setReuseAddress(true);
        mUnicastSocket.bind(new InetSocketAddress(Utils.getLocalV4Address(mNetIf),2060));

    } catch (IOException e) {
        UtilLog("Setup SSDP failed: " +  e);
    }

    while(mRunning)
    {
        DatagramPacket dp = null;
        try
        {
            dp = receive();
            //do somethins

        }
        catch (IOException e)
        {
            UtilLog("SSDP fail: " + e); 
        }
    }
    UtilLog("SSDP shutdown.");

}


public synchronized void shutdown() {
    mRunning = false;
}

private void UtilLog(String message)
{
    if(DEBUG)
        Log.d(LOG_TAG, message);

}
private DatagramPacket receive() throws IOException {
    byte[] buf = new byte[1500];
    DatagramPacket dp = new DatagramPacket(buf, buf.length);
    mMulticastSocket.receive(dp);
    return dp;
}
}

【问题讨论】:

  • 对于目标 DatagramPacket 太长的数据包,如果收到的话,应该被截断。对于套接字接收缓冲区来说太大的数据报可能会被完全丢弃。数据报是怎么变得这么大的?对于 UDP,您通常应该将自己限制为 534 字节的有效负载,当然不超过 PATH_MTU。

标签: android sockets networking udp multicast


【解决方案1】:

好的,我解决了。 这是内核中的短数据包问题。 我修改了内核代码。 这是补丁。

Index: net/ipv4/ip_input.c
===================================================================
--- net/ipv4/ip_input.c (revision 10665)
+++ net/ipv4/ip_input.c (working copy)
@@ -420,8 +420,8 @@

    len = ntohs(iph->tot_len);
    if (skb->len < len) {
-       IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INTRUNCATEDPKTS);
-       goto drop;
+       //IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INTRUNCATEDPKTS);
+       //goto drop;
    } else if (len < (iph->ihl*4))
        goto inhdr_error;

Index: net/ipv4/udp.c
===================================================================
--- net/ipv4/udp.c  (revision 10665)
+++ net/ipv4/udp.c  (working copy)
@@ -1631,13 +1631,13 @@
    saddr = ip_hdr(skb)->saddr;
    daddr = ip_hdr(skb)->daddr;

-   if (ulen > skb->len)
-       goto short_packet;
+// if (ulen > skb->len)
+//     goto short_packet;

    if (proto == IPPROTO_UDP) {
        /* UDP validates ulen. */
-       if (ulen < sizeof(*uh) || pskb_trim_rcsum(skb, ulen))
-           goto short_packet;
+//     if (ulen < sizeof(*uh) || pskb_trim_rcsum(skb, ulen))
+//         goto short_packet;
        uh = udp_hdr(skb);
}

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多