Что вызывает «нарушение протокола Tcp, ожидающее преамбулу» в .NET Remoting? - PullRequest
8 голосов
/ 30 августа 2010

У меня есть распределенное приложение, которое использует .NET Remoting в собственной гигабитной сети. Существует один сервер и более десятка клиентов, которые подключаются к серверу. Клиенты запускают несколько потоков, и от каждого клиента может быть до 10 одновременных запросов.

Это приложение работает очень хорошо большую часть времени. Сервер работает в течение нескольких месяцев. Время от времени я получаю исключение на клиенте, и я не могу понять, что вызвало исключение. Исключением и трассировкой стека являются:

System.Runtime.Remoting.RemotingException: Tcp channel protocol violation: expecting preamble.

Server stack trace: 
   at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadAndMatchPreamble()
   at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation)
   at System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders()
   at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
   at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

Это трассировка стека туда, где я делаю удаленный вызов.

Я посмотрел и не могу найти ничего необычного в звонках, которые я совершаю, или в данных, которые возвращает сервер.

Поиски в Google по этой ошибке не очень плодотворны. Большинство ошибок, которые я видел, связаны с тем, что кто-то конвертирует HTTP и TCP и не меняет все, поэтому они получают исключение при попытке подключения. В моем случае клиент будет работать в течение дней , прежде чем я получу эту ошибку.

Еще одна точка данных: сервер получает много запросов. Большинство клиентов являются веб-сканерами, каждый из которых отправляет более 2000 запросов к серверу каждую минуту. Таким образом, сервер обрабатывает свыше 500 запросов в секунду, с пакетами более высокого трафика. В любом случае сервер, похоже, нормально обрабатывает трафик, и я ожидаю, что в случае его перегрузки произойдет совсем другая ошибка.

Есть идеи, что вызывает эту ошибку?

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

Эта ошибка обычно возникает, когда сообщение получено с неправильными заголовками. Вы можете повторить эту ошибку, создав соединение telnet с вашим сервером и набрав что-нибудь. В большинстве случаев это ошибка сети.

Я настоятельно рекомендую проверить ваш брандмауэр. Некоторые брандмауэры сбрасывают сетевые пакеты из-за неправильного предупреждения об атаке.

Балансировка нагрузки - еще одна возможная причина. Балансировщик нагрузки разделяет пакеты на разные серверы.

0 голосов
/ 25 июля 2014

Я вижу эту проблему, когда MS DNS-сервер использует слишком много открытого порта, поэтому исходящий порт не может быть создан.Да, это очень смешно.

...