Связь Android с сервером очень медленная из-за длинных пакетов DNS - PullRequest
0 голосов
/ 17 февраля 2012

Я работаю над проектом, который обменивается данными с сервером через URLConnection.

Вот код:

URL theSite;
theSite = new URL(TestURL);
URLConnection con = theSite.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));

Однако это касается моих Motorola Atrix и Samsung Nexus S о20 секунд или более при разговоре с сервером.(Информация отправляется, в конце концов она отправляется). Глядя на пакеты в wireshark, я обнаружил, что отправляется много групп DNS-пакетов, между которыми примерно 3-5 секунд.Вероятно, это является причиной медленной связи.

Вот два примера DNS-пакетов.(Я изменил IP-адреса, за исключением пункта назначения 8.8.8.8, который, как мне кажется, называется Google)

Time         Source    Destination  Protocol   Info
20.308792 10.10.120.104  8.8.8.8    DNS       Standard query PTR 3.120.10.10.in-addr.arpa
25.360726 10.10.120.104  8.8.8.8    DNS       Standard query PTR 3.120.10.10.in-addr.arpa

В любом случае, сегодня это произошло совершенно неожиданно.Но очень очевидно, что именно эти DNS-вызовы вызывают медленную связь между сервером и моим устройством.

Еще одно замечание, что я также пробовал EXACT тот же код на планшете Samsung Galaxy 10.1, и он работает нормально.Глядя на трассировку пакетов, с планшета не происходит никаких дополнительных DNS-вызовов.

У меня нет контроля над сервером, и мне были отправлены пакеты.У кого-нибудь есть предложения?Я предполагаю, что это проблема, связанная с сервером.Если у кого-то есть идеи, это очень ценится.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2012

Мы поняли это. Оказывается, на стороне серверов были проблемы с маршрутизацией DNS-пакетов, и они продолжали отсчет времени, которое они исправили.

Что-то, что мы добавили, чтобы не допустить повторения этой проблемы, - это ручная настройка времени ожидания DNS, чтобы после одного сбоя время ожидания пакета DNS было почти мгновенным. Использование InetSocketAddress является ключом.

Вот пример кода, чтобы заставить это работать.

    int timeout = 0; //How ever long you want to set the timeout to. 
    somePageParameters = "Parameter String";
    InetSocketAddress isock = new InetSocketAddress(ip, 1000);
    Socket s = null;
    s = new Socket();
    s.connect(isock,timeout);
    OutputStream os = s.getOutputStream();
    String myString = "";
    myString = "GET "+"/"+ somePageParameters+" HTTP/1.0\n\r\n\r";
    System.err.println("Hitting with: "+myString);
    byte outbuf[] = myString.getBytes();
    os.write(outbuf);
    os.flush();

Затем используйте этот сокет, как обычно.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 17 февраля 2012

Вы используете 4g или 3g? У меня был очень похожий опыт сегодня, и я заметил, что задержка присутствовала только при использовании 4g. 3g вроде бы нормально.

AFAIK, 4g по умолчанию использует адреса ipv6, а 3g по умолчанию использует ipv4. Эта задержка приводит к сбою ipv6, переходу на аварийное переключение и, наконец, к перенаправлению. Для меня это заняло около 20 секунд.

В настоящее время я жду отзывов от команды сервера, чтобы узнать, настроен ли наш DNS для правильной обработки ipv6.

Но, честно говоря, это только так, как я понял, извините, это не является чем-то определенным.

...