Разница в этих двух режимах следующая.
Синхронная работа: когда вы вызываете функцию, то программа останавливается и ждет полного ее выполнения. Допустим, что вы запросили соединение с сервером. Программа будет ждать, пока не произойдет реальное соединение или ошибка.
Асинхронная работа: в этом режиме программа не спотыкается о каждую сетевую функцию. Допустим, что вы сделали все тот же запрос на соединение с сервером. Ваша программа посылает запрос на соединение и тут же продолжает выполнять следующие действия, не дожидаясь физического контакта с сервером. Это очень удобно (но тяжело в программировании), потому что можно использовать время ожидания контакта в своих целях. Единственное, что вы не можете делать — вызывать сетевые функции, пока не произойдет реального физического соединения. Недостаток в том, что самому программисту приходится следить за тем, когда закончится выполнение функции и можно будет дальше работать с сетью.