В настоящее время я изучаю TCP, особенно аспект окна приема. Я читал об этом из нескольких источников, и я хочу кое-что понять.
Из того, что я узнал, приемник объявляет «окно приема», которое представляет собой — и здесь я запутался — количество байтов, которое отправителю разрешено отправлять без подтверждения, или, другими словами, данные в полете.
Теперь, если я попытаюсь об этом подумать, наша главная цель в управлении потоком — убедиться, что отправитель не отправит больше, чем может обработать получатель, т. е. мы хотим предотвратить ситуацию, в которой отправитель отправляет данные, которые получатель придется выбросить, так как негде хранить!
Следуя этой логике, я пришел к выводу, что окно приема должно соответствовать размеру буфера приема (не знаю, точно ли оно такое же, но размер окна в любом случае должен быть производным от буфера приема), и
причина, по которой мы ограничиваем данные в полете отправлено отправителем, заключается в том, что если отправитель отправит больше, чем размер окна (что, опять же, является производным от буфера приема), и получатель не подтвердил некоторые данные (обновление размера окна), есть май быть ситуацией, в которой принимающая сторона не будет успевать, т. е. она будет получать данные быстрее, чем потребляющее их приложение может их обработать, что приведет к отбрасыванию сегментов (надеюсь, это понятно).
Но, читая эта почта, @DavidShwartz говорит, что цель данных в полете НЕ состоит в том, чтобы избежать переполнения буфера, а в том, чтобы справиться с задержкой, вносимой каналом связи. Что я не совсем понимаю.
Проблема в том, что каждый источник, говорящий на эту тему, не объясняет связь между общей целью управления потоком и тем, что с ним связано. данные в полете.
Может ли кто-нибудь объяснить это более подробно?