Ответы
Сокеты бывают блокирующие и неблокирующие. Суть в том, что в случае блокирующих сокетов при попытке прочитать (и записать) данные функция чтения будет ждать до тех пор, пока не прочитает хотя бы один байт или произойдет разрыв соединения или придет сигнал. В случае неблокирующих сокетов функция чтения проверяет, есть ли данные в буфере, и если есть - сразу возвращает, если нет, то она не ждет и также сразу возвращает, что прочитано 0 байт.
А вот синхронные/асинхронные сокеты - это изобретение Майкрософта. Дело в том, что когда вышла 3.11 виндовс, то в ней была только кооперативная многозадачность (это когда само приложение решало, что оно уже поработало и пора дать другим поработать. Если приложение зависло, то остальные приложения курят в сторонке). Неблокирующие сокеты были бы решением, но с ними есть одна проблема - в винде есть цикл выборки сообщений, и эти два цикла сложно было согласовать. Треды (потоки) тогда было что-то заоблачное, поэтому блокирующие сокеты также не были решением. Поэтому Майкрософт сделала асинхронные сокеты. Достаточно было зарегистрировать сокет, и если по нему приходили данные, то система посылала обычное сообщение через цикл обработки сообщений вместе с данными. А его уже было легко обработать.
Это, конечно, смешало мухи с котлетами (точнее gui с сетевой частью), но сильно упростило разработку сетевых приложений. Но более-менее сложную логику оно конечно же усложнило.