Общие вопросы реализации TCP/IP

Я реализовал концепции, показанные здесь; http://wiki.unity3d.com/index.php/Simple_TCP/IP_Client_-_Server за пределами единства, и это работает. (хотя мне пришлось создать TCPIPServerApp с нуля, так как я нигде не мог найти базовый проект).

Однако у меня есть несколько общих вопросов о том, как правильно использовать tcp/ip. Я провел некоторое исследование самого tcp/ip, но я все еще немного запутался.

Похоже, что использование описанного выше метода не гарантирует, что я увижу сообщение (res). Он просто проверяет каждое обновление, чтобы увидеть, есть ли другое сообщение в res. Что, если будет отправлено несколько сообщений и программа будет зависать или что-то в этом роде, я пропущу более ранние пакеты? Должен ли я вместо этого сделать массив, чтобы он хранил последние X сообщений?

Как я узнаю, что данные были получены? Нужно ли мне добавлять идентификатор сообщения и встраивать в данные собственное подтверждение?

Должен ли я проверить, используется ли порт, прежде чем устанавливать соединение?

Извините за все вопросы. Все это ново для меня, но мне это очень нравится!

... Ниже уже ответил Антон, спасибо

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

TCP автоматически разбивает данные на несколько пакетов, если это необходимо, верно?


person vdidxho    schedule 09.11.2013    source источник


Ответы (1)


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

So after each segment which the client receives it sends back an acknowledgement. So only after that the server sends another segment. Actually they send not one segment, but for the sake of reducing traffic the server can send many segments. However, idea is still the same. Again the TCP is a reliable protocol comparing to UDP where the client never sends back acknowledgements. So an example of UDP is any shooter games where we don't rely on each segment. Everyone definitely saw so called lags in games.

Конечно, TCP использует идентификаторы подтверждения, чтобы узнать, был ли подтвержден сегмент или нет! Но он также должен знать, как строить все сегменты. Помните, что все данные отправляются порциями, а после их нужно строить обратно!

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

person Anton    schedule 09.11.2013