Насколько надежен протокол .NET TCP? - PullRequest
5 голосов
/ 13 апреля 2011

Я довольно новичок в C #, поэтому, пожалуйста, потерпите меня.Я пишу относительно простое клиент-серверное приложение на C # .NET 4.0.Я использую протокол TCP, TCPListener и TCPClient, чтобы быть более конкретным.Я знаю, как протокол TCP работает в теории.Но я должен быть на 100% уверен, что при передаче данных не будет (необработанных) ошибок.

После отправки данных как узнать, были ли данные успешно получены.Могу ли я полностью положиться на реализацию протокола TCP?Поэтому нет необходимости подтверждать с другой стороны, что данные были получены?

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

Ответы [ 5 ]

21 голосов
/ 13 апреля 2011

TCP гарантирует, что:

  • Отправленные вами данные поступят в том порядке, в котором вы их отправили
  • Отправленные вами данные будут получены в точности так, как вы их отправили (без изменений)
  • Никаких других (ложных) данных получено не будет

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

Если вам необходимо положительное подтверждение того, что данные были получены и обработаны, вам необходимо отправить подтверждение обратно вручную (поскольку TCP-соединения являются дуплексными, у вас уже есть канал для этого).

Конечно, все это никак не связано с .NET, Windows или любой другой реализацией сетевого стека.

Обновление: Я хотел бы особо отметить, что после того, как сетевой стек ОС принимает данные для передачи, вы не сможете узнать, что процесс в другой конец получил эти данные. В большинстве случаев сетевой стек знает, что данные достигли цели (через сообщения TCP ACK), , но не знает, передала ли их операционная система цели процессу, для которого они предназначены . Поэтому отправка собственных сообщений «данные получены и действовали по» является единственной возможностью.

4 голосов
/ 13 апреля 2011

С одним только TCP / IP вы не можете определить, получены ли какие-либо данные - вам придется наложить другой протокол поверх.

Если вы сможете выяснить, были ли какие-то конкретные данныеполучен, затем TCP / IP гарантирует все данные до того, как они были также получены.

1 голос
/ 15 апреля 2011

Не существует такого понятия, как протокол .NET TCP.Существует только протокол TCP, который работает в Интернете около 30 лет.Это надежноЭто была цель дизайна.

0 голосов
/ 13 апреля 2011

Если вам действительно нужна надежность И сетевой транспорт, почему бы не использовать Очереди сообщений ?Они имеют транзакционную гарантию (примерно такую ​​же сильную, как дисциплина разработчиков, работающих с ней, но не более того!)

Это похоже на весь ваш трафик с безопасностью типа базы данных и сервера (и так же, как производительность).Я думаю, вы можете легко настроить .NET Remoting для использования канала MSMQ .

Лично я никогда не делал , что , но я вообще использовал очередь сообщений.

0 голосов
/ 13 апреля 2011

Можно использовать надежные сеансы WCF через TCP.Надежные сеансы WCF будут маскировать сбои транспорта.

...