При использовании TCP - устанавливается соединение. Протокол сам разбивает данные на пакеты, отслеживает доставку, порядок. Если в течении timeout пакет не был доставлен - делает повторную отправку данных (пока не сможет доставить, или вернёт ошибку, что соединение умерло) . Ваша задача - только кидать и забирать данные.
При использовании UDP —не гарантируется ничего. Пакеты могут приходить в любом порядке, теряется, задваиваться - задача самого приложения разруливать этот бардак... Но если частичные потери пакетов не страшны - это позволяет экономить время/ресурсы что бы не посылать повторно, что уже не актуально...
Ps, но лучше все же - почитать теорию. Главы из учебника тут никто цитировать не будет...