ааа! всё не так!
Делаем раз в одном терминале:
$ nc -kl 1234
Делаем два в другом терминале:
$ nc -v localhost 1234
шлём чо нить
Делаем три в третьем терминале:
$ sudo sysctl net.ipv4.tcp_retries2=3
$ sudo iptables -A INPUT -s 127.0.0.1 -p tcp --source-port 1234 -j DROP
$ watch "netstat -nutap | grep 1234"
Возвращаемся во второй терминал и шлём ещё чего-нить. Смотрим на третий терминал и видим приращение в Send-Q.
Для убедительности стрейсим неткат во втором терминале:
...
read(0, "6\n", 2048) = 2
write(3, "6\n", 2) = 2
poll([{fd=3, events=POLLIN}, {fd=0, events=POLLIN}], 2, -17
...
и понимаем, что ядро позволяет нам слать в сокет, который на самом деле сломан и данные никогда не уйдут
таким образом ядро говорит приложению, что 2 байта записано в сеть. приложение может избавиться от этих двух байт и пиши пропало. их больше никто никогда не увидит. есть ли механизм контроля доставки не выползая на уровень приложения ?