Это нормальное и ожидаемое поведение.
когда мы знаем, что удаленная сторона не сможет получить эти данные
Ну, может быть, вы знаете, потому что вы тот, кто выдернул кабель, и вы не собираетесь снова подключать его, но компьютер (или, в частности, TCP-стек) этого не делает. т знаю.
Первая причина, по которой он не знает, что данные не поступят, заключается в том, что к моменту завершения вызова send()
данные еще не поступили в сеть: они были только поставлены в очередь в буфере.
Вторая причина, по которой он не знает, что данные не будут переданы, заключается в том, что он не может (по крайней мере, поначалу) определить разницу между каналом, который просто сбросил пакет, и пакетом, который может пройти, когда он пытается передать его. ретранслировать его, а не по кабелю, который был хорошо и по-настоящему обрезан. Даже при обрыве кабеля TCP некоторое время будет продолжать повторную передачу, надеясь, что либо (1) соединение вернется, либо (2) маршрутизаторы сойдутся на другом сетевом пути, который работает.
Даже если бы вы могли мгновенно узнать, когда ссылка не работает (хотя в некоторых очень специфических случаях вы не можете этого сделать, вы должны ждать тайм-аута, чтобы понять это), вы бы не хотели, чтобы TCP мгновенно разрывал соединения. каждый раз, когда это происходило: было бы слишком хрупко, если бы TCP-соединения разрывались каждый раз, когда пакет терялся в сети.
person
Celada
schedule
26.06.2013