|
|
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
OS Linux 2.6.19. Имеется установленный TCP-коннект, доступный по дескриптору сокета ( socket, connect... ). Я делаю на этот дескриптор write 64-х байт. Write возвращает 64, а адресат говорит, что получил 64 байта. Всё хорошо. Делаю коннект вновь, засыпаю. В это время умирает физический уроевень. Просыпаюсь, делаю Write 64-х байт. Write возвращает 64, адресат ничего не получает. Локальный TCP-стек делает попытки отправить кусок снова и снова, ожидая ACK. А его всё нет и нет. 1. Задача - узнать о том, на какое количество данных на момент узнавания не получено подтверждения или как при каком-либо разрыве коннекта узнать, что успел получить адресат? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 17:34 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
http://www.citforum.ru/internet/tifamily/tcpspec.shtml#3.2 Главы 3.2, 3.3, 3.4 (здесь есть процедура подтверждения) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 18:14 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
pavelkolodin wrote: > 1. Задача - узнать о том, на какое количество данных на момент узнавания > не получено подтверждения или как при каком-либо разрыве коннекта > узнать, что успел получить адресат? Проблема в том, что в этом нет особого смысла. TCP вполне может и не подтверждать прием, если нет данных для передачи обратно. А при наличии раутеров то, что знает локальная машина вообще никак не связано с тем, что получила принимающая. Поэтому, единственный надежный способ - это самому высылать подтверждения. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 19:09 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
terasTCP вполне может и не подтверждать прием, если нет данных для передачи обратно.Ссылочку на стандарт, где такое написано, можете дать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 19:55 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
miksoft terasTCP вполне может и не подтверждать прием, если нет данных для передачи обратно.Ссылочку на стандарт, где такое написано, можете дать? Думаю, имелось ввиду rfc793An acknowledgment by TCP does not guarantee that the data has been delivered to the end user, but only that the receiving TCP has taken the responsibility to do so. из главы 2.6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 20:18 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
sqllex miksoft terasTCP вполне может и не подтверждать прием, если нет данных для передачи обратно.Ссылочку на стандарт, где такое написано, можете дать? Думаю, имелось ввиду rfc793An acknowledgment by TCP does not guarantee that the data has been delivered to the end user, but only that the receiving TCP has taken the responsibility to do so. из главы 2.6.хм, как оно могло "иметься ввиду", если оно прямо противоречит? "может и не подтверждать" vs "responsibility to do so" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 20:30 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
А вы первую часть предложения прочитайте. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 22:34 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
miksoft wrote: >> TCP вполне может и не подтверждать прием, если нет данных для передачи >> обратно. > > Ссылочку на стандарт, где такое написано, можете дать? Пожалуй не столько на стандарт, сколько могу объяснить, что имелось в виду. Сам по себе TCP/IP не требует (не ожидает) обязательного подтверждения после передачи каждого пакета данных, и фактически может передавать достаточно большой кусок данных (в пределах окна) без всяких подтверждений. Это и используется в некоторых стеках, особенно, рассчитанных на работу с полудуплексными линиями связи без детектора коллизий. Они оттягивают момент передачи выходного пакета до тех пор, пока на входе не наступит затишье, либо пока не появятся данные для передачи, либо пока не закончится окно на приемной стороне (это остановит передающую сторону). Фактически это не нарушает стандарта - предполагается, что в противном случае просто бы возникла коллизия на линии и пакет был бы потерян. Кстати, играми с ACK занимаются многие стеки. Например, в Linux тоже есть что-то на эту тему. Вообще, в стандарте написано так: "When the receiver accepts a segment it advances RCV.NXT and sends an acknowledgment. When the data sender receives an acknowledgment it advances SND.UNA". Я специально привел два предложения чтобы показать разницу: data sender должен производить обработку по приходу данных (receives), а вот data receiver может отложить эту обработку на какое-то время (accepts). Хотя, возможно, так сделано из филологических соображений, но вряд-ли. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 23:10 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
miksoft wrote: > > хм, как оно могло "иметься ввиду", если оно прямо противоречит? > "может и не подтверждать" vs "responsibility to do so" ? Здесь нет противоречия - эта ответственность (responsibility to do so) как раз возникает в результате передачи ACK (an acknowledgment). То есть - не подтвердил, нет и ответственности. Насколько я понимаю, единственное, на что может повлиять задержка подтверждения (в разумных пределах, конечно) - так это на оценку состояния линии передающей стороной. Но в этом случае подтверждение происходит укрупненными блоками, так, что при некоторой инертности передающей стороны это не должно сказываться. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 23:26 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
Это делается на уровне протокола приложения. Я имею ввиду на уровне того протокола, который реализуется уже поверх TCP. Посылка данных от одной стороны обычно подразумевает посылку данных другой стороной в ответ, какого содержания - зависит от протокола, вот это и есть подтверждение. Плюс приложение обычно само отслеживает таймауты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2007, 23:50 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
pavelkolodin1. Задача - узнать о том, на какое количество данных на момент узнавания не получено подтверждения или как при каком-либо разрыве коннекта узнать, что успел получить адресат? ИМХО постановка перепрыгивает через концепцию TCP протокола. Я-бы предложил открыть отдельное содинение по UDP и передавать контрольную информацию через него. Или вообще отказатся от TCP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2007, 21:31 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
Как я себе представляю предназначение TCP. Люди хотят передавать очень длинные последовательности байт. И важно не то, сколько байт дошло, а какой за каким следует. Но internet может гарантировать сохранение последовательности только внутри одного IP-пакета. А много IP-пакетов он вправе передать хаотически. Чтобы в таких условиях передать очень длинный поток байт, не умещающийся в один пакет, этот поток бьют на тысячи IP-пакетов, нумеруют их и беспорядочно выметают в internet. Потом они хаотически приходят получателю. На приёмную сторону IP-пакеты падают беспорядочно, как дождь. Но там сидит уный TCP, который все пойманные в кучу пакеты составляет друг за другом по их номерам, предлагая приложениям, его использующим, цельный поток. И если TCP поймал пакеты 0...49, 51...100, то вам он сразу отдаст поток из первых пятидесяти пакетов, потом дождётся пакета номер 50, вклеит его между 49 и 51 и отдаст вам вторую половину потока. Передающий TCP принимает от программы поток байт, бьёт его на куски, каждый кусок нумерует строго по порядку, кладёт куски в лопату и в internet высыпает сразу всю лопату. Но нумерация двухбайтная, поэтому если кусков больше 65536, номера начинают повторяться. И вот тут TCP опасается, что два куска, высыпанные в Сеть с одним номером могут запутать моск приёмному TCP, поэтому надо как-то договариваться. Для этого сделали такую штуку: приёмный TCP , приняв кусок с некоторым номером, сообщает передающему, что этот номер можно использовать снова. Это и есть ACK. Постепенно у передающего TCP снова образуется множество последовательных свободных номеров и ими он нумерует очередную последовательность пакетов, кладёт в лопату и снова высыпает в сеть. Вот такого предназначение ACK, как я понимаю. Тогда хотелось бы попинать авторов статей, которые написали "TCP гарантирует доставку". Каждый это трактует по-своему. Найдётся даже человек, который поймёт это так: - Если подтверждения нет, посылка повторяется. - Если снова подтверждение нет, посылка повторяется ещё. - Так три раза. - Если подтверждения нет, происходит вызов начальника технической службы системы, в которой происходит передача и происходит предьявление ему претензий (ПЕП). - Если подтверждения нет, вызывается группа слежебных роботов "сходить проверить, чё там на приёмной стороне". - Если подтверждения нет, происходит вызов министра связи страны и происходит ПЕП. И т.п. TCP не гарантирует доставку, он гарантирует неприкосновенность порядка байт в потоке. Я хотел выяснить, равно ли нулю кол-во неподтверждённых кусков. Чтобы гарантировать себе, что удалёное приложение меня выслушало. Но я забыл, что выслушивает меня не удалённое приложение, а удалённый TCP-стек. А приложение, которое приняло коннект, может давно уже лежать в коме, не успев закрыть коннект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 13:00 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
Всё не правильно. Sequence Number и Acknowledgment Number - 32 бита. И нумеруют они не пакеты, а байты в потоке. У каждого байта свой номер. Потому что маршрутизатор между отправителем и получателем может порезать большие пакеты на пакеты меньшего размера. И повторные отсылки пакета если подтверждение не получено есть. rfc793The TCP must recover from data that is damaged, lost, duplicated, or delivered out of order by the internet communication system. This is achieved by assigning a sequence number to each octet transmitted, and requiring a positive acknowledgment (ACK) from the receiving TCP. If the ACK is not received within a timeout interval, the data is retransmitted. At the receiver, the sequence numbers are used to correctly order segments that may be received out of order and to eliminate duplicates. Damage is handled by adding a checksum to each segment transmitted, checking it at the receiver, and discarding damaged segments. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 15:07 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
BarloneВсё не правильно. Sequence Number и Acknowledgment Number - 32 бита. И нумеруют они не пакеты, а байты в потоке. У каждого байта свой номер. Потому что маршрутизатор между отправителем и получателем может порезать большие пакеты на пакеты меньшего размера. И повторные отсылки пакета если подтверждение не получено есть. rfc793The TCP must recover from data that is damaged, lost, duplicated, or delivered out of order by the internet communication system. This is achieved by assigning a sequence number to each octet transmitted, and requiring a positive acknowledgment (ACK) from the receiving TCP. If the ACK is not received within a timeout interval, the data is retransmitted. At the receiver, the sequence numbers are used to correctly order segments that may be received out of order and to eliminate duplicates. Damage is handled by adding a checksum to each segment transmitted, checking it at the receiver, and discarding damaged segments. Ну абстрактно я всё правильно сказал. Нумерация байт или нумерация пакетов - уже избыточное уточнение технологии, без которого сохраняется смысл моих распинаний о том, что такое гарантия доставки. Ладно, смайлик -> :) :) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2007, 16:07 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
BarloneИ нумеруют они не пакеты, а байты в потоке. У каждого байта свой номер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2007, 15:21 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
=Barlone И нумеруют они не пакеты, а байты в потоке. У каждого байта свой номер. т.е. на один байт информации посылается 2 байта номера? это действительно так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2007, 23:21 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
похоже, утверждается, что 4 байта Sequence Number и Acknowledgment Number - 32 бита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 00:46 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
egorych =Barlone И нумеруют они не пакеты, а байты в потоке. У каждого байта свой номер. т.е. на один байт информации посылается 2 байта номера? это действительно так? Кто сказал, что на КАЖДЫЙ байт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 01:02 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
= pavelkolodin...Но нумерация двухбайтная... + = Barlone...И нумеруют они не пакеты, а байты в потоке.У каждого байта свой номер... или я втупляю? запутался... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 01:10 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
ну, ктото втупляет. Изопропил egorych =Barlone И нумеруют они не пакеты, а байты в потоке. У каждого байта свой номер. т.е. на один байт информации посылается 2 байта номера? это действительно так? Кто сказал, что на КАЖДЫЙ байт? ну, Barlone сказал, из этого перевел авторThis is achieved by assigning a sequence number to each octet transmitted, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 01:25 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
наверно. )))))))))))))))))))))))))) потому, что я тоже втупляю. )))))))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 01:26 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
egorych wrote: > >> И нумеруют они не пакеты, а байты в потоке. У каждого байта свой номер. > > т.е. на один байт информации посылается 2 байта номера? это > действительно так? В заголовке пакета передается 4-х байтовый номер первого байта пакета в передаваемом потоке (Sequence Number) и так-же в принимаемом (Acknowledgment Number). Что ограничивает время нахождения пакетов в сети (переполнением счетчика), и позволяет дополнительно разбивать пакеты при маршрутизации. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 01:27 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
Ответ: unsigned int x; ioctl ( descriptor, SIOCINQ, &x ); Но есть неясности. http://dramele.livejournal.com ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 19:05 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
pavelkolodin wrote: > > ioctl ( descriptor, SIOCINQ, &x ); > Тогда уж SIOCOUTQ. SIOCINQ (aka FIONREAD) = количество байт в буфере приема. SIOCOUTQ возвращает количество неподтвержденных байт в буфере передачи. Насчет переносимости - ищите сами, под виндой такого нет. Может поделитесь, зачем вам это нужно? Кто знает - может быть другое решение найдется? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2007, 20:32 |
|
||
|
Как узнать, сколько отправляемых данных TCP-потока ещё не подтверждено получателем?
|
|||
|---|---|---|---|
|
#18+
Да, SIOCOUTQ. Задача отпала. Хотел написать класс tcp-коннектилки-отправлялки. Умеет коннеткиться, брать данные и заботиться о доставке. Для загрузки в него данных у него есть метод. Данные попадают в буффер конечной длины. Данные вытряхиваются из буффера по получении подтверждения о том, что их увидел удалённый TCP. Если коннект обрывается, делается попытка его восстановления и таки посылки содержимого буффера. И т.п. Теперь решил поменять тех. задание. В новом ТЗ допустима потеря данных на уровне TCP без постановки в известность об этом приложения. Теперь буффер в классе не нужен, а в метод сжирания данных выглядит так: return write ( this -> connection_descriptor, data, size ); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2007, 17:47 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=34966494&tid=1345672]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 285ms |
| total: | 523ms |

| 0 / 0 |
