2010-02-03 4 views
1

У меня проблема с заданием на сокет. Я написал TCP-клиент, который отправляет команды через сокеты/сетевой поток. Я использую Wireshark, чтобы посмотреть на необработанные данные, которые проходят через провода. Каждый раз, когда я отправляю «команду» (это означает, что я Flush() сетевой поток), приложение Wireshark сообщает мне, что контрольная сумма в заголовке TCP неверна (говорит «он должен быть 0x2440, но равен 0x0000). Я получаю ACK back Я не понимаю, почему на уровне приложения мне нужно будет заботиться о заголовке TCP. Это не может быть правильно. Кто-нибудь знает, почему я получаю эту «ошибку». не в курсе? Я использую .NET 2.0 сокеты с Tcp. Спасибо.TCP-программирование с .NET

ответ

8

вы смотрите на Wireshark свалка из машины, которая посылает данные? Если да, то это может быть просто, что контрольная сумма не был рассчитан в точке стека, где Wireshark видит это. Многие сетевые карты в эти дни имеют TCP Checksum Offload, w здесь контрольная сумма выполняется с помощью аппаратного обеспечения, поэтому поле контрольной суммы будет равно нулю на выходе (Wireshark получает пакет непосредственно перед его отправкой на аппаратное обеспечение). Поскольку вы получаете ACK, принимающая сторона явно крута. Кроме того, если вы разговариваете с localhost, ваш стек может вообще не беспокоить контрольные суммы (они не являются строго необходимыми для того, чтобы хост говорил сам с собой).

+0

Спасибо за объяснение. Я этого не знал. Поскольку вы знакомы с этим материалом, могу ли я спросить, как я могу использовать Wireshark, чтобы понять поток байтов, который отправлен? В соответствии с проприетарным протоколом я реализую пакеты, содержащие текст. Но когда я пытаюсь декодировать пакеты, я получаю только тарабарщину. Еще раз спасибо. – John

+0

@John: Не зная, на каком протоколе вы смотрите, мы не можем сказать. Если вы выполняете «Follow TCP stream» в Wireshark, не показывает ли вам какие-либо полезные данные? –

+0

@Jon: это стандартная потоковая передача TCP. «Следит за TCP-потоком» как-то склеивает пакеты. Данные, которые я должен получить, - это простой текстовый файл. Я посмотрю в Wireshark больше. Благодарю. – John