съобщения Документация телеграма на услуги за съобщения

обратна разписка

Сървърът, обикновено потвърждава получаването на съобщението от страна на клиента (обикновено - RPC заявка) чрез RPC-отговор. Ако отговорът не е дълъг, сървърът може първо да изпрати потвърждение за получаване, а след известно време - той, отговорът RPC.







Клиентът обикновено потвърждава получаването на съобщението от сървъра (обикновено - RPC-отговор), прибавяне на потвърждение за следващия RPC-искане и ако бъде изпратено твърде късно (например, ако това се случи в рамките на 60-120 секунди, след получаване на съобщение от сървъра). Въпреки това, ако дълго време няма причина за изпращане на съобщения до сървъра, или ако непризнати съобщения от сървъра, той се превръща в много (да речем, по-голяма от 16), клиентът изпраща потвърждение по себе си.

Известие за игнорирате съобщението за грешка

В някои случаи, сървърът може да информира клиента, че ги е изпратил съобщение е било пренебрегнато по една или друга причина. Имайте предвид, че такова уведомление може да се генерира, ако съобщението не е било правилно разшифрован от сървъра.

Тук може да се ERROR_CODE, включително следните стойности:

  • 16 - твърде малък msg_id (най-вероятно на клиента в грешното време, че има смисъл да го синхронизирате с помощта уведомления MSG_ID и повторно изпращане на първоначалното съобщение с "правилната» msg_id, или го увийте в контейнер с нов MSG_ID, ако оригиналното съобщение е твърде дълго чакане за изпращане клиент)
  • 17 - твърде голям msg_id (в предишния случай: необходимо е да се синхронизира времето на клиента и го изпрати отново с десния msg_id)
  • 18 - долните два бита на неправилно msg_id (сървър очаква разделена на 4 MSG_ID клиентските мнения)
  • 19 - msg_id контейнер съвпадна с MSG_ID предварително получено съобщение (това никога не трябва да бъде)
  • 20 - съобщението е твърде стар, и не е възможно да се провери дали сървърът получи съобщение с msg_id или не
  • 32 - твърде малък msg_seqno (сървър за съобщения вече е направена с по-малко msg_id но с seqno, или с една и съща странно.)
  • 33 - твърде голям msg_seqno (. Сходна: има съобщение с голям msg_id, но с по-малко seqno, или с една и съща нечетните)
  • 34 - очаква дори msg_seqno (незначителен съобщение), получи странно
  • 35 - очакваме странно msg_seqno (значителен съобщение), получи още
  • 48 - погрешно сол сървър (в този случай, се изпраща към правилния отговор bad_server_salt сол трябва да изпрати съобщението до него)
  • 64 - грешен контейнера.

Както е замислена, стойностите са групирани по ERROR_CODE (ERROR_CODE >> 4): например, 0x40..0x4f кодове съответстват на грешката в контейнера за анализ.







Уведомления за игнорирате съобщението не трябва да бъдат потвърдени (т.е. не са значителни).

Важно: Ако сървъра е променил server_salt. или ако клиентът в грешното време, всяка заявка се получи нотификация за по-горе. Клиентът трябва да се провери дали наистина наскоро изпрати съобщение до посочения MSG_ID, и ако е така - да се актуализират по време на изменението (разликата между сървър и клиент часовник) и сървър сол, въз основа на уведомлението за MSG_ID и server_salt да се използва за (пре) изпращане на бъдещи съобщения. В този случай, оригиналното съобщение (т.е., на който се завърна уведомление за грешка), също трябва да се изпрати отново с по-адекватен msg_id и / или server_salt.

В допълнение, клиентът може да актуализира server_salt на стойност. , като при изпращане на съобщения на сървъра, на базата на стойностите в RPC-отговори или контейнери, съдържащи RPC-отговор, с уговорката, че това RPC-отговор наистина съвпада неотдавна изпрати запитване. (В случай на съмнение, че е по-добре да не се актуализира, тъй като съществува риск от повторение-атака.)

Заявка за информация относно съобщението за състоянието

Ако една от страните за дълъг период от време не получава информация за състоянието на изпратените съобщения до нея, тя изрично да го поиска от другата страна:

Отговор на това искане съдържа следната информация:

Мнение информация за състоянието съобщение

Тук req_msg_id - искане ID msgs_state_req. инфо - низ, който за всеки от списъка на изпратеното съобщение msg_ids съдържа точно един байт със съобщения за състоянието:

  • 1 = Съобщението не е известна (msg_id е твърде малък, от другата страна може да го забравя)
  • 2 = съобщение не е получена (msg_id в границите на съхраняваните идентификатори, но от другата страна на такова съобщение не се получи точно)
  • е получен 3 = съобщение (msg_id е твърде голям, противоположната страна тя все още не е точно)
  • е получено съобщение 4 = (имайте предвид, че този отговор е потвърждение за получаване в същото време)
  • +8 = по Съобщението бе изпратено потвърждение
  • +16 = на съобщението не изисква потвърждение
  • += 32 вече е завършен или искане RPC обработка, съдържаща се в съобщение
  • +64 = за смислен отговор е генерирани
  • +128 = другата страна знае, че съобщението е получено

Този отговор не изисква потвърждение. Сама по себе си, това е свидетелство за съответния msgs_state_req.

Доброволно отчитане на съобщения за състояние

Всяка от страните може доброволно да уведоми другата страна на съобщенията за състоянието, изпратени от другата страна.

Изброява всички съобщения кодове известни тази страна, с изключение на тези, за които е настроен на знамето на 128 или 16. Въпреки това, ако флага 32, но не и 64, със статут на съобщението все още ще бъде изпратена.

Това съобщение не е необходимо да бъде потвърдена.

Разширена доброволна информация за условията на едно съобщение

Обикновено се използва от сървъра, за да се отговори на обратно придобиване msg_id мнения. особено ако това съобщение се генерира отговор, и този отговор голям. Ако отговорът е малък, сървърът може вместо това да се повтаря себе си отговор.

Вторият вариант се използва за уведомяване за съобщения, които са били създадени на сървъра, в резултат на RPC-искане (например, уведомления за нови съобщения) се изпращат на клиента преди известно време, но те не са получили потвърждение.

Това съобщение не е необходимо да бъде потвърдена.

Изрично искане за препредаване на съобщения

В отговор на отсрещната страна незабавно препраща исканите съобщения, обикновено една и съща мрежа, на която дойде на искането. Ако съобщението с исканата msg_id липсва или са забравени, или ако то е изпратено на молещата страна (което е разбираемо паритет) за такъв отговор се изпраща msg_id MsgsStateInfo.