История изменений
Исправление Stanson, (текущая версия) :
У тебя физически нет 100% способа узнать приняла ли на самом деле принимающая сторона пакет или нет, если ты не получил ACK. Она может принять пакет, но не отправить ACK, или ACK может потеряться. И твой write будет висеть в ожидании вплоть до истечения всех таймаутов на соединение, если retry не сработали.
Если ты пишешь что-то ниэпически надёжное, то начинать надо с осознания простого факта, что абсолютно любой пакет всегда может быть потерян.
TCP не является ниэпически надёжным. Это протокол, который обеспечивает лишь условный уровень надёжности при котором ты можешь быть уверен что принимающая сторона получила все данные только в том случае если ты получил все подтверждения от неё. Если не получил - то х.з. Может получила, а может и нет. TCP пригоден только для каналов с низким уровнем потерь и при отсутствии зловредного намерения на принимающей стороне.
Если тебе нужно что-то большее, то не используй TCP. Используй, например, UDP и наверни сверху свою надёжность. Или свой протокол замути, благо в неиспользуемых ID протокола в IP недостатка нет, /etc/protocols говорит что
# 134-254 # Unassigned
Исходная версия Stanson, :
У тебя физически нет 100% способа узнать приняла ли на самом деле принимающая сторона пакет или нет, если ты не получил ACK. Она может принять пакет, но не отправить ACK, или ACK может потеряться. И твой write будет висеть в ожидании вплоть до истечения всех таймаутов на соединение.
Если ты пишешь что-то ниэпически надёжное, то начинать надо с осознания простого факта, что абсолютно любой пакет всегда может быть потерян.
TCP не является ниэпически надёжным. Это протокол, который обеспечивает лишь условный уровень надёжности при котором ты можешь быть уверен что принимающая сторона получила все данные только в том случае если ты получил все подтверждения от неё. Если не получил - то х.з. Может получила, а может и нет. TCP пригоден только для каналов с низким уровнем потерь и при отсутствии зловредного намерения на принимающей стороне.
Если тебе нужно что-то большее, то не используй TCP. Используй, например, UDP и наверни сверху свою надёжность. Или свой протокол замути, благо в неиспользуемых ID протокола в IP недостатка нет, /etc/protocols говорит что
# 134-254 # Unassigned