์ต๊ทผ Telegram์ด ์ผ๋ง๋ ์ข์์ง, Durov ํ์ ๊ฐ ๋คํธ์ํฌ ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ผ๋ง๋ ํ๋ฅญํ๊ณ ๊ฒฝํ์ด ์๋์ง ๋ฑ์ ๋ํ ๊ฒ์๋ฌผ์ด Habrรฉ์ ๋ ์์ฃผ ๋ํ๋๊ธฐ ์์ํ์ต๋๋ค. ๋์์ ๊ธฐ์ ์ฅ์น์ ์ค์ ๋ก ๋ชฐ๋ํ ์ฌ๋์ ๊ฑฐ์ ์์์ต๋๋ค. ๊ธฐ๊ปํด์ผ ์๋นํ ๊ฐ๋จํ(๊ทธ๋ฆฌ๊ณ MTProto์ ๋งค์ฐ ๋ค๋ฅธ) JSON ๊ธฐ๋ฐ ๋ด API๋ฅผ ์ฌ์ฉํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ฅ ์๋ฝํฉ๋๋ค. ๋ฏฟ์์ผ๋ก ๋ฉ์ ์ ๋ฅผ ์ค์ฌ์ผ๋ก ๋์๊ฐ๋ ๋ชจ๋ ์นญ์ฐฌ๊ณผ PR. ๊ฑฐ์ XNUMX๋ ๋ฐ ์ ์ NPO Echelon Vasily์ ๋๋ฃ(๋ถํํ๋ Habrรฉ์ ๋ํ ๊ทธ์ ๊ณ์ ์ ์ด์๊ณผ ํจ๊ป ์ญ์ ๋จ)๊ฐ ์ฒ์๋ถํฐ Perl๋ก ์์ ์ Telegram ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๊ธฐ ์์ํ๊ณ ๋์ค์ ์ด ๋ผ์ธ์ ์์ฑ์๊ฐ ํฉ๋ฅํ์ต๋๋ค. ์ Perl์ ๋๊น? ์ผ๋ถ๋ ์ฆ์ ๋ฌป์ต๋๋ค. ์ด๋ฏธ ๋ค๋ฅธ ์ธ์ด๋ก ๊ทธ๋ฌํ ํ๋ก์ ํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ค ์ด๊ฒ์ด ์์ ์ด ์๋๋ผ ๋ค๋ฅธ ์ธ์ด๊ฐ ์์ ์ ์์ต๋๋ค. ์์ฑ๋ ๋์๊ด, ๋ฐ๋ผ์ ์ ์๋ ๋๊น์ง ๊ฐ์ผํฉ๋๋ค ์ฒ์๋ถํฐ. ๋ํ ์ํธํ๋ ์ ๋ขฐํ์ง๋ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. ๋ณด์์ ์ค์ ์ ๋ ์ ํ์ ์ฌ์ฉํ๋ฉด ๊ณต๊ธ์ ์ฒด์ ๊ธฐ์ฑํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๊ณ ๋งน๋ชฉ์ ์ผ๋ก ๋ฏฟ์ ์๋ ์์ต๋๋ค(๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์์ ๋ ์์ธํ ๋ค๋ฃฐ ์ฃผ์ ์ ๋๋ค). ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ "์ค๊ฐ" ์์ค์์ ๋งค์ฐ ์ ์๋ํฉ๋๋ค(๋ชจ๋ API ์์ฒญ์ ํ ์ ์์).
๊ทธ๋ฌ๋ ์ด ๊ฒ์๋ฌผ ์๋ฆฌ์ฆ์๋ ์ํธํ์ ์ํ์ด ๋ง์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋ง์ ๊ธฐ์ ์ ์ธ๋ถ ์ฌํญ๊ณผ ๊ฑด์ถํ์ ๋ชฉ๋ฐ์ด ์์ ๊ฒ์ ๋๋ค(์ฒ์๋ถํฐ ์์ฑํ์ง๋ ์์ง๋ง ์ด๋ค ์ธ์ด๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ๋๋ค์๊ฒ๋ ์ ์ฉํ ๊ฒ์ ๋๋ค). ๋ฐ๋ผ์ ์ฃผ์ ๋ชฉํ๋ ์ฒ์๋ถํฐ ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด. ์ฆ, ๊ณต์ ํด๋ผ์ด์ธํธ์ ์์ค ์ฝ๋๊ฐ ๋ซํ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ผ์ด ๊ทธ๋์) ๊ทธ๋ฌ๋ ์๋ฅผ ๋ค์ด ์์ ๊ณผ ๊ฐ์ด RFC์ ๊ฐ์ ํ์ค์ด ์์ต๋๋ค. ๊ณต์ (Telegram Desktop, ๋ชจ๋ฐ์ผ ), ์ฌ์ง์ด ๋น๊ณต์ Telethon?
๋ชฉ์ฐจ :
๋ฌธ์ ... ๊ฑฐ๊ธฐ์ ์์ต๋๊น? ์ฌ์ค์ธ๊ฐ์?.. ์ ์ ์๊ฐ๋ก์ ์ด๋์์ ์์ํฉ๋๊น? ์ด์ง ์ง๋ ฌํ: TL(์ ํ ์ธ์ด) ๋ฐ ๊ทธ ์ฒด๊ณ, ๊ณ์ธต ๋ฐ ๊ธฐํ ๋ง์ ๋ฌด์์ด ๋จ์ด MTํ๋กํ API? ๊ณ์!
๋ฌธ์ ... ๊ฑฐ๊ธฐ์ ์์ต๋๊น? ์ฌ์ค์ธ๊ฐ์?..
์ด ๊ธฐ์ฌ์ ๋ํ ๋ฉ๋ชจ์ ์ผ๋ถ๋ ์ง๋ ์ฌ๋ฆ์ ์์ง๋๊ธฐ ์์ํ์ต๋๋ค. ๊ทธ๋์ ๊ณต์ ์ฌ์ดํธ์์
์ ์ ์๊ฐ๋ก์ ์ด๋์์ ์์ํฉ๋๊น?
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ฑํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฒ์๋ถํฐ ์์ฑํ๊ฑฐ๋ ์ฌ์ฉํ๋ ๊ฒ์ ์ค์ํ์ง ์์ต๋๋ค. api_id
ะธ api_hash
(VKontakte API๋ก ์์
ํ ์ฌ๋๋ค์ ์ฆ์ ์ดํดํฉ๋๋ค) ์๋ฒ๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋ณํฉ๋๋ค. ์ด๊ฒ ~ํด์ผ ํด. ๋ฒ์ ์ธ ์ด์ ๋ก ์ธํด ๋์๊ด ์ ์๊ฐ ์ถํํ ์ ์๋ ์ด์ ์ ๋ํด์๋ ๋ ๋ฒ์งธ ๋ถ๋ถ์์ ๋ ์์ธํ ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ๋งค์ฐ ์ ํ์ ์ด์ง๋ง ํ
์คํธ ๊ฐ์ ๋ง์กฑํ ์ ์์ต๋๋ค. ์ฌ์ค ์ด์ ๋ฒํธ๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค. ์ค์ง ํ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด๋ฏ๋ก ์๋๋ฅด์ง ๋ง์ญ์์ค.
์ด์ ๊ธฐ์ ์ ์ธ ๊ด์ ์์ ์ฐ๋ฆฌ๋ ๋ฑ๋ก ํ ๋ฌธ์, ํ๋กํ ์ฝ ๋ฑ์ ๋ํ ์ ๋ฐ์ดํธ์ ๋ํ Telegram์ ์๋ฆผ์ ๋ฐ์์ผ ํ๋ค๋ ์ฌ์ค์ ๊ด์ฌ์ ๊ฐ์ ธ์ผ ํ์ต๋๋ค. ์ฆ, ๋ํฌ๊ฐ์๋ ์ฌ์ดํธ๋ ๋จ์ํ "์ ์"๊ฐ ์ง์ ๋์๊ณ ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋ค๊ธฐ ์์ํ ์ฌ๋๋ค๊ณผ ํน๋ณํ ๊ณ์ ์์ ํ๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋์, ๊ทธ๋ฐ ๊ฒ์ ๊ด์ฐฐ๋์ง ์์๊ณ ์ ๋ณด๋ ์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฒ์๋ถํฐ ์์ฑํ๋ ๊ฒฝ์ฐ ์์ ๋ ๋งค๊ฐ๋ณ์์ ์ฌ์ฉ์ ์ค์ ๋ก ์์ง ๋ฉ์์ต๋๋ค. ํ์ง๋ง
์ค์ ๋ก MTProto ์ด์ ๊ณผ ์ดํ์ ํ ๋ฒ์ ์ฌ๋ฌ ์์ค์์ (OS ์ปค๋์์ ์์ ํ๋ ์ธ๊ตญ ๋คํธ์ํฌ ์ฌ์ฉ์๊ฐ ๋ ์ด์ด ์๋ฐ์ด๋ผ๊ณ ๋งํจ) ํฌ๊ณ ๊ณ ํต์ค๋ฝ๊ณ ๋์ฐํ ์ฃผ์ ๊ฐ ๋ฐฉํด๊ฐ ๋ ๊ฒ์ ๋๋ค ...
์ด์ง ์ง๋ ฌํ: TL(์ ํ ์ธ์ด) ๋ฐ ๊ทธ ์ฒด๊ณ, ๊ณ์ธต ๋ฐ ๊ธฐํ ๋ง์ ๋ฌด์์ด ๋จ์ด
์ฌ์ค ์ด ์ฃผ์ ๊ฐ ํ ๋ ๊ทธ๋จ ๋ฌธ์ ์ ํต์ฌ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํํค์ณ ๋ณด๋ฉด ๋์ฐํ ๋จ์ด๊ฐ ๋ง์ด์์ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ๊ณํ. ์ด ๋จ์ด๊ฐ ์๊ฐ๋๋ค๋ฉด ์ด๋ ๊ฒ ๋งํด๋ณด์ธ์.
int ? = Int;
long ? = Long;
double ? = Double;
string ? = String;
vector#1cb5c415 {t:Type} # [ t ] = Vector t;
rpc_error#2144ca19 error_code:int error_message:string = RpcError;
rpc_answer_unknown#5e2ad36e = RpcDropAnswer;
rpc_answer_dropped_running#cd78e586 = RpcDropAnswer;
rpc_answer_dropped#a43ad8b7 msg_id:long seq_no:int bytes:int = RpcDropAnswer;
msg_container#73f1f8dc messages:vector<%Message> = MessageContainer;
---functions---
set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:bytes = Set_client_DH_params_answer;
ping#7abe77ec ping_id:long = Pong;
ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;
invokeAfterMsg#cb9f372d msg_id:long query:!X = X;
invokeAfterMsgs#3dc4b4f0 msg_ids:Vector<long> query:!X = X;
account.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User;
account.sendChangePhoneCode#8e57deb flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool = auth.SentCode;
์ด๊ฒ์ ์ฒ์ ๋ณด๋ ์ฌ๋์ ์ฐ์ฌ์ง ๋ด์ฉ์ ์ผ๋ถ๋ง ์ง๊ด์ ์ผ๋ก ์ธ์ํ ๊ฒ์ ๋๋ค. ์ ํ์ ์ฝ๋ก ์ ํต๊ณผํฉ๋๋ค ... ์๋ง๋. ์ฌ๊ธฐ์ ๊บพ์ ๊ดํธ ์์๋ ์๋ง๋ C++์์์ ๊ฐ์ ํ ํ๋ฆฟ์ด ์์ ๊ฒ์ ๋๋ค(์ฌ์ค, ๋ณ๋ก). ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ชจ๋ ๊ธฐํธ๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ๋ฌผ์ํ, ๋๋ํ, ๋ฐฑ๋ถ์จ, ๊ฒฉ์(๊ทธ๋ฆฌ๊ณ ๋ถ๋ช ํ ๊ทธ๊ฒ๋ค์ ๋ค๋ฅธ ์ฅ์์์ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํฉ๋๋ค), ์ด๋๊ฐ์ ์กด์ฌํ์ง๋ง ์ด๋๊ฐ์๋ ์กด์ฌํ์ง ์๋ XNUMX์ง์ - ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฌ๊ธฐ์ ์ป๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฌ๋ฐ๋ฅธ (์๋ฒ์์ ๊ฑฐ๋ถ๋์ง ์์) ๋ฐ์ดํธ ์คํธ๋ฆผ? ์ค๋ช ์๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. (์, ๊ทผ์ฒ์ JSON ๋ฒ์ ์ ์คํค๋ง์ ๋ํ ๋งํฌ๊ฐ ์์ง๋ง ๋ ๋ช ํํ์ง๋ ์์ต๋๋ค.).
ํ์ด์ง ์ด๊ธฐ
๊ธฐ๋ฅ์ ์ธ์ด์ ์๋ ์ ํ ์ถ๋ก ์ ์ต์ํ ๋ ์๋ ๋ฌผ๋ก ์ด ์ธ์ด ์ค๋ช ์์ ํจ์ฌ ๋ ์น์ํ ์๋ฅผ ๋ณด์๊ณ ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ด ์์น์ ์ผ๋ก ๋์์ง ์๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ์ด์ ๋ํ ๋ฐ๋ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์, ๊ณจ ์ข๊ฒ ๋ค๋ฆฌ์ง๋ง ์์ ๋ฌ์ฑ๋์ง ์์
- ๋ฌ์์ ๋ํ์ ๊ต์ก์ IT ์ ๋ฌธ ๋ถ์ผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ชจ๋ ์ฌ๋์ด ํด๋น ๊ณผ์ ์ ์ฝ๋ ๊ฒ์ ์๋๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๊ฐ ๋ณด๊ฒ ๋ ๊ฒ์ฒ๋ผ ์ค์ ๋ก๋ ํ์ ์์, ์ค๋ช ๋ TL์ ์ ํ๋ ํ์ ์งํฉ๋ง ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์
๋ด๊ฐ ๋งํ๋ฏ์ด #perl
FreeNode IRC ๋คํธ์ํฌ์์ Telegram์์ Matrix๋ก ๊ฒ์ดํธ๋ฅผ ๊ตฌํํ๋ ค๊ณ ์๋ํฉ๋๋ค(๋ฐ์ดํ์ ๋ฒ์ญ์ด ๋ฉ๋ชจ๋ฆฌ์์ ์ ํํ์ง ์์).
์ฒ์์ผ๋ก ์ ํ ์ด๋ก ์ ์ ํ ์ฌ๋์ด ์ ์ด ๋์ ๊ทธ๊ฒ์ ๊ฐ์ง๊ณ ๋๊ธฐ ์์ํ์ง๋ง ์ค์ ๋ก ํ์ํ์ง ์ฌ๋ถ๋ ์ ๊ฒฝ ์ฐ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ ํ(int, long ๋ฑ)์ ํ์์ฑ์ด ์ง๋ฌธ์ ์ ๊ธฐํ์ง ์๋์ง ์ง์ ํ์ธํ์ญ์์ค. ๊ฒฐ๊ตญ์๋ ์๋์ผ๋ก ๊ตฌํํด์ผ ํฉ๋๋ค. ๋ฒกํฐ. ์ฆ, ์ฌ์ค ์ ๋ ฌ, ๊ฒฐ๊ณผ๋ฅผ ์ ์ ํ ์ด๋ฆ์ผ๋ก ๋ถ๋ฅด๋ ๊ฒฝ์ฐ.
ํ์ง๋ง ์ ์
๊ณต์ ๋ฌธ์๋ฅผ ์ฝ์ง ์๋ ์ฌ๋๋ค์ ์ํ TL ๊ตฌ๋ฌธ์ ํ์ ์งํฉ์ ๋ํ ๊ฐ๋ตํ ์ค๋ช
constructor = Type;
myVec ids:Vector<long> = Type;
fixed#abcdef34 id:int = Type2;
fixedVec set:Vector<Type2> = FixedVec;
constructorOne#crc32 field1:int = PolymorType;
constructorTwo#2crc32 field_a:long field_b:Type3 field_c:int = PolymorType;
constructorThree#deadcrc bit_flags_of_what_really_present:# optional_field4:bit_flags_of_what_really_present.1?Type = PolymorType;
an_id#12abcd34 id:int = Type3;
a_null#6789cdef = Type3;
ํญ์ ์ ์ ์์ ๋์์ด๋, ๊ทธ ํ ์ ํ์ ์ผ๋ก (์ค์ ๋ก๋ ํญ์) ๊ธฐํธ๋ฅผ ํตํด #
ํด์ผ CRC32 ์ฃผ์ด์ง ์ ํ์ ์ ๊ทํ๋ ์ค๋ช
๋ฌธ์์ด์์. ๋ค์์ ํ๋์ ๋ํ ์ค๋ช
์
๋๋ค. ํด๋นํ๋ ๊ฒฝ์ฐ ์ ํ์ด ๋น์ด ์์ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ชจ๋ ์ฃผ์ด์ง ์์ฑ์, ์ฆ ํ์ ์ ํ์ด ์ํ ์ ํ์ ์ด๋ฆ ์ธ ๋ฑํธ๋ก ๋๋ฉ๋๋ค. ๋ฑํธ ์ค๋ฅธ์ชฝ์ ์๋ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋คํ์ฑ - ์ฆ, ์ฌ๋ฌ ํน์ ์ ํ์ ํด๋นํ ์ ์์ต๋๋ค.
์ค ๋ค์ ์ ์๊ฐ ๋์ค๋ ๊ฒฝ์ฐ ---functions---
, ๊ทธ๋ฌ๋ฉด ๊ตฌ๋ฌธ์ ๋์ผํ๊ฒ ์ ์ง๋์ง๋ง ์๋ฏธ๋ ๋ฌ๋ผ์ง๋๋ค. ์์ฑ์๋ RPC ํจ์์ ์ด๋ฆ์ด ๋๊ณ ํ๋๋ ๋งค๊ฐ ๋ณ์๊ฐ ๋ฉ๋๋ค(์ฆ, ์๋ ์ค๋ช
๋ ๊ฒ๊ณผ ์ ํํ ๋์ผํ ๊ตฌ์กฐ๋ก ์ ์ง๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ์ฃผ์ด์ง ์๋ฏธ์ผ ๊ฒ์
๋๋ค), "๋คํ์ฑ ์ ํ '์ ๋ฐํ๋ ๊ฒฐ๊ณผ์ ์ ํ์
๋๋ค. ์ฌ์ค, ๊ทธ๊ฒ์ ์ฌ์ ํ โโ๋คํ์ฑ์ผ๋ก ๋จ์์์ ๊ฒ์
๋๋ค - ์น์
์์ ์ ์๋ ๊ฒ์
๋๋ค. ---types---
, ์ด ์์ฑ์๋ ๊ณ ๋ ค๋์ง ์์ต๋๋ค. ์ธ์๋ก ํธ์ถ๋ ํจ์์ ์ ํ ์ค๋ฒ๋ก๋, ์ฆ ์ด๋ค ์ด์ ๋ก C++์์์ ๊ฐ์ด ์ด๋ฆ์ ๊ฐ์ง๋ง ์๋ช
์ด ๋ค๋ฅธ ์ฌ๋ฌ ํจ์๊ฐ TL์์ ์ ๊ณต๋์ง ์์ต๋๋ค.
OOP๊ฐ ์๋๋ฐ ์ "constructor"์ "polymorphic"์ธ๊ฐ? ๊ธ์, ์ฌ์ค ๋๊ตฐ๊ฐ๊ฐ OOP์ ๊ด์ ์์ ์๊ฐํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์
๋๋ค. ์ถ์ ํด๋์ค๋ก์์ ๋คํ์ฑ ์ ํ์ด๋ฉฐ ์์ฑ์๋ ์ง๊ณ ์์ ํด๋์ค์
๋๋ค. final
์ฌ๋ฌ ์ธ์ด์ ์ฉ์ด๋ก. ๋ฌผ๋ก ์ฌ๊ธฐ์๋ ์ฌ์ค ์ ์ฌ์ฑ OO ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ค์ ์ค๋ฒ๋ก๋๋ ์์ฑ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๊ฐ ์์ต๋๋ค(์๋์ ํจ์ ๋ฐ ๋ฉ์๋์ ๋ํ ์ค๋ช
์ ๋จธ๋ฆฌ์ ํผ๋์ ์ผ์ผํฌ ์ ์์ง๋ง ๋ค๋ฅธ ๊ฒ์ ๊ดํ ๊ฒ์
๋๋ค). ์์ฑ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ์ ์์ต๋๋ค. ๊ฐ ๊ฑด์ค ์ค ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ฝ์ ๋ ์
๋ ฅํ์ญ์์ค.
์ด๋ป๊ฒ ์ด๋ฐ ์ผ์ด ๋ฐ์ํฉ๋๊น? ํญ์ 4๋ฐ์ดํธ๋ฅผ ์ฝ๋ ๋์๋ฆฌ์ผ๋ผ์ด์ ๋ ๊ฐ์ ํ์ธํฉ๋๋ค. 0xcrc32
- ๋ค์์ ์ผ์ด๋ ์ผ์ ์ดํดํฉ๋๋ค. field1
์ ํ์ผ๋ก int
, ์ฆ. ์ ํ์ด ์๋ ์ด ์์ ์๋ ํ๋์์ ์ ํํ 4๋ฐ์ดํธ๋ฅผ ์ฝ์ต๋๋ค. PolymorType
์ฝ๋ค. ๋ณธ๋ค 0x2crc32
๋ ๊ฐ์ ํ๋๊ฐ ๋ ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. long
, ๊ทธ๋์ ์ฐ๋ฆฌ๋ 8 ๋ฐ์ดํธ๋ฅผ ์ฝ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ญ์ง๋ ฌํ๋๋ ๋ณตํฉ ํ์์ ๋ค์ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค์ด, Type3
๋ ์์ฑ์๊ฐ ๊ฐ๊ฐ ์ถ๊ฐ๋ก ๋ค์ ์ค ํ๋๋ฅผ ์ถฉ์กฑํด์ผ ํ๋ ์ฆ์ ์คํค๋ง์์ ์ ์ธ๋ ์ ์์ต๋๋ค. 0x12abcd34
, ๊ทธ ํ์ ๋ค๋ฅธ 4๋ฐ์ดํธ๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. int
๋๋ 0x6789cdef
, ๊ทธ ํ์๋ ์๋ฌด๊ฒ๋ ์์ ๊ฒ์
๋๋ค. ๊ทธ ์ธ - ์์ธ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค. ์ด์จ๋ ๊ทธ ํ์ ์ฐ๋ฆฌ๋ 4 ๋ฐ์ดํธ ์ฝ๊ธฐ๋ก ๋์๊ฐ๋๋ค. int
์ฌ๋ฐฑ field_c
ะฒ constructorTwo
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ์ฝ๊ธฐ๋ฅผ ๋ง์นฉ๋๋ค PolymorType
.
๋ง์ง๋ง์ผ๋ก ์กํ๋ฉด 0xdeadcrc
์ constructorThree
, ๊ทธ๋ฌ๋ฉด ์ํฉ์ด ๋ ๋ณต์กํด์ง๋๋ค. ์ฐ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ๋ถ์ผ bit_flags_of_what_really_present
์ ํ์ผ๋ก #
- ์ฌ์ค ์ด๊ฒ์ ์ ํ์ ๋ณ์นญ์ผ ๋ฟ์
๋๋ค. nat
"์์ฐ์"๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ์ค์ ๋ก unsigned int๋ ์ค์ ํ๋ก์์ unsigned ์ซ์๊ฐ ๋ฐ๊ฒฌ๋๋ ์ ์ผํ ๊ฒฝ์ฐ์
๋๋ค. ๋ฐ๋ผ์ ๋ค์์ ๋ฌผ์ํ๊ฐ ์๋ ๊ตฌ์ฑ์
๋๋ค. ์ฆ, ์ด๊ฒ์ด ํ๋์์ ์๋ฏธํฉ๋๋ค. ํด๋น ๋นํธ๊ฐ ์ฐธ์กฐ๋ ํ๋์ ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์์ด์ด์ ํ์๋ฉ๋๋ค(๋๋ต ์ผํญ ์ฐ์ฐ์์ ๊ฐ์). ๋ฐ๋ผ์ ์ด ๋นํธ๊ฐ ์ผ์ ธ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค. Type
, ์ด ์์์๋ 2๊ฐ์ ์์ฑ์๊ฐ ์์ต๋๋ค. ํ๋๋ ๋น์ด ์๊ณ (์๋ณ์๋ก๋ง ๊ตฌ์ฑ๋จ) ๋ค๋ฅธ ํ๋๋ ํ๋๊ฐ ์์ต๋๋ค. ids
์ ํ์ผ๋ก ids:Vector<long>
.
ํ ํ๋ฆฟ๊ณผ ์ ๋ค๋ฆญ์ด ๋ชจ๋ ์ข๊ฑฐ๋ Java๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํ์ง๋ง. ๊ฑฐ์. ์ด๊ฒ ๋จ ํ๋์ ์ค์ ํ๋ก์์ ๊บพ์ ๊ดํธ์ ๊ฒฝ์ฐ์ด๋ฉฐ ๋ฒกํฐ์๋ง ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ์ดํธ ์คํธ๋ฆผ์์ ์ด๋ ๋ฒกํฐ ์ ํ ์์ฒด์ ๋ํด 4 CRC32 ๋ฐ์ดํธ๊ฐ ๋๋ฉฐ ํญ์ ๋์ผํ๋ฉฐ 4๋ฐ์ดํธ๋ ๋ฐฐ์ด ์์์ ์, ๊ทธ ๋ค์์๋ ์ด๋ฌํ ์์ ์์ฒด์ ๋๋ค.
์ฌ๊ธฐ์ ์ง๋ ฌํ๊ฐ ํญ์ 4๋ฐ์ดํธ ๋จ์ด๋ก ๋ฐ์ํ๊ณ ๋ชจ๋ ์ ํ์ด ๊ทธ ๋ฐฐ์๋ผ๋ ์ฌ์ค์ ์ถ๊ฐํ์ญ์์ค. ๋ด์ฅ ์ ํ๋ ์ค๋ช
๋์ด ์์ต๋๋ค. bytes
ะธ string
๊ธธ์ด๋ฅผ ์๋์ผ๋ก ์ง๋ ฌํํ๊ณ ์ด ์ ๋ ฌ์ 4๋ก ์ ๋ ฌํ๋ฉด ์ ์์ ์ด๊ณ ์๋์ ์ผ๋ก ํจ์จ์ ์ผ๋ก ๋ค๋ฆฌ๋ ๊ฒ ๊ฐ์ต๋๊น? TL์ ํจ์จ์ ์ธ ์ด์ง ์ง๋ ฌํ๋ผ๊ณ ์ฃผ์ฅํ์ง๋ง ๋ถ์ธ ๊ฐ๊ณผ ๋จ์ผ ๋ฌธ์ ๋ฌธ์์ด์ ์ต๋ 4๋ฐ์ดํธ๊น์ง ํ์ฅํ๋ฉด JSON์ด ์ฌ์ ํ ํจ์ฌ ๋๊บผ์์ง๊น์? ๋ณด์ธ์, ๋ถํ์ํ ํ๋๋ ๋นํธ ํ๋๊ทธ๋ก ๊ฑด๋๋ธ ์ ์์ต๋๋ค.
ํ์ง๋ง ๋ด ๊ฐ๋ตํ ์ค๋ช ์ด ์๋๋ผ ์ ์ฒด ๋ฌธ์๋ฅผ ์ฝ๊ณ ๊ตฌํ์ ๋ํด ์๊ฐํ๋ค๋ฉด ์๋๋๋ค. ์ฒซ์งธ, ์์ฑ์์ CRC32๋ ์ ๊ทํ๋ ์คํค๋ง ํ ์คํธ ์ค๋ช ๋ฌธ์์ด(์ฌ๋ถ์ ๊ณต๋ฐฑ ์ ๊ฑฐ ๋ฑ)์ ์ํด ๊ณ์ฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ ํ๋๊ฐ ์ถ๊ฐ๋๋ฉด ์ ํ ์ค๋ช ๋ฌธ์์ด์ด ๋ณ๊ฒฝ๋๋ฏ๋ก CRC32 ๋ฐ ์ง๋ ฌํ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ํด๋ผ์ด์ธํธ๋ ์ ํ๋๊ทธ๊ฐ ์ค์ ๋ ํ๋๋ฅผ ๋ฐ์์ง๋ง ๋ค์์ ๋ฌด์์ ํด์ผํ ์ง ๋ชจ๋ฅธ๋ค๋ฉด ์ด๋ป๊ฒ ํ ๊น์? ..
๋์งธ, ๊ธฐ์ตํ์ CRC32์ฌ๊ธฐ์ ๋ณธ์ง์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค. ํด์ ํจ์ ์ด๋ค ์ ํ์ด (๋น)์ง๋ ฌํ๋๊ณ ์๋์ง ๊ณ ์ ํ๊ฒ ๊ฒฐ์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ถฉ๋ ๋ฌธ์ ์ ์ง๋ฉดํด ์์ต๋๋ค. ์๋์, ํ๋ฅ ์ 232๋ถ์ 32์ด ์๋๋ผ ํจ์ฌ ๋ ๋ง์ต๋๋ค. CRC32๊ฐ ํต์ ์ฑ๋์ ์ค๋ฅ๋ฅผ ๊ฐ์ง(๋ฐ ์์ )ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ด๋ฌํ ์์ฑ์ ๊ฐ์ ํ์ฌ ๋ค๋ฅธ ์ฌ๋์๊ฒ ํด๋ฅผ ๋ผ์น๋๋ก ์ค๊ณ๋์๋ค๋ ๊ฒ์ ๋๊ฐ ๊ธฐ์ตํ์ต๋๊น? ์๋ฅผ ๋ค์ด, ๊ทธ๋ ๋ ๋ฐ์ดํธ์ ์์ด์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๋ ์ค์์ CRC4๋ฅผ ๊ณ์ฐํ๋ฉด ๋ ๋ฒ์งธ ์ค์์ ์ฒ์ 4๋ฐ์ดํธ๋ฅผ ๋ค์ XNUMX๋ฐ์ดํธ๋ก ๊ต์ฒดํฉ๋๋ค. ๋์ผํฉ๋๋ค. ์ ๋ ฅ์ผ๋ก ๋ผํด ์ํ๋ฒณ์ ํ ์คํธ ๋ฌธ์์ด(๋ฐ ์ฝ๊ฐ์ ๊ตฌ๋์ )์ด ์๊ณ ์ด๋ฌํ ์ด๋ฆ์ด ํน๋ณํ ์์์ ์ด์ง ์์ ๊ฒฝ์ฐ ์ด๋ฌํ ์์ด์ ๊ฐ๋ฅ์ฑ์ด ํฌ๊ฒ ์ฆ๊ฐํฉ๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๊ฑฐ๊ธฐ์ ๋ฌด์์ด ์๋์ง ๋๊ฐ ํ์ธ ํ์ต๋๊น? ์ ๋ง๋ก CRC32? ์ด๊ธฐ ์์ค ์ค ํ๋(Waltman ์ด์ )์๋ ๊ฐ ๋ฌธ์์ ์ซ์ 239๋ฅผ ๊ณฑํ๋ ํด์ ํจ์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์ด ์ฌ๋๋ค์ด ์ฌ๋ํ๋ ํํ!
๋ง์ง๋ง์ผ๋ก ํ๋ ์ ํ์ด ์๋ ์์ฑ์๊ฐ Vector<int>
ะธ Vector<PolymorType>
๋ค๋ฅธ CRC32๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์จ๋ผ์ธ ํ๋ ์ ํ
์ด์
์ ์ด๋ป์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ด๋ก ์์ผ๋ก๋ ์ ํ์ ์ผ๋ถ๊ฐ ๋ฉ๋๊น?? XNUMX๊ฐ์ ์ซ์ ๋ฐฐ์ด์ ์ ๋ฌํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. Vector<int>
๋ชจ๋ ๊ฒ์ด ๋ช
ํํ๊ณ ๊ธธ์ด์ ๋ ๋ค๋ฅธ 40000๋ฐ์ดํธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์ด๊ฒ์ด Vector<Type2>
, ๋จ ํ๋์ ํ๋๋ก ๊ตฌ์ฑ int
์ ํ์์ ์ ์ผํ ๊ฒ์
๋๋ค. 10000xabcdef0๋ฅผ 34๋ฒ ๋ฐ๋ณตํ ๋ค์ 4๋ฐ์ดํธ๋ฅผ ๋ฐ๋ณตํด์ผ ํฉ๋๊น? int
๋๋ ์ธ์ด๊ฐ ์์ฑ์์์ ์ด๋ฅผ ํ์ํ ์ ์์ต๋๋ค. fixedVec
80000๋ฐ์ดํธ ๋์ 40000๋ฐ์ดํธ๋ง ๋ค์ ์ ์กํ์๊ฒ ์ต๋๊น?
์ด๊ฒ์ ์ ํด ์ด๋ก ์ ์ง๋ฌธ์ด ์๋๋๋ค. ๊ฐ๊ฐ ID, ์ด๋ฆ, ์ฑ์ ๊ฐ์ง ๊ทธ๋ฃน ์ฌ์ฉ์ ๋ชฉ๋ก์ ์ป๋๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ๋ชจ๋ฐ์ผ ์ฐ๊ฒฐ์ ํตํด ์ ์ก๋๋ ๋ฐ์ดํฐ ์์ ์ฐจ์ด๋ ์๋นํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ ๊ด๊ณ ๋๋ ๊ฒ์ Telegram ์ง๋ ฌํ์ ํจ์จ์ฑ์ ๋๋ค.
๊ทธ๋์ ...
์ถ๋ก ํ ์ ์๋ ๋ฒกํฐ
์ฝค๋น๋ค์ดํฐ์ ์ค๋ช
ํ์ด์ง๋ฅผ ํ์ด๋ณด๋ฉด ๋ฒกํฐ(์ฌ์ง์ด ํ๋ ฌ๋)๊ฐ ์ ์์ผ๋ก ํํ์ ํตํด ์ฌ๋ฌ ์ํธ๋ฅผ ์ถ๋ก ํ๋ ค๊ณ ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ๊ทธ๋ค์ ๋๋ค๊ฒจ ๋ง๊ณ ๋ง์ง๋ง ๋จ๊ณ๋ ๊ฑด๋๋ฐ๊ณ ๋ฒกํฐ์ ์ ์๋ ๋จ์ํ ์ฃผ์ด์ง๋๋ค. ์ด ์ญ์ ์ ํ์ ๊ตฌ์๋์ง ์์ต๋๋ค. ๋ฌด์จ ์ผ์ด์ผ? ์ธ์ด๋ก ํ๋ก๊ทธ๋๋ฐ, ํนํ ๊ธฐ๋ฅ์ ์ธ ๊ฒฝ์ฐ ๊ตฌ์กฐ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ค๋ช
ํ๋ ๊ฒ์ด ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค. ๊ฒ์ผ๋ฅธ ํ๊ฐ๋ฅผ ์ฌ์ฉํ๋ ์ปดํ์ผ๋ฌ๋ ๋ชจ๋ ๊ฒ์ ์ดํดํ๊ณ ์ํํฉ๋๋ค. ์ธ์ด๋ก ๋ฐ์ดํฐ ์ง๋ ฌํ ๊ทธ๋ฌ๋ ํจ์จ์ฑ์ด ํ์ํฉ๋๋ค. ๊ฐ๋จํ ์ค๋ช
ํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. ๋ช
๋ถ, ์ฆ. ๋ ์์์ ๊ตฌ์กฐ - ์ฒซ ๋ฒ์งธ๋ ๋ฐ์ดํฐ ์์์ด๊ณ ๋ ๋ฒ์งธ๋ ๋์ผํ ๊ตฌ์กฐ ์์ฒด์ด๊ฑฐ๋ ๊ผฌ๋ฆฌ๋ฅผ ์ํ ๋น ๊ณต๊ฐ์
๋๋ค(ํฉ (cons)
๋ฆฌ์คํ์์). ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ถ๋ช
ํ ์๊ตฌํ ๊ฒ์
๋๋ค ๊ฐ ์์๋ ํด๋น ์ ํ์ ์ค๋ช
ํ๊ธฐ ์ํด ์ถ๊ฐ๋ก 4๋ฐ์ดํธ(TL์ ๊ฒฝ์ฐ CRC32)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฐฐ์ด์ ์ค๋ช
ํ๊ธฐ ์ฝ์ต๋๋ค. ๊ณ ์ ํฌ๊ธฐ, ๊ทธ๋ฌ๋ ์ด์ ์ ๊ธธ์ด๋ฅผ ์ ์ ์๋ ๋ฐฐ์ด์ ๊ฒฝ์ฐ ์ค๋จํฉ๋๋ค.
๋ฐ๋ผ์ TL์ ๋ฒกํฐ ์ถ๋ ฅ์ ํ์ฉํ์ง ์์ผ๋ฏ๋ก ์ธก๋ฉด์ ์ถ๊ฐํด์ผ ํ์ต๋๋ค. ๊ถ๊ทน์ ์ผ๋ก ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
์ง๋ ฌํ๋ ํญ์ ์ ํ t ๋ณ์์ ํน์ ๊ฐ์ ์ข ์๋์ง ์๋ ๋์ผํ ์์ฑ์ "๋ฒกํฐ"(const 0x1cb5c415 = crc32("๋ฒกํฐ t:Type # [ t ] = ๋ฒกํฐ t")๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ํ์ ๋งค๊ฐ๋ณ์ t์ ๊ฐ์ ๊ฒฐ๊ณผ ์ ํ(์ญ์ง๋ ฌํ ์ด์ ์ ํญ์ ์๋ ค์ง)์์ ํ์๋๊ธฐ ๋๋ฌธ์ ์ง๋ ฌํ์ ํฌํจ๋์ง ์์ต๋๋ค.
์์ธํ ์ดํด๋ณด์ธ์. vector {t:Type} # [ t ] = Vector t
- ํ์ง๋ง ์๋ฌด๋ฐ๋ ์ ์ ์์ฒด๋ ์ฒซ ๋ฒ์งธ ์ซ์๊ฐ ๋ฒกํฐ์ ๊ธธ์ด์ ๊ฐ์์ผ ํ๋ค๊ณ ๋งํ์ง ์์ต๋๋ค! ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ด๋์์๋ ๋ฐ๋ฅด์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋น์ ์ด ๋ช
์ฌํ๊ณ ์์ผ๋ก ๊ตฌํํด์ผ ํ ์ฃผ์ด์ง ๊ฒ์
๋๋ค. ๋ค๋ฅธ ๊ณณ์์๋ ๋ฌธ์์ ์ ํ์ด ๊ฐ์ง๋ผ๊ณ ์์งํ๊ฒ ์ธ๊ธ๋์ด ์์ต๋๋ค.
๋ฒกํฐ t ๋คํ์ฑ ์์ฌ ์ ํ์ ๊ฐ์ด ๋ฐ์คํ์ด๋ ๋ฒ ์ดํ์ด๋ ๋ชจ๋ ์ ํ t์ ๊ฐ ์ํ์ค์ธ "์ ํ"์ ๋๋ค.
โฆ ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ง์คํ์ง ์์ต๋๋ค. ๋น์ ์ด ์ํ์ ๋์ด๋จ์ ํค์ณ๋๊ฐ๋ ๋ฐ ์ง์ณค์ ๋(์๋ง๋ ๋ํ ๊ณผ์ ์์ ๋น์ ์๊ฒ ์๋ ค์ก์ ๊ฒ์ ๋๋ค) ์ ์๋ฅผ ๋งค๊ธฐ๊ณ ์ค์ ๋ก ๊ทธ๊ฒ์ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ง์ผ๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์ ๋, ๊ทธ ์ธ์์ ๋น์ ์ ๋จธ๋ฆฌ ์์ ๋จ์ ์์ต๋๋ค. , ๋ถ๋ช ํ Cool People(์ํ์ XNUMX๋ช -ACM ์ฐ์น์), ๊ทธ๋ฆฌ๊ณ ์๋ฌด๋ ์๋๋๋ค. ๊ณผ์ํ๋ ๋ชฉํ๊ฐ ๋ฌ์ฑ๋์์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ซ์์ ๋ํด. ์๊ธฐํ๋ค
#
๋์์ด์ ๋๋คnat
, ์์ฐ์:์ ํ ํํ์์ด ์์ต๋๋ค(typeexpr) ๋ฐ ์ซ์ ํํ์(nat-expr). ๊ทธ๋ฌ๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ์๋ฉ๋๋ค.
type-expr ::= expr nat-expr ::= expr
๊ทธ๋ฌ๋ ๋ฌธ๋ฒ์์๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ค๋ช ๋ฉ๋๋ค. ์ด ์ฐจ์ด์ ์ ๋ค์ ๊ธฐ์ตํ๊ณ ์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค.
์, ํ
ํ๋ฆฟ ์ ํ(vector<int>
, vector<User>
) ๊ณตํต ์๋ณ์(#1cb5c415
), ์ฆ. ํธ์ถ์ด ๋ค์๊ณผ ๊ฐ์ด ์ ์ธ๋ ๊ฒฝ์ฐ
users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;
๊ทธ๋ฌ๋ฉด ๋จ์ํ ๋ฒกํฐ๊ฐ ์๋๋ผ ์ฌ์ฉ์์ ๋ฒกํฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๊ฒ์ ๋๋ค. ๋ ์ ํํ๊ฒ, ํ ๊น์ ๋๊ธฐ - ์ค์ ์ฝ๋์์ ๊ธฐ๋ณธ ์ ํ์ด ์๋ ๊ฒฝ์ฐ ๊ฐ ์์์๋ ์์ฑ์๊ฐ ์์ผ๋ฉฐ ๊ตฌํ์์ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ํ์ธํด์ผ ํฉ๋๋ค. ์ด ๋ฒกํฐ์ ๊ฐ ์์์ ์ ํํ ์ ์ก๋์์ต๋๋ค. ๊ทธ ์ ํ? ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ด ๋ค๋ฅธ ์์์ ๋ค๋ฅธ ์ ํ์ ํฌํจํ ์ ์๋ ์ผ์ข ์ PHP๋ผ๋ฉด?
์ด ์์ ์์ ๊ถ๊ธํด์ง๊ธฐ ์์ํฉ๋๋ค. ๊ทธ๋ฌํ TL์ด ํ์ํ๊ฐ์? ์นดํธ์ ๊ฒฝ์ฐ ๋น์ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒ๊ณผ ๋์ผํ protobuf ์ธ ์ธ๊ฐ ์ง๋ ฌ ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น? ์ด๋ก ์ด์์ผ๋ ์ค์ ์ ๋ด ์๋ค.
์ฝ๋์ ๊ธฐ์กด TL ๊ตฌํ
TL์ Durov์ ์ง๋ถ ๋งค๊ฐ๊ณผ ํจ๊ป ์ ์๋ ค์ง ์ฌ๊ฑด ์ด์ ์๋ VKontakte์ ์ฐฝ์์์ ํ์ด๋ฌ์ต๋๋ค.ํ์คํ), Telegram์ด ๊ฐ๋ฐ๋๊ธฐ ์ ์๋. ๊ทธ๋ฆฌ๊ณ ์คํ์์ค์์
Templates are not used now. Instead, the same universal constructors (for example, vector {t:Type} [t] = Vector t) are used w
๊ทธ๋ฌ๋ ์์ ์ฑ์ ๊ธฐํ๊ธฐ ์ํด, ๋งํ์๋ฉด ์ฌ์์ ๊ฑฐ์ธ์ ์งํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๊ทธ๋ฆผ์ ์ดํด๋ด ์๋ค.
#define ZHUKOV_BYTES_HACK
#ifdef ZHUKOV_BYTES_HACK
/* dirty hack for Zhukov request */
๋๋ ์ด ์๋ฆ๋ค์ด ๊ฒ:
static const char *reserved_words_polymorhic[] = {
"alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", NULL
};
์ด ์กฐ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ ํ ํ๋ฆฟ์ ๊ดํ ๊ฒ์ ๋๋ค.
intHash {alpha:Type} vector<coupleInt<alpha>> = IntHash<alpha>;
์ด๊ฒ์ int - Type ์์ ๋ฒกํฐ๋ก์ ํด์๋งต ํ ํ๋ฆฟ ์ ํ์ ์ ์์ ๋๋ค. C++์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
template <T> class IntHash {
vector<pair<int,T>> _map;
}
๊ทธ๋์, alpha
- ํค์๋! ํ์ง๋ง C++์์๋ง T๋ฅผ ์์ฑํ ์ ์์ง๋ง ์ํ, ๋ฒ ํ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค... ํ์ง๋ง ๋งค๊ฐ๋ณ์๊ฐ 8๊ฐ๋ฅผ ์ด๊ณผํ์ง ์์ผ๋ฉด ์ธํ์์ ํ์์ด ๋๋ฌ์ต๋๋ค. ๊ทธ๋์ ํ๋ ์ํธ ํํ
๋ฅด๋ถ๋ฅดํฌ์์ ๋๋ต ๊ทธ๋ฌํ ๋ํ๊ฐ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
-- ะะฐะดะพ ัะดะตะปะฐัั ะฒ TL ัะฐะฑะปะพะฝั
-- ะะป... ะั ะฟัััั ะฟะฐัะฐะผะตััั ะทะพะฒัั ะฐะปััะฐ, ะฑะตัะฐ,... ะะฐะบะธะต ัะฐะผ ะตัั ะฑัะบะฒั ะตััั... ะ, ัััะฐ!
-- ะัะฐะผะผะฐัะธะบะฐ? ะั ะฟะพัะพะผ ะฝะฐะฟะธัะตะผ
-- ะกะผะพััะธัะต, ะบะฐะบะพะน ั ัะธะฝัะฐะบัะธั ะฟัะธะดัะผะฐะป ะดะปั ัะฐะฑะปะพะฝะพะฒ ะธ ะฒะตะบัะพัะฐ!
-- ะขั ะดะพะปะฑะฐะฝัะปัั, ะบะฐะบ ะผั ััะพ ะฟะฐััะธัั ะฑัะดะตะผ?
-- ะะฐ ะฝะต ััััะต, ะพะฝ ัะฐะผ ะพะดะธะฝ ะฒ ัั
ะตะผะต, ะทะฐั
ะฐัะบะพะดะธัั -- ะธ ะพะบ
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ "์ผ๋ฐ์ ์ผ๋ก" TL์ ์ฒซ ๋ฒ์งธ ๋ฐฐ์น ๊ตฌํ์ ๊ดํ ๊ฒ์ ๋๋ค. ์ค์ Telegram ํด๋ผ์ด์ธํธ์์ ๊ตฌํ์ ๊ณ ๋ คํ๋ ๋จ๊ณ๋ก ๋์ด๊ฐ์๋ค.
๋ฐ์ง์ ๋ง:
Vasily, [09.10.18 17:07] ๋ฌด์๋ณด๋ค๋, ๊ทธ๋ค์ด ๋ง์ ์ถ์ํ๋ฅผ ๋ง์น ๋ค์ ๋ณผํธ๋ฅผ ๋๋๋ฆฌ๊ณ ๋ชฉ๋ฐ๋ก ์ฝ๋ ์์ฑ๊ธฐ๋ฅผ ๊ฒน์ณค๋ค๋ ์ฌ์ค ๋๋ฌธ์ ์๋ฉ์ด๊ฐ ๋จ๊ฒ์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ถ๋์์ ๋จผ์ pilot.jpg
๊ทธ๋ฐ ๋ค์ jekichan.webp ์ฝ๋์์
๋ฌผ๋ก ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ํ์ ์ต์ํ ์ฌ๋๋ค์ Aho, Ullman์ ์ฝ์๊ณ ์์ญ ๋ ๋์ DSL ์ปดํ์ผ๋ฌ๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ฌ์ค์์ ์ฐ์ ํ์ค ๋๊ตฌ์ ์ต์ํ๋ค๊ณ ๊ธฐ๋ํ ์ ์์ต๋๋ค. ..
์ ์
16.12 04:18 Vasily: ์ ์๊ฐ์๋ ๋๊ตฐ๊ฐ๊ฐ lex + yacc๋ฅผ ๋ง์คํฐํ์ง ์์์ต๋๋ค.
16.12 04:18 ๋ฐ์ค๋ฆฌ: ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ช ํ ์ ์์ต๋๋ค
16.12 04:18 ๋ฐ์ค๋ฆฌ: ์, ์๋๋ฉด VK์ ์ค ์๋งํผ ๋์ ๋ฐ์์ต๋๋ค.
16.12 04:19 ๋ฐ์ค๋ฆฌ: ๊ธฐํ 3k+ ๋ผ์ธ<censored>
ํ์ ๋์
์์ธ์ผ๊น์? ๋ฐฉ๋ฒ์ ๋ณด์
nametype = re.match(r'([a-zA-Z.0-9_]+)(#[0-9a-f]+)?([^=]*)=s*([a-zA-Z.<>0-9_]+);', line);
if (not nametype):
if (not re.match(r'vector#1cb5c415 {t:Type} # [ t ] = Vector t;', line)):
print('Bad line found: ' + line);
Python์ 1100๊ฐ ์ด์์ ๋ผ์ธ, ๋ ๊ฐ์ ์ ๊ท์ + ๋ฒกํฐ ์ ํ์ ํน์ํ ๊ฒฝ์ฐ, ๋ฌผ๋ก TL ๊ตฌ๋ฌธ์ ๋ฐ๋ผ์ผ ํ๊ธฐ ๋๋ฌธ์ ์คํค๋ง์์ ์ ์ธ๋์ง๋ง ์ด ๊ตฌ๋ฌธ์ ๋ฐฐ์นํ๊ณ ๋ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค. ... ๋ฌธ์ ๋ ์ ์ด ๋ชจ๋ ๊ธฐ์ ์ ๊ท์ฐฎ๊ฒ ํ๋๋์ ๋๋ค.ะธ์ด์จ๋ ๋ฌธ์์ ๋ฐ๋ผ ์๋ฌด๋ ๊ทธ๊ฒ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์๋๋ค๋ฉด ๋ ๋ง์ ํผํ?!
๊ทธ๋์ ๋... ์ฐ๋ฆฌ๊ฐ CRC32 ๊ฒ์ฌ์ ๋ํด ์ด์ผ๊ธฐํ ๊ฒ์ ๊ธฐ์ตํ์ญ๋๊น? ๋ฐ๋ผ์ Telegram Desktop ์ฝ๋ ์์ฑ๊ธฐ์๋ ๊ณ์ฐ๋ CRC32๊ฐ ์๋ ์ ํ์ ๋ํ ์์ธ ๋ชฉ๋ก์ด ์์ต๋๋ค. ์ผ์นํ์ง ์๋๋ค ๋ค์ด์ด๊ทธ๋จ์ ํ์๋๋๋ก!
Vasily, [18.12 22:49] ์ฌ๊ธฐ์ ๊ทธ๋ฌํ TL์ด ํ์ํ์ง ์๊ฐํด์ผ ํฉ๋๋ค.
๋์ฒด ๊ตฌํ์ ์๋ง์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์ค ๋ฐ๊ฟ์ ์ฝ์ ํ๊ธฐ ์์ํ๋ฉด ๊ตฌ๋ฌธ ๋ถ์๊ธฐ์ ์ ๋ฐ์ด ์ฌ๋ฌ ์ค ์ ์์์ ์ค๋จ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ tdesktop๋
์ ๋ผ์ด๋์ ๋ํ ์์ ์ ๊ธฐ์ตํ์ญ์์ค. ๋์ค์ ๋ค์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ข์, telegram-cli๋ ๋น๊ณต์์ด๊ณ Telegram Desktop์ ๊ณต์์ด์ง๋ง ๋ค๋ฅธ ๊ฒ์ ์ด๋ป์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๋๊ฐ ์๋๊น? .. Android ํด๋ผ์ด์ธํธ ์ฝ๋์๋ ์คํค๋ง ํ์๊ฐ ์ ํ ์์์ง๋ง (์คํ ์์ค์ ๋ํ ์ง๋ฌธ์ด ์์ง๋ง ์ด๊ฒ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ๋ํ ๊ฒ์ ๋๋ค) ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ฌ๋ฏธ์๋ ์ฝ๋ ์กฐ๊ฐ์ด ์์์ง๋ง ๊ทธ์ ๋ํ ๋ด์ฉ์ ์๋ ํ์ ์น์ .
์ง๋ ฌํ๊ฐ ์ค์ ๋ก ์ ๊ธฐํ๋ ๋ค๋ฅธ ์ง๋ฌธ์ ๋ฌด์์ ๋๊น? ์๋ฅผ ๋ค์ด, ๊ทธ๋ค์ ๋ฌผ๋ก ๋นํธ ํ๋์ ์กฐ๊ฑด๋ถ ํ๋๋ฅผ ๋ง์ณค์ต๋๋ค.
๋ฐ์ค๋ฆฌ:
flags.0? true
ํ๋๊ฐ ์์์ ์๋ฏธํ๊ณ ํ๋๊ทธ๊ฐ ์ค์ ๋์ด ์์ผ๋ฉด ์ฐธ์ ๋๋ค.๋ฐ์ค๋ฆฌ:
flags.1? int
ํ๋๊ฐ ์กด์ฌํ๊ณ deserializeํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.๋ฐ์ค๋ฆฌ: ์๋ฉ์ด, ํ์ง ๋ง, ๋ญํ๋๊ฑฐ์ผ!
Vasily: ๋ฌธ์ ์ด๋๊ฐ์ true๋ ๊ธธ์ด๊ฐ XNUMX์ธ ๊ธฐ๋ณธ ์ ํ์ด๋ผ๋ ์ธ๊ธ์ด ์์ง๋ง ๋ฌธ์์์ ๋ฌด์ธ๊ฐ๋ฅผ ์์งํ๋ ๊ฒ์ ๋นํ์ค์ ์ ๋๋ค.
Vasily: ๊ฐ๋ฐฉํ ๊ตฌํ์๋ ๊ทธ๋ฐ ๊ฒ์ ์์ง๋ง ๋ชฉ๋ฐ๊ณผ ์ํ์ด ๋ง์ด ์์ต๋๋ค.
ํ
๋ ํค์ ์ด๋? ์๋ฅผ ๋ค์ด MTProto ์ฃผ์ ๋ฅผ ๋ฏธ๋ฆฌ ์ดํด๋ณด๋ฉด ๋ฌธ์์ ๊ทธ๋ฌํ ๋ถ๋ถ์ด ์์ง๋ง ๊ธฐํธ %
"์ฃผ์ด์ง ๊ธฐ๋ณธ ์ ํ์ ํด๋น"์ผ๋ก๋ง ์ค๋ช
๋ฉ๋๋ค. ์๋ ์์์ ์ค๋ฅ ๋๋ ๋ฌธ์ํ๋์ง ์์ ํญ๋ชฉ์
๋๋ค.
๋ฐ์ค๋ฆฌ, [22.06.18/18/38 XNUMX:XNUMX] ํ ๊ณณ์์:
msg_container#73f1f8dc messages:vector message = MessageContainer;
๋ค๋ฅธ:
msg_container#73f1f8dc messages:vector<%Message> = MessageContainer;
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ๋ค์ ๋ ๊ฐ์ง ํฐ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ์ค์ํ์์ ์ด๋ค ์ข ๋ฅ์ ์๋ชธ ๋ฒกํฐ๊ฐ ์ต๋๋ค
๋ฒ ์ด ๋ฒกํฐ ์ ์๋ฅผ ๋ณธ ์ ์ด ์์ผ๋ฉฐ ๋ณธ ์ ์ด ์์ต๋๋ค.
์์ผ๋ก telethon์ผ๋ก ์์ฑ๋ ๋ถ์
๊ทธ์ ์คํค๋ง๋ ์ ์๋ฅผ ์ฃผ์ ์ฒ๋ฆฌํ์ต๋๋ค.
msg_container
๋ค์ ๋งํ์ง๋ง, ์ง๋ฌธ์ %์ ๋ํด ๋จ์ ์์ต๋๋ค. ์ค๋ช ๋์ด ์์ง ์์ต๋๋ค.
Vadim Goncharov, [22.06.18/19/22 XNUMX:XNUMX PM] ๊ทธ๋ฆฌ๊ณ tdesktop์์?
Vasily, [22.06.18/19/23 XNUMX:XNUMX] ํ์ง๋ง ๊ท์ ๊ธฐ๊ด์ TL ํ์๋ ์๋ง๋ ๊ทธ๊ฒ์ ๋จน์ง ์์ ๊ฒ์ ๋๋ค
// parsed manually
TL์ ์๋ฆ๋ค์ด ์ถ์ํ์ด๋ฉฐ ์๋ฌด๋ ์๋ฒฝํ๊ฒ ๊ตฌํํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๊ณํ ๋ฒ์ ์๋ %๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ฌธ์๋ ๊ทธ ์์ฒด๋ก ๋ชจ์๋๋ฏ๋ก xs
๊ทธ๊ฒ์ ๋ฌธ๋ฒ์์ ๋ฐ๊ฒฌ๋์์ผ๋ฉฐ ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ค๋ช ํ๋ ๊ฒ์ ์์ ์ ์์ต๋๋ค.
๊ธ์, ๋น์ ์ TL์์ ๋ํฌ๋ฅผ ๋ณด์์ต๋๋ค. ๋ฐ ๋ฆฌํฐ ์์ด๋ ์์๋ผ ์ ์์ต๋๋ค
๋ค๋ฅธ ๋ ์๋ "๊ธ์์, ๋น์ ์ ๋ชจ๋ ๊ฒ์ ๋นํํ๋ฏ๋ก ์ ๋๋ก ๋ณด์ฌ์ฃผ์ธ์. "๋ผ๊ณ ๋งํ ๊ฒ์ ๋๋ค.
Vasily๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ตํฉ๋๋ค. โํ์์ ๊ดํด์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ํ์ํฉ๋๋ค.
args: /* empty */ { $$ = NULL; }
| args arg { $$ = g_list_append( $1, $2 ); }
;
arg: LC_ID ':' type-term { $$ = tl_arg_new( $1, $3 ); }
| LC_ID ':' condition '?' type-term { $$ = tl_arg_new_cond( $1, $5, $3 ); free($3); }
| UC_ID ':' type-term { $$ = tl_arg_new( $1, $3 ); }
| type-term { $$ = tl_arg_new( "", $1 ); }
| '[' LC_ID ']' { $$ = tl_arg_new_mult( "", tl_type_new( $2, TYPE_MOD_NONE ) ); }
;
์ด๋ป๊ฒ ๋ ๋ณด๋ค
struct tree *parse_args4 (void) {
PARSE_INIT (type_args4);
struct parse so = save_parse ();
PARSE_TRY (parse_optional_arg_def);
if (S) {
tree_add_child (T, S);
} else {
load_parse (so);
}
if (LEX_CHAR ('!')) {
PARSE_ADD (type_exclam);
EXPECT ("!");
}
PARSE_TRY_PES (parse_type_term);
PARSE_OK;
}
๋๋
# Regex to match the whole line
match = re.match(r'''
^ # We want to match from the beginning to the end
([w.]+) # The .tl object can contain alpha_name or namespace.alpha_name
(?:
# # After the name, comes the ID of the object
([0-9a-f]+) # The constructor ID is in hexadecimal form
)? # If no constructor ID was given, CRC32 the 'tl' to determine it
(?:s # After that, we want to match its arguments (name:type)
{? # For handling the start of the '{X:Type}' case
w+ # The argument name will always be an alpha-only name
: # Then comes the separator between name:type
[wd<>#.?!]+ # The type is slightly more complex, since it's alphanumeric and it can
# also have Vector<type>, flags:# and flags.0?default, plus :!X as type
}? # For handling the end of the '{X:Type}' case
)* # Match 0 or more arguments
s # Leave a space between the arguments and the equal
=
s # Leave another space between the equal and the result
([wd<>#.?]+) # The result can again be as complex as any argument type
;$ # Finally, the line should always end with ;
''', tl, re.IGNORECASE | re.VERBOSE)
์ด๊ฒ์ ์ ์ฒด ์ดํ ๋ถ์๊ธฐ์ ๋๋ค.
---functions--- return FUNCTIONS;
---types--- return TYPES;
[a-z][a-zA-Z0-9_]* yylval.string = strdup(yytext); return LC_ID;
[A-Z][a-zA-Z0-9_]* yylval.string = strdup(yytext); return UC_ID;
[0-9]+ yylval.number = atoi(yytext); return NUM;
#[0-9a-fA-F]{1,8} yylval.number = strtol(yytext+1, NULL, 16); return ID_HASH;
n /* skip new line */
[ t]+ /* skip spaces */
//.*$ /* skip comments */
/*.**/ /* skip comments */
. return (int)yytext[0];
์ ๊ฒ๋ค. ๋ ๊ฐ๋จํ ๊ฒ์ ์จํํ๊ฒ ํํํ๋ ๊ฒ์ ๋๋ค."
์ผ๋ฐ์ ์ผ๋ก ๊ฒฐ๊ตญ TL์ ์ค์ ๋ก ์ฌ์ฉ๋๋ ๋ถ๋ถ ์งํฉ์ ๋ํ ํ์ ๋ฐ ์ฝ๋ ์์ฑ๊ธฐ๋ ์ฝ 100์ค์ ๋ฌธ๋ฒ๊ณผ ~ 300์ค์ ์์ฑ๊ธฐ์ ๋ง์ต๋๋ค(๋ชจ๋ ํฌํจ). print
์ ์์ฑ ์ฝ๋), ์ ํ Goodies, ๊ฐ ํด๋์ค์์ ์ฑ์ฐฐ์ ์ํ ์ ํ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ๊ฐ ๋คํ์ฑ ์ ํ์ ๋น ์ถ์ ๊ธฐ๋ณธ ํด๋์ค๋ก ๋ฐ๋๊ณ ์์ฑ์๋ ์ด ํด๋์ค์์ ์์๋๋ฉฐ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ๋ฅผ ์ํ ๋ฉ์๋๋ฅผ ๊ฐ์ต๋๋ค.
์ ํ ์ธ์ด์ ์ ํ ๋ถ์กฑ
๊ฐ๋ ฅํ ํ์ดํ์ด ์ข์ฃ ? ์๋์, ์ด๊ฒ์ holivar(๋์ ์ธ์ด๋ฅผ ์ ํธํ์ง๋ง)๊ฐ ์๋๋ผ TL ๋ด์ ๊ฐ์ ์ ๋๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ด๋ ์ฐ๋ฆฌ๋ฅผ ์ํด ๋ชจ๋ ์ข ๋ฅ์ ๊ฒ์ฌ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๊ธ์์, ๊ทธ๊ฐ ์๋๋ผ ๊ตฌํ์ด์ง๋ง ์ ์ด๋ ์ค๋ช ํด์ผํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ด๋ค ๊ธฐํ๋ฅผ ์ํฉ๋๊น?
์ฐ์ ์ ์ฝ ์กฐ๊ฑด์ ๋๋ค. ํ์ผ ์ ๋ก๋์ ๋ํ ๋ฌธ์์์ ๋ค์์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ํ์ผ์ ์ด์ง ์ฝํ ์ธ ๊ฐ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค. ๋ชจ๋ ๋ถํ์ ํฌ๊ธฐ๊ฐ ๊ฐ์์ผ ํฉ๋๋ค( ๋ถํ ํฌ๊ธฐ ) ๋ค์ ์กฐ๊ฑด์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.
part_size % 1024 = 0
(1KB๋ก ๋๋์ด์ง)524288 % part_size = 0
(512KB๋ part_size๋ก ๊ท ๋ฑํ๊ฒ ๋๋์ด์ผ ํจ)๋ง์ง๋ง ๋ถํ์ ํฌ๊ธฐ๊ฐ part_size๋ณด๋ค ์์ ๊ฒฝ์ฐ ์ด๋ฌํ ์กฐ๊ฑด์ ์ถฉ์กฑํ ํ์๊ฐ ์์ต๋๋ค.
๊ฐ ๋ถํ์๋ ์ํ์ค ๋ฒํธ๊ฐ ์์ด์ผ ํฉ๋๋ค. ํ์ผ_๋ถ๋ถ, 0์์ 2,999 ์ฌ์ด์ ๊ฐ.
ํ์ผ์ด ๋ถํ ๋ ํ ์๋ฒ์ ์ ์ฅํ ๋ฐฉ๋ฒ์ ์ ํํด์ผ ํฉ๋๋ค. ์ฌ์ฉ
์ ๋ก๋.์ ์ฅBigFilePart ํ์ผ์ ์ ์ฒด ํฌ๊ธฐ๊ฐ 10MB ์ด์์ธ ๊ฒฝ์ฐ์ ๋ก๋.์ ์ฅํ์ผ ๋ถ๋ถ ๋ ์์ ํ์ผ์ ๊ฒฝ์ฐ.
[...] ๋ค์ ๋ฐ์ดํฐ ์ ๋ ฅ ์ค๋ฅ ์ค ํ๋๊ฐ ๋ฐํ๋ ์ ์์ต๋๋ค.
- FILE_PARTS_INVALID - ๋ถํ ์๊ฐ ์๋ชป๋์์ต๋๋ค. ๊ฐ์ด ์ฌ์ด์ ์์ง ์์
1..3000
์คํค๋ง์ ์ด๋ฌํ ํญ๋ชฉ์ด ์์ต๋๊น? TL์ ํตํด ์ด๋ป๊ฒ๋ ํํํ ์ ์์ต๋๊น? ์๋์. ํ์ง๋ง ๊ตฌ์ ํฐ๋ณด ํ์ค์นผ๋ ๋ค์์ ์ํด ์ฃผ์ด์ง ์ ํ์ ์ค๋ช
ํ ์ ์์์ต๋๋ค. ๋ฒ์. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ์ด์ ๋ ์ ์๋ ค์ง ํ ๊ฐ์ง ์ผ์ ๋ ํ ์ ์์์ต๋๋ค. enum
- ๊ณ ์ ๋(์์) ๊ฐ์ ์ด๊ฑฐํ์ผ๋ก ๊ตฌ์ฑ๋ ์ ํ์
๋๋ค. C - ์ซ์์ ๊ฐ์ ์ธ์ด์์๋ ์ง๊ธ๊น์ง ์ ํ์ ๋ํด์๋ง ์ด์ผ๊ธฐํ์ต๋๋ค. ์ซ์. ํ์ง๋ง ๋ฐฐ์ด, ๋ฌธ์์ด๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด ๋ฌธ์์ด์๋ ์ ํ๋ฒํธ๋ง ํฌํจ๋ ์ ์๋ค๊ณ ์ค๋ช
ํ๋ฉด ์ข๊ฒ ์ฃ ?
์ด ์ค ์ด๋ ๊ฒ๋ TL์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฅผ ๋ค์ด JSON ์คํค๋ง์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ์ฝ๋์์ ์ฌ์ ํ ํ์ธํด์ผ ํ๋ 512KB์ ๋ถํ ๊ฐ๋ฅ์ฑ์ ๋ํด ์ด์๋ฅผ ์ ๊ธฐํ ์ ์๋ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๊ฐ ๋ชปํ์ต๋๋ค ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ฒํธ ๋ณด๋ด๊ธฐ 1..3000
(๊ทธ๋ฆฌ๊ณ ํด๋น ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์์ ์๋ ์์ต๋๋ค) ๊ฐ๋ฅํ๊ฒ ์ฃ ? ..
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ค๋ฅ ๋ฐ ๋ฐํ ๊ฐ์ ๋ํด. TL๊ณผ ํจ๊ป ์ผํ ์ฌ๋๋ค์๊ฒ๋ ๋์ด ํ๋ฆฟํฉ๋๋ค. ๊ฐ TL์ ํจ์๋ ์ค์ ๋ก ์ค๋ช ๋ ๋ฐํ ์ ํ๋ฟ๋ง ์๋๋ผ ์ค๋ฅ๋ ๋ฐํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ TL ์์ฒด๋ก๋ ์ถ๋ก ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ดํดํ ์ ์๊ณ nafig๋ ์ค์ ๋ก ํ์ํ์ง ์์ต๋๋ค (์ฌ์ค RPC๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ํ ๋ ์ ์์ง๋ง ์ด๊ฒ์ผ๋ก ๋์๊ฐ ๊ฒ์ ๋๋ค). ๊ทธ๋ฌ๋ ํ๋ ์ธ๊ณ์ ์ถ์ ์ ํ ์ํ ๊ฐ๋ ์ ์์์ฑ์ ์ด๋ป์ต๋๊น? .. ์ก์ ๋น๊น-๊ทธ๋์ ์ผ์นํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๊ฐ๋
์ฑ์ ์ด๋ป์ต๋๊น? ๊ธ์์, ์ผ๋ฐ์ ์ผ๋ก ์ค๋ช
์คํค๋ง์์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ์ง๊ณ ์์ง๋ง(๋ค์ ๋งํ์ง๋ง JSON ์คํค๋ง์ ์์) ์ด๋ฏธ ๋ถ๋ด์ด ๋๋ค๋ฉด ์ค์ฉ์ ์ธ ์ธก๋ฉด์ ์ด๋ป์ต๋๊น? ์ ์ด๋ ์
๋ฐ์ดํธ ์ค์ diff๋ฅผ ๋ณด๋ ๊ฒ์ ์ง๋ถํ ์ผ์
๋๊น? ์์ ์ง์ ํ์ธํ์ธ์.
-channelFull#76af5481 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int = ChatFull;
+channelFull#1c87a71a flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_view_stats:flags.12?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int = ChatFull;
๋๋
-message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;
+message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;
์๋ฅผ ๋ค์ด ๋๊ตฐ๊ฐ๋ ๊ทธ๊ฒ์ ์ข์ํ์ง๋ง GitHub๋ ๊ทธ๋ฌํ ๊ธด ์ค ๋ด๋ถ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์กฐ ํ์ํ์ง ์์ต๋๋ค. ๊ฒ์ "10 ๊ฐ์ ์ฐจ์ด์ ์ฐพ๊ธฐ", ๊ทธ๋ฆฌ๊ณ ๋๊ฐ ์ฆ์ ๋ณด๋ ๊ฒ์ ๋ ์์์ ์์๊ณผ ๋์ด ๋์ผํ๋ค๋ ๊ฒ์ ๋๋ค. ์ค๊ฐ ์ด๋๊ฐ๋ฅผ ์ง๋ฃจํ๊ฒ ์ฝ์ด์ผํฉ๋๋ค ... ์ ์๊ฐ์๋ ์ด๊ฒ์ ๋จ์ง ์ด๋ก ์ด ์๋๋ผ, ํ์ง๋ง ์์ ํ ์๊ฐ์ ์ผ๋ก ๋๋ฝ๊ณ ๊น๋ํ์ง ์์.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ด๋ก ์ ์์์ฑ์ ๋ํด. ๋นํธ ํ๋๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ทธ๋ค์ ๋ณด์ด์ง ์๋ ๋ฟก๋ฟก์ด ์ ํ ์ด๋ก ์ ๊ด์ ์์ ๋์๊ฐ์? ์ด์ ๋ฒ์ ์ ์คํค๋ง์์ ์ค๋ช ์ ๋ณผ ์ ์์ต๋๋ค. ์ฒ์์๋ ๊ทธ๋ ์ต๋๋ค. ์ฌ์ฑ๊ธฐ๋ง๋ค ์๋ก์ด ์ ํ์ด ๋ง๋ค์ด์ก์ต๋๋ค. ์ด๋ฌํ ๊ธฐ์ด๋ ์ฌ์ ํ ์ด ํ์์ผ๋ก ์กด์ฌํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
storage.fileUnknown#aa963b05 = storage.FileType;
storage.filePartial#40bc6f52 = storage.FileType;
storage.fileJpeg#7efe0e = storage.FileType;
storage.fileGif#cae1aadf = storage.FileType;
storage.filePng#a4f63c0 = storage.FileType;
storage.filePdf#ae1e508d = storage.FileType;
storage.fileMp3#528a0677 = storage.FileType;
storage.fileMov#4b09ebbc = storage.FileType;
storage.fileMp4#b3cea0e4 = storage.FileType;
storage.fileWebp#1081464c = storage.FileType;
๊ทธ๋ฌ๋ ์ด์ ๊ตฌ์กฐ์ 5๊ฐ์ ์ ํ์ ํ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๊ฐ๋ฅํ ๋ชจ๋ ์ต์ ์ ๋ํด 32๊ฐ์ ์ ํ์ด ํ์ํฉ๋๋ค. ์กฐํฉ ํญ๋ฐ. ๋ฐ๋ผ์ TL ์ด๋ก ์ ๊ฒฐ์ ์ ์๋๋ ์ฐ์ฌ์ ๊ฐํนํ ํ์ค์ด๋ผ๋ ์ฃผ์ฒ ์๋ฉ์ด์ ๋ค์ ํ ๋ฒ ์ถฉ๋ํ์ต๋๋ค.
๋ํ ์ฅ์์์์ด ์ฌ๋๋ค์ ์์ ์ ํ์ดํ์ ์๋ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด MTProto(๋ค์ ์ฅ)์์ ์๋ต์ Gzip์ผ๋ก ์์ถ๋ ์ ์์ผ๋ฉฐ ๊ณ์ธต ๋ฐ ์คํค๋ง ์๋ฐ์ ์ ์ธํ๊ณ ๋ชจ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ํ ๋ฒ, RpcResult ์์ฒด๊ฐ ์๋๋ผ ๊ทธ ๋ด์ฉ์ ๊ฑฐ๋ ๊ฒ์ ๋๋ค. ๊ธ์, ์ ์ด๋ฌ์ง? .. ์์ถ์ด ์ด๋์์๋ ์๋ํ๋๋ก ๋ชฉ๋ฐ์ ์๋ผ์ผํ์ต๋๋ค.
๋๋ ๋ค๋ฅธ ์๋ฅผ ๋ค์ด, ํ ๋ฒ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. InputPeerUser
๋์ InputUser
. ํน์ ๊ทธ ๋ฐ๋๋ก๋. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํจ๊ณผ๊ฐ ์์๋ค! ์ฆ, ์๋ฒ๋ ์ ํ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์์ต๋๋ค. ์ด๋ป๊ฒ ์ด๋ด ์์์ด? ๋๋ต์ ์๋ง๋ telegram-cli์ ์ฝ๋ ์กฐ๊ฐ์ ์ํด ํ๋กฌํํธ๋ ๊ฒ์
๋๋ค.
if (tgl_get_peer_type (E->id) != TGL_PEER_CHANNEL || (C && (C->flags & TGLCHF_MEGAGROUP))) {
out_int (CODE_messages_get_history);
out_peer_id (TLS, E->id);
} else {
out_int (CODE_channels_get_important_history);
out_int (CODE_input_channel);
out_int (tgl_get_peer_id (E->id));
out_long (E->id.access_hash);
}
out_int (E->max_id);
out_int (E->offset);
out_int (E->limit);
out_int (0);
out_int (0);
์ฆ, ์ฌ๊ธฐ์์ ์ง๋ ฌํ๊ฐ ์๋ฃ๋ฉ๋๋ค. ์๋์ผ๋ก, ์์ฑ๋ ์ฝ๋๊ฐ ์๋๋๋ค! ์๋ง ์๋ฒ๋ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๊ฑฐ ์๋๊น์?.. ์์น์ ์ผ๋ก ํ๋ฒ๋ง ํ๋ฉด ๋๋๊ฑด๋ฐ ๋์ค์ ์ ๋ฐ์ดํธ๋ก ์ด๋ป๊ฒ ์ง์ํ ์ ์์๊น์? ๊ทธ ๊ณํ์ ๋ชฉ์ ์ด ์๋์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ง๋ฌธ์ผ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
๋ฒ์ ๊ด๋ฆฌ. ๋ ์ด์ด
์คํค๋ง ๋ฒ์ ์ ๋ ์ด์ด๋ผ๊ณ ๋ถ๋ฅด๋ ์ด์ ๋ ๊ฒ์๋ ์คํค๋ง์ ๊ธฐ๋ก์ ๊ธฐ๋ฐ์ผ๋ก๋ง ์ถ์ธกํ ์ ์์ต๋๋ค. ๋ถ๋ช ํ ์ฒ์์๋ ๊ธฐ๋ณธ ์์ ์ด ๋ณ๊ฒฝ๋์ง ์์ ์ฒด๊ณ์์ ์ํ ๋ ์ ์๊ณ ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ค๋ฅธ ๋ฒ์ ์ ๋ฐ๋ผ ์ํ๋๊ณ ์์์ ํน์ ์์ฒญ์ ํ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ต๋๋ค. ์์น์ ์ผ๋ก ์ข์ ์์ด๋์ด์ ์๋ก์ด ์์ง์กฐ์ฐจ๋ "ํผํฉ"๋์ด ์ด์ ์ ๊ฒน์ณ์ง๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ก๋์ง ๋ด ์๋ค. ์ฌ์ค, ์ฒ์๋ถํฐ ๋ณผ ์ ์์์ต๋๋ค. ์ฌ๋ฏธ ์์ง๋ง ๊ธฐ๋ณธ ๋ ์ด์ด ๊ตฌ์ฑํ๋ ๋จ์ํ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ ์ด์ด๋ 2์์ ์์๋์์ต๋๋ค. ๋ฌธ์๋ ํน๋ณํ TL ๊ธฐ๋ฅ์ ๋ํด ์๋ ค์ค๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ๋ ์ด์ด 2๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ ๋ค์ ์์ฑ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
invokeWithLayer2#289dd1f6 {X:Type} query:!X = X;
์ค์ ๋ก ์ด๊ฒ์ ๋ชจ๋ API ํธ์ถ ์ ์ ๊ฐ์ด ์๋ int๋ฅผ ์๋ฏธํฉ๋๋ค.
0x289dd1f6
๋ฉ์๋ ๋ฒํธ ์์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๊ด์ฐฎ์์. ๊ทธ๋ฌ๋ ๋ค์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์๋ค
invokeWithLayer3#b7475268 query:!X = X;
๋ค์์ ๋ฌด์์ ๋๊น? ์ถ์ธกํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์
invokeWithLayer4#dea0d430 query:!X = X;
์ฌ๋ฏธ์๋? ์๋, ์๊ธฐ์ ๋๋ฌด ์ด๋ฅด๋ค. ์๊ฐํด๋ด. ๊ฐ ๋ค๋ฅธ ๊ณ์ธต์ ์์ฒญ์ ์ด๋ฌํ ํน์ํ ์ ํ์ผ๋ก ๋ํ๋์ด์ผ ํฉ๋๋ค. ๋ชจ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๊ตฌ๋ณํด์ผ ํฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ์์ 4๋ฐ์ดํธ๋ง ์ถ๊ฐํ๋ ๊ฒ์ด ๋งค์ฐ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ๋์
invokeWithLayer5#417a57ae query:!X = X;
๊ทธ๋ฌ๋ ์ ์ ํ ๊ทธ๊ฒ์ ์ผ์ข ์ bacchanalia๊ฐ ๋ ๊ฒ์์ด ๋ถ๋ช ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๊ฒฐ์ฑ ์ด ๋์์ต๋๋ค.
์ ๋ฐ์ดํธ: ๋ ์ด์ด 9๋ถํฐ ๋์ฐ๋ฏธ ๋ฉ์๋
invokeWithLayerN
ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋คinitConnection
๋ง์ธ! 9๊ฐ์ ๋ฒ์ ์ดํ, ์ฐ๋ฆฌ๋ ๋ง์นจ๋ด 80๋ ๋์ ์ธํฐ๋ท ํ๋กํ ์ฝ์์ ์ํ๋์๋ ์์ ์ ๋๋ฌํ์ต๋๋ค. ์ฐ๊ฒฐ ์ด๊ธฐ์ ๋ฒ์ ํ์์ด ํ ๋ฒ ์์์ต๋๋ค!
๊ทธ๋์ ๋ค์์?..
invokeWithLayer10#39620c41 query:!X = X;
...
invokeWithLayer18#1c900537 query:!X = X;
์ด์ ์์ ์ ์์ต๋๋ค. ๋ ๋ค๋ฅธ 9๊ฐ์ ๋ ์ด์ด ํ์์ผ ๋ง์นจ๋ด ๋ฒ์ ๋ฒํธ๊ฐ ์๋ ๋ฒ์ฉ ์์ฑ์๊ฐ ์ถ๊ฐ๋์์ผ๋ฉฐ ์ฐ๊ฒฐ ์์ ์ ํ ๋ฒ๋ง ํธ์ถํ๋ฉด ๋๋ฉฐ ๋ ์ด์ด์ ์๋ฏธ๊ฐ ์ฌ๋ผ์ง ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด๋ถ ๋ฒ์ ์ผ ๋ฟ์ ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ๊ณณ. ๋ฌธ์ ํด๊ฒฐ๋จ.
์ค๋ฅธ์ชฝ?..
๋ฐ์ค๋ฆฌ, [16.07.18/14/01 XNUMX:XNUMX PM] ๊ธ์์ผ์ ๋๋ ์๊ฐํ๋ค:
ํ ๋ ์๋ฒ๋ ์์ฒญ ์์ด ์ด๋ฒคํธ๋ฅผ ๋ณด๋ ๋๋ค. ์์ฒญ์ InvokeWithLayer๋ก ๋ํ๋์ด์ผ ํฉ๋๋ค. ์๋ฒ๋ ์ ๋ฐ์ดํธ๋ฅผ ๋ํํ์ง ์์ผ๋ฉฐ ์๋ต ๋ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ํํ๋ ๊ตฌ์กฐ๊ฐ ์์ต๋๋ค.์ ๊ฒ๋ค. ํด๋ผ์ด์ธํธ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํ๋ ๋ ์ด์ด๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
Vadim Goncharov, [16.07.18/14/02 XNUMX:XNUMX PM] InvokeWithLayer๋ ์์น์ ์ผ๋ก ๋ฒํ๋ชฉ์ด ์๋๋๊น?
๋ฐ์ค๋ฆฌ, [16.07.18/14/02 XNUMX:XNUMX PM] ์ด ๋ฐฉ๋ฒ๋ฐ์ ์์ด์
Vadim Goncharov, [16.07.18/14/02 XNUMX:XNUMX PM] ๋ณธ์ง์ ์ผ๋ก ์ธ์ ์์ ์ ๋ ์ด์ด๋ง์ ์๋ฏธํด์ผ ํจ
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ํด๋ผ์ด์ธํธ ๋ค์ด ๊ทธ๋ ์ด๋๊ฐ ์ ๊ณต๋์ง ์์ต๋๋ค.
์
๋ฐ์ดํธ, ์ฆ ์ ํ Updates
์ฒด๊ณ์์ ์ด๊ฒ์ API ์์ฒญ์ ๋ํ ์๋ต์ด ์๋๋ผ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์์ฒด์ ์ผ๋ก ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ๊ฒ์๋ฌผ์์ ๋
ผ์ํ ๋ณต์กํ ์ฃผ์ ์ด์ง๋ง ์ง๊ธ์ ํด๋ผ์ด์ธํธ๊ฐ ์คํ๋ผ์ธ์ผ ๋๋ ์๋ฒ๊ฐ ์
๋ฐ์ดํธ๋ฅผ ๋์ ํ๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ฐ๋ผ์ ํฌ์ฅ์ ๊ฑฐ๋ถํ ๋ ๊ฐ ๋ฒ์ ์ ๋ํ๋ด๋ ํจํค์ง์ด๋ฏ๋ก ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ฅํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ง์ํ๋ ๋ฒ์ ์ ์๋ ค์ฃผ๊ธฐ ์ ์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด๋ ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ฅผ ์ ๊ทธ๋ ์ด๋ํ ํ ์ํํด์ผ ํ๋ ์์ ์ ๋ฌด์์ ๋๊น?
- ๋๊ตฌ ๋ณด์ฆ๋ ์ด์ด ๋ฒํธ์ ๋ํ ์๋ฒ์ ์๊ฒฌ์ ํ๋ก์ธ์ค์์ ๋ณ๊ฒฝ๋์ง ์์ต๋๊น?
์ด๊ฒ์ด ์์ ํ ์ด๋ก ์ ์ฌ๊ณ ๋ผ๊ณ ์๊ฐํ๊ณ ์๋ฒ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑ ๋์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ์ด๋ฐ ์ผ์ด ์ผ์ด๋ ์ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น (์ด์จ๋ ์ ํ ์คํธ๋์์ต๋๋ค)? ํ์! ์๋ฌด๋ฆฌ!
์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ 14์์ ๋ง๋ ๊ฒ์ ๋๋ค. XNUMX์ XNUMX์ผ, Telegram ์๋ฒ์ ๋ก๊ทธ์ ๋ฌด์ธ๊ฐ๊ฐ ์ ๋ฐ์ดํธ๋๊ณ ์๋ค๋ ๋ฉ์์ง๊ฐ ๋ฒ์ฉ์์ต๋๋ค.
2019-08-15 09:28:35.880640 MSK warn main: ANON:87: unknown object type: 0x80d182d1 at TL/Object.pm line 213.
2019-08-15 09:28:35.751899 MSK warn main: ANON:87: unknown object type: 0xb5223b0f at TL/Object.pm line 213.
๊ทธ๋ฐ ๋ค์ ๋ช ๋ฉ๊ฐ๋ฐ์ดํธ์ ์คํ ์ถ์ (๋์์ ๋ก๊น ์ด ์์ ๋จ). ๊ฒฐ๊ตญ, TL์์ ๋ฌด์ธ๊ฐ๊ฐ ์ธ์๋์ง ์์ ๊ฒฝ์ฐ ์๋ช ์ ์ํ ๋ฐ์ด๋๋ฆฌ์ด๋ฉฐ ์คํธ๋ฆผ์์ ๋ ๋ฉ๋ฆฌ ์์ต๋๋ค. ๋ชจ๋ ๊ฐ๋ฉด ํด๋ ์ด ๋ถ๊ฐ๋ฅํด์ง๋๋ค. ๊ทธ๋ฐ ์ํฉ์์ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๊ธ์, ๋๊ตฌ์๊ฒ๋ ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ฒ์ ์ฐ๊ฒฐ์ ๋๊ณ ๋ค์ ์๋ํ๋ ๊ฒ์ ๋๋ค. ๋์์ด๋์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ CRC32๋ฅผ ๊ฒ์ํ์ต๋๋ค. ์ฒด๊ณ 73์์ ์์ ํ์ง๋ง ์ฒด๊ณ 82์ ๊ฐ์ฒด๋ก ํ๋ช ๋์์ต๋๋ค. ๋ก๊ทธ๋ฅผ์ฃผ์ ๊น๊ฒ ์ดํด ๋ด ๋๋ค. ๋ ๊ฐ์ง ์ฒด๊ณ์ ์๋ณ์๊ฐ ์์ต๋๋ค!
๋ฌธ์ ๊ฐ ์์ ํ ๋น๊ณต์ ํด๋ผ์ด์ธํธ์ ์๋ ๊ฒ์ผ๊น์? ์๋์, ์ฐ๋ฆฌ๋ Telegram Desktop 1.2.17(์ฌ๋ฌ Linux ๋ฐฐํฌํ๊ณผ ํจ๊ป ์ ๊ณต๋๋ ๋ฒ์ )์ ์คํํ๋ฉฐ ์์ธ ๋ก๊ทธ์ ๊ธฐ๋กํฉ๋๋ค. MTP Unexpected type id #b5223b0f read in MTPMessageMediaโฆ
Google์ ๋น๊ณต์ ํด๋ผ์ด์ธํธ ์ค ํ๋์ ์ ์ฌํ ๋ฌธ์ ๊ฐ ์ด๋ฏธ ๋ฐ์ํ์์ ๋ณด์ฌ ์ฃผ์์ง๋ง ๋ฒ์ ๋ฒํธ์ ์ด์ ๋ฐ๋ผ ๊ฐ์ ์ด ๋ฌ๋์ต๋๋ค ...
๊ทธ๋์ ๋ญ ํ ๊น? Vasily์ ๋๋ ํค์ด์ก์ต๋๋ค. ๊ทธ๋ ๊ณํ์ 91๋ก ์ ๋ฐ์ดํธํ๋ ค๊ณ ์๋ํ๊ณ ๋ฉฐ์น ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ 73์ ์๋ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ ๋ฐฉ๋ฒ ๋ชจ๋ ํจ๊ณผ๊ฐ ์์์ง๋ง ๊ฒฝํ์ ์ด๋ฏ๋ก ์ ํํด์ผ ํ ๋ฒ์ ์๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋๋ ์๋๋ก, ์ผ๋ง๋ ์ค๋ ๊ธฐ๋ค๋ ค์ผ ํ๋์ง .
๋์ค์ ์ํฉ์ ์ฌํํ ์ ์์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ฅผ ์์ํ๊ณ , ๋๊ณ , ์ฒด๊ณ๋ฅผ ๋ค๋ฅธ ๊ณ์ธต์ผ๋ก ๋ค์ ์ปดํ์ผํ๊ณ , ๋ค์ ์์ํ๊ณ , ๋ฌธ์ ๋ฅผ ๋ค์ ํฌ์ฐฉํ๊ณ , ์ด์ ๋ฌธ์ ๋ก ๋์๊ฐ๋๋ค. ๋ถ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์๋ก ๋ค๋ฅธ ๊ณ์ธต์์ ํผํฉ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ค๋ช ? ๋ค์ํ ๊ฐ์ ์ฆ์์์ ์ง์ํ ์ ์๋ฏ์ด ์๋ฒ๋ ์๋ก ๋ค๋ฅธ ์์คํ ์ ์๋ ๋ค์ํ ์ ํ์ ํ๋ก์ธ์ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์๋ง๋ "๋ฒํผ๋ง"์ ๋ด๋นํ๋ ์๋ฒ ์ค ํ๋๋ ๋ ๋์ ์๋ฒ๊ฐ ์ ๊ณต ํ ๊ฒ์ ๋๊ธฐ์ด์ ๋ฃ๊ณ ์์ฑ ๋น์์ ์ฒด๊ณ๋ก ์ ๊ณตํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋๊ธฐ์ด์ด "์ฉ์"์ด ๋๊ธฐ ์ ๊น์ง๋ ์๋ฌด ๊ฒ๋ ํ ์ ์์์ต๋๋ค.
๊ทธ๊ฒ ์๋๋ผ๋ฉด.. ์ด๊ฒ ๋ชน์ธ ๋ชฉ๋ฐ?!.. ์๋, ๋ฏธ์น ์์ด๋์ด๋ฅผ ์๊ฐํ๊ธฐ ์ ์ ๊ณต์ ํด๋ผ์ด์ธํธ์ ์ฝ๋๋ฅผ ์ดํด๋ณด์. Android ๋ฒ์ ์์๋ TL ํ์๋ฅผ ์ฐพ์ ์ ์์ง๋ง (๋น)์ง๋ ฌํ๊ฐ ์๋ ๋ฌด๊ฑฐ์ด ํ์ผ(github์์ ์์ ์ง์ ์ ๊ฑฐ๋ถํจ)์ ์ฐพ์ต๋๋ค. ๋ค์์ ์ฝ๋ ์ค๋ํซ์ ๋๋ค.
public static class TL_message_layer68 extends TL_message {
public static int constructor = 0xc09be45f;
//...
//ะตัะต ะฟะฐัะบะฐ ะฟะพะดะพะฑะฝัั
//...
public static class TL_message_layer47 extends TL_message {
public static int constructor = 0xc992e15c;
public static Message TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
Message result = null;
switch (constructor) {
case 0x1d86f70e:
result = new TL_messageService_old2();
break;
case 0xa7ab1991:
result = new TL_message_old3();
break;
case 0xc3060325:
result = new TL_message_old4();
break;
case 0x555555fa:
result = new TL_message_secret();
break;
case 0x555555f9:
result = new TL_message_secret_layer72();
break;
case 0x90dddc11:
result = new TL_message_layer72();
break;
case 0xc09be45f:
result = new TL_message_layer68();
break;
case 0xc992e15c:
result = new TL_message_layer47();
break;
case 0x5ba66c13:
result = new TL_message_old7();
break;
case 0xc06b9607:
result = new TL_messageService_layer48();
break;
case 0x83e5de54:
result = new TL_messageEmpty();
break;
case 0x2bebfa86:
result = new TL_message_old6();
break;
case 0x44f9b43d:
result = new TL_message_layer104();
break;
case 0x1c9b1027:
result = new TL_message_layer104_2();
break;
case 0xa367e716:
result = new TL_messageForwarded_old2(); //custom
break;
case 0x5f46804:
result = new TL_messageForwarded_old(); //custom
break;
case 0x567699b3:
result = new TL_message_old2(); //custom
break;
case 0x9f8d60bb:
result = new TL_messageService_old(); //custom
break;
case 0x22eb6aba:
result = new TL_message_old(); //custom
break;
case 0x555555F8:
result = new TL_message_secret_old(); //custom
break;
case 0x9789dac4:
result = new TL_message_layer104_3();
break;
๋๋
boolean fixCaption = !TextUtils.isEmpty(message) &&
(media instanceof TLRPC.TL_messageMediaPhoto_old ||
media instanceof TLRPC.TL_messageMediaPhoto_layer68 ||
media instanceof TLRPC.TL_messageMediaPhoto_layer74 ||
media instanceof TLRPC.TL_messageMediaDocument_old ||
media instanceof TLRPC.TL_messageMediaDocument_layer68 ||
media instanceof TLRPC.TL_messageMediaDocument_layer74)
&& message.startsWith("-1");
ํ ... ๋ฏธ์ณค๋๋ณด๋ค์. ํ์ง๋ง ์๋ง๋ ์ด๊ฒ์ ์์ฑ ๋ ์ฝ๋๋ผ๋ฉด ๊ด์ฐฎ์ต๋๊น? .. ๊ทธ๋ฌ๋ ํ์คํ ๋ชจ๋ ๋ฒ์ ์ ์ง์ํฉ๋๋ค! ์ฌ์ค, ์ ๋ชจ๋ ๊ฒ์ด ํ๋์ ํ, ๋น๋ฐ ์ฑํ
๋ฐ ๋ชจ๋ ์ข
๋ฅ์ _old7
์ ์ง ๊ธฐ๊ณ ์ธ๋์ ๋น์ทํ์ง ์์ต๋๋ค ... ํ์ง๋ง ๋ฌด์๋ณด๋ค ๋๋ ๋ฏธ์ณค์ต๋๋ค
TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3
์ฌ๋ฌ๋ถ, ํ ๊ฒน ๋ด์์ ๊ฒฐ์ ๋ ๋ชป ํ์๋์?! ๊ธ์์, "XNUMX"๊ฐ ์ค๋ฅ์ ํจ๊ป ์ถ์๋์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ํ์ง๋ง THREE? .. ๊ฐ์ ๋ ์ดํฌ์์ ์ฆ์ ๋ค์? ์ด๊ฒ ๋ฌด์จ ์๋๋ฌผ์ด์ผ, ๋ฏธ์? ..
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , Telegram Desktop ์์ค์์๋ ๋น์ทํ ์ผ์ด ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ตฌ์ฑํ์ ๋ํ ์ฐ์ ์ปค๋ฐ์ ๋ ์ด์ด ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฌด์ธ๊ฐ๋ฅผ ์์ ํฉ๋๋ค. ์คํค๋ง์ ๋ํ ๊ณต์ ๋ฐ์ดํฐ ์์ค๊ฐ ์๋ ์ํฉ์์ ๊ณต์ ํด๋ผ์ด์ธํธ ์์ค๋ฅผ ์ ์ธํ๊ณ ์ด๋์์ ์ป์ ์ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์์ ๊ฐ์ ธ์ค๋ฉด ๋ชจ๋ ๋ฐฉ๋ฒ์ ํ ์คํธํ ๋๊น์ง ๊ณํ์ด ์์ ํ ์ฌ๋ฐ๋ฅธ์ง ํ์ ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์ด๋ป๊ฒ ํ ์คํธ๋ ์ ์์ต๋๊น? ๋จ์, ๊ธฐ๋ฅ ๋ฐ ๊ธฐํ ํ ์คํธ์ ํฌ์ด ์๊ฒฌ์ ๊ณต์ ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ข์ต๋๋ค. ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public static class TL_folders_deleteFolder extends TLObject {
public static int constructor = 0x1c295881;
public int folder_id;
public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) {
return Updates.TLdeserialize(stream, constructor, exception);
}
public void serializeToStream(AbstractSerializedData stream) {
stream.writeInt32(constructor);
stream.writeInt32(folder_id);
}
}
//manually created
//RichText start
public static abstract class RichText extends TLObject {
public String url;
public long webpage_id;
public String email;
public ArrayList<RichText> texts = new ArrayList<>();
public RichText parentRichText;
public static RichText TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
RichText result = null;
switch (constructor) {
case 0x1ccb966a:
result = new TL_textPhone();
break;
case 0xc7fb5e01:
result = new TL_textSuperscript();
break;
์ฌ๊ธฐ์์ "์๋์ผ๋ก ์์ฑ๋" ์ฃผ์์ ์ด ํ์ผ์ ์ผ๋ถ๋ง ์์ผ๋ก โโ์์ฑ๋์์ผ๋ฉฐ(์ ์ง ๊ด๋ฆฌ ์ ๋ชฝ์ ์์ํ ์ ์์ต๋๊น?) ๋๋จธ์ง๋ ๊ธฐ๊ณ์์ ์์ฑ๋์์์ ๋ํ๋ ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ด ์๊น๋๋ค. ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์์ ํ (Linux ์ปค๋์ GPL ์๋์ ์๋ blob), ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ด๋ฏธ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ์ฃผ์ ์ ๋๋ค.
ํ์ง๋ง ์ถฉ๋ถํฉ๋๋ค. ์ด ๋ชจ๋ ์ง๋ ฌํ๊ฐ ์ซ๊ณ ์๋ ํ๋กํ ์ฝ๋ก ์ด๋ํด ๋ด ์๋ค.
MTํ๋กํ
๊ทธ๋ผ ์ด์ด๋ด
์๋ค
์๋ฅผ ๋ค์ด "๋ฉ์์ง"(๋ฉ์์ง) ๋ฐ "์ธ์ "(์ธ์ ) - ์ฌ๊ธฐ์๋ Telegram ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค์ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ธ์, ๋ฉ์์ง๋ก ๋ชจ๋ ๊ฒ์ด ๋ช ํํ๊ณ OOP๋ก ํด์๋๊ฑฐ๋ ๋จ์ํ "ํจํค์ง"๋ผ๋ ๋จ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฎ์ ์ ์ก ์์ค์ด๋ฉฐ ์ธํฐํ์ด์ค์ ๋์ผํ ๋ฉ์์ง๊ฐ ์์ผ๋ฉฐ ๋ง์ด ์์ต๋๋ค. ์๋น์ค์ ๊ฒ. ํ์ง๋ง ์ธ์ ์ ... ํ์ง๋ง ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ด ์์ต๋๋ค.
์ ์ก ๊ณ์ธต
์ฒซ ๋ฒ์งธ๋ ์ด์ก์ ๋๋ค. 5๊ฐ์ง ์ต์ ์ ๋ํด ์๋ ค๋๋ฆฝ๋๋ค.
- TCP
- ์น ์์ผ
- HTTPS๋ฅผ ํตํ ์น์์ผ
- HTTP
- HTTPS
Vasily, [15.06.18/15/04 XNUMX:XNUMX PM] UDP ์ ์ก๋ ์์ง๋ง ๋ฌธ์ํ๋์ง ์์์ต๋๋ค.
์ธ ๊ฐ์ง ๋ณํ์ TCP
์ฒซ ๋ฒ์งธ๋ TCP๋ฅผ ํตํ UDP์ ์ ์ฌํ๋ฉฐ ๊ฐ ํจํท์๋ ์ํ์ค ๋ฒํธ์ crc๊ฐ ํฌํจ๋ฉ๋๋ค.
์นดํธ์์ ๋ถ๋๋ฅผ ์ฝ๋ ๊ฒ์ด ์ ๊ทธ๋ ๊ฒ ๊ณ ํต์ค๋ฝ์ต๋๊น?
๊ทธ๋ผ ์ง๊ธ
- ์์ฝ ํ ์คํธ
- ์ค๊ฐ์
- ํจ๋ฉ ์ค๊ฐ
- ๊ฐ๋ ์ฐฌ
์๊ฒ ์ต๋๋ค. MTProxy์ฉ ํจ๋ฉ ์ค๊ฐ์ฒด์ ๋๋ค. ์๋ ค์ง ์ด๋ฒคํธ๋ก ์ธํด ๋์ค์ ์ถ๊ฐ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋๋ ํ ์ ์๋๋ฐ ์ ๋ ๊ฐ์ง ๋ฒ์ (์ด XNUMX๊ฐ)์ ๋ ์ถ๊ฐํด์ผ ํ ๊น์? ๋ค ๊ฐ์ง ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ณธ MTProto ์์ฒด์ ๊ธธ์ด์ ํ์ด๋ก๋๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ๋ง ๋ค๋ฆ ๋๋ค. ์ด์ ๋ํด์๋ ๋์ค์ ์์ธํ ์ค๋ช ํฉ๋๋ค.
- ์์ฝ๋ณธ์์๋ 1 ๋๋ 4๋ฐ์ดํธ์ด์ง๋ง 0xef ๋ค์ ๋ณธ๋ฌธ์ ์๋๋๋ค.
- Intermediate์์ ์ด๊ฒ์ 4๋ฐ์ดํธ์ ๊ธธ์ด์ ํ๋์ด๋ฉฐ ํด๋ผ์ด์ธํธ๊ฐ ์ฒ์์ผ๋ก ๋ณด๋ด์ผ ํ๋
0xeeeeeeee
์ค๊ฐ์์ ๋ํ๋ด๊ธฐ ์ํด - ๋คํธ์์ปค์ ๊ด์ ์์ ๋ณผ ๋ ์ ์ฒด์ ์ผ๋ก ๊ฐ์ฅ ์ค๋ ์ฑ์ด ๊ฐํ ๊ฒ์ ๋๋ค: ๊ธธ์ด, ์ํ์ค ๋ฒํธ, ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก MTProto, ๋ณธ๋ฌธ, CRC32์ธ ๊ฒ์ด ์๋๋๋ค. ์, ์ด ๋ชจ๋ ๊ฒ์ด TCP๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ์ง๋ ฌ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ํํ๋ก ์์ ์ ์ธ ์ ์ก์ ์ ๊ณตํ๋ฏ๋ก ์ํ์ค, ํนํ ์ฒดํฌ์ฌ์ด ํ์ํ์ง ์์ต๋๋ค. ์, ์ด์ TCP์ 16๋นํธ ์ฒดํฌ์ฌ์ด ์์ด์ ๋ฐ์ดํฐ ์์์ด ๋ฐ์ํ๋ค๊ณ ๋ฐ๋ํ ๊ฒ์ ๋๋ค. ํ๋ฅญํฉ๋๋ค. ์ค์ ๋ก ํด์๊ฐ 16๋ฐ์ดํธ๋ณด๋ค ๊ธด ์ํธํ ํ๋กํ ์ฝ์ด ์๋ค๋ ์ ์ ์ ์ธํ๊ณ ์ด๋ฌํ ๋ชจ๋ ์ค๋ฅ๋ ๋ ๋์ ์์ค์ SHA ๋ถ์ผ์น์์ ํฌ์ฐฉ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ํด CRC32์๋ ์๋ฌด๋ฐ ์์ ์ด ์์ต๋๋ค.
4๋ฐ์ดํธ ๊ธธ์ด๊ฐ ๊ฐ๋ฅํ Abridged์ "16๋ฐ์ดํธ ๋ฐ์ดํฐ ์ ๋ ฌ์ด ํ์ํ ๊ฒฝ์ฐ"๋ฅผ ์ ๋นํํ๋ Intermediate๋ฅผ ๋น๊ตํด๋ณด์. ๋ญ, Telegram ํ๋ก๊ทธ๋๋จธ๋ ๋๋ฌด ์ํฌ๋ฅธ ๋๋จธ์ง ์์ผ์์ ์ ๋ ฌ๋ ๋ฒํผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค๊ณ ๋ฏฟ์ด์ง๋์? ์ฌ์ ํ ์ด ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ์ฝ๊ธฐ๋ ์ํ๋ ์์ ๋ฐ์ดํธ๋ฅผ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค(์๋ฅผ ๋ค์ด ํ๋ก์ ์๋ฒ๋ ์์ต๋๋ค). ๋๋ ๋ค๋ฅธ ํํธ์ผ๋ก ์๋จ์ 3๋ฐ์ดํธ์ ๋ง๋ํ ํจ๋ฉ์ด ์ฌ์ ํ ์๋ ๊ฒฝ์ฐ Abridged๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? XNUMX๋ฐ์ดํธ๋ฅผ ์ ์ฝํ์ญ์์ค. ๋๋ก๋ ?
๋๊ตฐ๊ฐ๋ Nikolai Durov๊ฐ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ํฌํจํ์ฌ ์ค์ ์ ์ธ ํ์ ์์ด ์์ ๊ฑฐ๋ฅผ ๋ฐ๋ช ํ๋ ๊ฒ์ ๋งค์ฐ ์ข์ํ๋ค๋ ์ธ์์ ๋ฐ์ต๋๋ค.
๊ธฐํ ์ด์ก ์ต์ ํฌํจ. Web ๋ฐ MTProxy๋ ์์ฒญ์ด ์์ ๊ฒฝ์ฐ ์ง๊ธ์ ๊ณ ๋ คํ์ง ์๊ณ ๋ค๋ฅธ ๊ฒ์๋ฌผ์์ ๊ฒํ ํ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ 2018๋ ์ ์ถ์๋ ์งํ ๊ณต๊ธ์๊ฐ ์ ํํ๊ฒ ์ฐจ๋จํ๋ ๋ฐฉ๋ฒ์ ๋น ๋ฅด๊ฒ ๋ฐฐ์ ๋ ๋ฐ๋ก ์ด MTProxy์ ๋ํด์๋ง ๊ธฐ์ตํ ๊ฒ์ ๋๋ค. ์ฐจ๋จ ์ฐํ๋ก ํจํท ํฌ๊ธฐ! ๋ํ C๋ก ์์ฑ๋ MTProxy ์๋ฒ(Waltman์ด ๋ค์ ๋งํจ)๊ฐ ์ ํ ํ์ํ์ง ์์์ง๋ง(Phil Kulin์ด ํ์ธํ ๊ฒ์) Linux ์ฌ์์ ๋ถํ์ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๊ณ ์ ์ฌํ ์๋ฒ๊ฐ Go ๋๋ Node.js์ ์๋ค๋ ์ฌ์ค๋ ์์ต๋๋ค. XNUMX์ค ๋ฏธ๋ง์ผ๋ก ์ ํฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ ํ ์น์ ์ ๋์์ ์ด ์ฌ๋๋ค์ ๊ธฐ์ ๋ฌธํด๋ ฅ์ ๋ํ ๊ฒฐ๋ก ์ ๋์ถํ ๊ฒ์ ๋๋ค. ์ง๊ธ์ MTProto ์ธ์ ์ ๋ฐฐ์นํ ์ธ์ ์ธ 5๋ฒ์งธ OSI ๋ ์ด์ด๋ก ์ด๋ํ๊ฒ ์ต๋๋ค.
ํค, ๋ฉ์์ง, ์ธ์
, Diffie-Hellman
๊ทธ๋ค์ ๊ทธ๊ฒ์ ์์ ํ ์ ํํ๊ฒ ๋ฃ์ง ์์์ต๋๋ค ... ์ธ์ ์ ํ์ฑ ์ธ์ ์๋์ ์ธํฐํ์ด์ค์ ํ์๋๋ ๊ฒ๊ณผ ๋์ผํ ์ธ์ ์ด ์๋๋๋ค. ๊ทธ๋ฌ๋ ์์๋๋ก.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ ์ก ๊ณ์ธต์์ ์๋ ค์ง ๊ธธ์ด์ ๋ฐ์ดํธ ๋ฌธ์์ด์ ๋ฐ์์ต๋๋ค. ์ด๊ฒ์ ์ํธํ๋ ๋ฉ์์ง์ด๊ฑฐ๋ ์ผ๋ฐ ํ ์คํธ์ ๋๋ค. ์์ง ํค ํ์ ๋จ๊ณ์ ์๊ณ ์ค์ ๋ก ์ํ ์ค์ธ ๊ฒฝ์ฐ์ ๋๋ค. "ํค"๋ผ๊ณ ํ๋ ๊ฐ๋ ์ค ์ด๋ค ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น? Telegram ํ ์์ฒด์ ๋ํด ์ด ๋ฌธ์ ๋ฅผ ๋ช ํํ ํฉ์๋ค.
๋ผ๋ ๋ ๊ฐ์ ์ํฐํฐ๊ฐ ์์ต๋๋ค. ์ธ์ - ๊ฐ ์ธ์ ์ด ์ ์ฒด ์ฅ์น/OS์ ํด๋นํ๋ "ํ์ฌ ์ธ์ " ์๋์ ๊ณต์ ํด๋ผ์ด์ธํธ UI์ ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ MTProto ์ธ์ , ๋ฉ์์ง ์ํ์ค ๋ฒํธ(๋ฎ์ ์์ค์ ์๋ฏธ)๊ฐ ์๊ณ ์๋ก ๋ค๋ฅธ TCP ์ฐ๊ฒฐ ๊ฐ์ ์ง์๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์ผ ๋ค์ด๋ก๋ ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ์ฌ๋ฌ MTProto ์ธ์ ์ ๋์์ ์ค์ ํ ์ ์์ต๋๋ค.์ด ๋ ์ฌ์ด ์ธ์ ๊ฐ๋ ์ด๋ค ๊ถํ ๋ถ์ฌ. ํดํ์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ ์ ์์ต๋๋ค. UI ์ธ์ ์ ๊ฐ๋ค ๊ถํ ๋ถ์ฌ๊ทธ๋ฌ๋ ์์, ๊ทธ๊ฒ์ ๋ณต์กํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ณธ๋ค:
- ์ ๊ธฐ๊ธฐ์ ์ฌ์ฉ์๊ฐ ๋จผ์ ์ธ์ฆ_ํค ์๋ฅผ ๋ค์ด SMS๋ฅผ ํตํด ๊ณ์ ์ ์ฐ๊ฒฐํฉ๋๋ค. ๊ถํ ๋ถ์ฌ
- ๊ทธ๊ฒ์ ์ฒซ ๋ฒ์งธ ๋ด๋ถ์์ ๋ฐ์ํ์ต๋๋ค MTProto ์ธ์ ์
session_id
์์ ์์.- ์ด ๋จ๊ณ์์ ์กฐํฉ ๊ถํ ๋ถ์ฌ ะธ
session_id
์ด๋ฆ์ ๋ถ์ผ ์ ์์๋ค ์ - ์ด ๋จ์ด๋ ์ผ๋ถ ํด๋ผ์ด์ธํธ์ ๋ฌธ์ ๋ฐ ์ฝ๋์์ ์ฐพ์ ์ ์์ต๋๋ค.- ๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ด ์ ์์ต๋๋ค. ์ฌ๋ฌ MTProto ์ธ์ ๊ฐ์ ์๋ ์ธ์ฆ_ํค - ๊ฐ์ DC๋ก.
- ๊ทธ๋ฌ๋ ์ด๋ ๋ ํด๋ผ์ด์ธํธ๋ ๋ค์์์ ํ์ผ์ ์์ฒญํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ DC - ์ด DC์ ๋ํด ์ DC๊ฐ ์์ฑ๋ฉ๋๋ค. ์ธ์ฆ_ํค !
- ์ด๊ฒ์ ์๋ก์ด ์ฌ์ฉ์ ๋ฑ๋ก์ด ์๋๋ผ ๋์ผํจ์ ์์คํ ์ ์๋ฆฌ๊ธฐ ์ํด ๊ถํ ๋ถ์ฌ (UI ์ธ์ ), ํด๋ผ์ด์ธํธ๋ API ํธ์ถ์ ์ฌ์ฉํฉ๋๋ค.
auth.exportAuthorization
์ง์์ DCauth.importAuthorization
์๋ก์ด DC์์.- ๋ชจ๋ ๋์ผํ๊ฒ ์ฌ๋ฌ ๊ฐ๊ฐ ์ด๋ ค ์์ ์ ์์ต๋๋ค. MTProto ์ธ์ (๊ฐ์ ์์ ์
session_id
) ์๋์์ ์ด ์ DC๋ก ๊ทธ์ ์ธ์ฆ_ํค.- ๋ง์ง๋ง์ผ๋ก ํด๋ผ์ด์ธํธ๋ Perfect Forward Secrecy๋ฅผ ์ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ธ์ฆ_ํค ์์๋ค ์๊ตฌ ํค - DC๋น - ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ ์ ์์
auth.bindTempAuthKey
์ฌ์ฉํ๊ธฐ์ํ ์ผ์์ ์ธ ์ธ์ฆ_ํค - ๊ทธ๋ฆฌ๊ณ ๋ค์ ํ ๋ฒ๋ง ์์_์ธ์ฆ_ํค DC๋น, ๋ชจ๋์๊ฒ ๊ณตํต MTProto ์ธ์ ์ด DC์.์ ์ ์ฌํญ ์๊ธ (๋ฐ ๋ฏธ๋์ ์๊ธ) ๋ํ ํ๋ ์ธ์ฆ_ํค ์ ๊ฒ๋ค. ๋ชจ๋๊ฐ ๊ณต์ MTProto ์ธ์ ๋์ผํ DC์.
"์๋ก ๋ค๋ฅธ TCP ์ฐ๊ฒฐ ์ฌ์ด"๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ์ด๊ฒ์ ๋ค์์ ์๋ฏธํฉ๋๋ค. ๊ฐ์ ๊ฒ ์น์ฌ์ดํธ์ ์ธ์ฆ ์ฟ ํค - ์ด ์๋ฒ์ ๋ํ ๋ง์ TCP ์ฐ๊ฒฐ์ ์ง์(์กด์)ํ์ง๋ง ์ธ์ ๊ฐ๋ ๋๋น ์ง ๊ฒ์ ๋๋ค. HTTP์ ๋ฌ๋ฆฌ MTProto์์๋ ์ธ์ ๋ด์์ ๋ฉ์์ง๊ฐ ์์ฐจ์ ์ผ๋ก ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง๊ณ ํ์ธ๋๋ฉฐ ํฐ๋์ ๋ค์ด๊ฐ๊ณ ์ฐ๊ฒฐ์ด ๋์ด์ก์ต๋๋ค. ์ ์ฐ๊ฒฐ์ ์ค์ ํ ํ ์๋ฒ๋ ์ด ์ธ์ ์์ ๋ฐฐ๋ฌํ์ง ์์ ๋ชจ๋ ๊ฒ์ ์น์ ํ๊ฒ ๋ณด๋ ๋๋ค. ์ด์ TCP ์ฐ๊ฒฐ.
๊ทธ๋ฌ๋ ์์ ์ ๋ณด๋ ์๊ฐ์์ ์์ก ๋์ ์ง๋ธ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ํด๋ผ์ด์ธํธ๋ฅผ ์ฒ์๋ถํฐ ๊ตฌํํ๊ณ ์์ต๋๊น? - ์ฒ์์ผ๋ก ๋์๊ฐ์.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์์ฑ auth_key
์
Vasily, [19.06.18/20/05 1:255] data_with_hash := SHAXNUMX(๋ฐ์ดํฐ) + ๋ฐ์ดํฐ + (์์์ ๋ฐ์ดํธ); ๊ธธ์ด๊ฐ XNUMX๋ฐ์ดํธ์ ๊ฐ๋๋ก;
encryption_data := RSA(data_with_hash, server_public_key); 255๋ฐ์ดํธ ๊ธธ์ด์ ์ซ์(๋น ์๋์)๋ ํ์ํ ๋ชจ๋๋ฌ์ค์ ๋ํด ํ์ํ ๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก ์ฌ๋ผ๊ฐ๊ณ ๊ฒฐ๊ณผ๋ 256๋ฐ์ดํธ ์ซ์๋ก ์ ์ฅ๋ฉ๋๋ค.๊ทธ๋ค์ ๋ง์ฝ DH๋ฅผ ์ป์์ต๋๋ค.
๊ฑด๊ฐํ ์ฌ๋์ DH์ฒ๋ผ ๋ณด์ด์ง ์๋๋ค
dx์๋ ๋ ๊ฐ์ ๊ณต๊ฐ ํค๊ฐ ์์ต๋๋ค.
๊ธ์, ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์์ ๋์ง๋ง ํด์ ๋ฌผ์ ๋จ์์์์ต๋๋ค. ๊ณ ๊ฐ์ด ์ซ์๋ฅผ ์ธ์ ๋ถํด ํ ์ ์๋ค๋ ์์
์ฆ๋ช
์ ์ํํ์ต๋๋ค. DoS ๊ณต๊ฒฉ์ ๋ํ ๋ณดํธ ์ ํ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ RSA ํค๋ ๋ณธ์ง์ ์ผ๋ก ์ํธํ๋ฅผ ์ํด ํ ๋ฐฉํฅ์ผ๋ก ํ ๋ฒ๋ง ์ฌ์ฉ๋ฉ๋๋ค. new_nonce
. ํ์ง๋ง ๊ฒ๋ณด๊ธฐ์ ๊ฐ๋จํด ๋ณด์ด๋ ์ด ์์ ์ด ์ฑ๊ณตํ๋ ๋์, ๋น์ ์ ๋ฌด์์ ๋ง์ฃผํด์ผ ํ ๊น์?
Vasily, [20.06.18/00/26 XNUMX:XNUMX] ์์ง appid ์์ฒญ์ ๋๋ฌํ์ง ๋ชปํ์ต๋๋ค.
DH์ ์์ฒญ์ ๋ณด๋์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํธ๋์คํฌํธ์ ๋ํฌ์๋ 4๋ฐ์ดํธ์ ์ค๋ฅ ์ฝ๋๋ก ์๋ตํ ์ ์๋ค๊ณ ์ฐ์ฌ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ๋ค์ผ
๊ธ์, ๊ทธ๋ ๋์๊ฒ -404๋ผ๊ณ ๋งํ๋ค. ๊ทธ๋์ ๋ญ?
์ฌ๊ธฐ ๋ด๊ฐ ๊ทธ์๊ฒ ์์ต๋๋ค.
์ด๋ฌํ ์๋ฒ ์๋ต์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ๋ฌด์์ ํด์ผ ํฉ๋๊น? ๋ฌผ์ด๋ณผ ์ฌ๋์ด ์์ต๋๋ค(๋ ๋ฒ์งธ ๋ถ๋ถ์์ ์์ธํ ์ค๋ช ).
์ฌ๊ธฐ์ ๋ํฌ์ ๋ํ ๋ชจ๋ ๊ด์ฌ์
๋ ํ ์ผ์ด ์์ด ๊ฟ๋ง ๊ฟจ์ด ์ซ์๋ฅผ ์๋ค๋ก
๋ ๊ฐ์ 32๋นํธ ์ซ์. ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ฒ๋ผ ๊ทธ๋ค์ ํฌ์ฅ
ํ์ง๋ง ์๋์, BE๋ก ์ฒซ ์ค์ ํ์ํ ๊ฒ์ ์ด ๋ ๊ฐ์ง์ ๋๋ค.
Vadim Goncharov, [20.06.18/15/49 404:XNUMX PM] ๊ทธ๋ฆฌ๊ณ ์ด XNUMX ๋๋ฌธ์?
๋ฐ์ค๋ฆฌ, [20.06.18/15/49 XNUMX:XNUMX PM] ์!
Vadim Goncharov, [20.06.18/15/50 XNUMX:XNUMX PM] ๊ทธ๊ฐ "์ฐพ์ง ๋ชปํ" ๊ฒ์ ์ดํดํ ์ ์์ต๋๋ค
๋ฐ์ค๋ฆฌ, [20.06.18 15:50] ์ฝ
๊ฐ๋จํ ์ฝ์ %๋ก์ ๋ถํด๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค.)
์ค๋ฅ ๋ณด๊ณ ์กฐ์ฐจ ์๋ฌ๋์ง ์์์ต๋๋ค.
๋ฐ์ค๋ฆฌ, [20.06.18/20/18 5:XNUMX PM] ์, MDXNUMX๋ ์๊ตฐ์. ์ด๋ฏธ ์ธ ๊ฐ์ง ๋ค๋ฅธ ํด์
ํค ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋ฉ๋๋ค.
digest = md5(key + iv) fingerprint = substr(digest, 0, 4) XOR substr(digest, 4, 4)
SHA1 ๋ฐ ์ค2
๊ทธ๋์ ๋ฃ์ auth_key
Diffie-Hellman์ ๋ฐ๋ฅด๋ฉด ํฌ๊ธฐ๋ 2048๋นํธ์
๋๋ค. ๋ฌด์ ํฅํ ๊ณํ? ๊ทธ๋ฐ ๋ค์ ์ด ํค์ ํ์ 1024๋นํธ๋ ์ ํ ์ฌ์ฉ๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์ง๋ง... ์ผ๋จ์ ์ด์ ๋ํด ์๊ฐํด ๋ด
์๋ค. ์ด ๋จ๊ณ์์ ์ฐ๋ฆฌ๋ ์๋ฒ์ ๋น๋ฐ์ ๊ณต์ ํฉ๋๋ค. ๋งค์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ ์ฐจ์ธ TLS ์ธ์
์ ์๋ ๋ก๊ทธ๊ฐ ์ค์ ๋์์ต๋๋ค. ํ์ง๋ง ์๋ฒ๋ ์ฐ๋ฆฌ๊ฐ ๋๊ตฌ์ธ์ง ์์ง ์๋ฌด๊ฒ๋ ๋ชจ๋ฆ
๋๋ค! ์์ง, ์ฌ์ค ๊ถํ ๋ถ์ฌ. ์ ๊ฒ๋ค. ICQ์์ ์ฌ์ฉํ๋ "๋ก๊ทธ์ธ ๋น๋ฐ๋ฒํธ" ๋๋ SSH์์์ ๊ฐ์ด ์ ์ด๋ "๋ก๊ทธ์ธ ํค"(์: ์ผ๋ถ gitlab / github)์ ๊ด์ ์์ ์๊ฐํ๋ค๋ฉด. ์ฐ๋ฆฌ๋ ์ต๋ช
์ ์ป์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฒ๊ฐ "์ด ์ ํ๋ฒํธ๋ ๋ค๋ฅธ DC์์ ์ ๊ณตํฉ๋๋ค"๋ผ๊ณ ์๋ตํ๋ฉด? ์๋๋ฉด "๋น์ ์ ์ ํ๋ฒํธ๋ ๊ธ์ง๋์ด ์์ต๋๋ค"? ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ต์ ์ ์ผ์ ํค๊ฐ ์ฌ์ ํ ์ ์ฉํ๊ณ ๊ทธ๋๊น์ง ์ฉ์ง ์์ ๊ฒ์ด๋ผ๋ ํฌ๋ง์ผ๋ก ํค๋ฅผ ์ ์ฅํ๋ ๊ฒ์
๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์์ฝ์ผ๋ก "๋ฐ์์ต๋๋ค". ์๋ฅผ ๋ค์ด ์๋ฒ๋ฅผ ์ ๋ขฐํฉ๋๊น? ๊ทธ๋ ๊ฐ์ง์ ๋๊น? ์ํธํ ๊ฒ์ฌ๊ฐ ํ์ํฉ๋๋ค.
Vasily, [21.06.18/17/53 2:XNUMX PM] ๋จ์์ฑ์ ์ํด XNUMXkbit ์ซ์๋ฅผ ํ์ธํ ์ ์๋ ๋ชจ๋ฐ์ผ ํด๋ผ์ด์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค%)
ํ์ง๋ง ์ ํ ๋ช ํํ์ง ์์, nafeijoa
Vasily, [21.06.18/18/02 XNUMX:XNUMX] ๋ํฌ๋ ๊ฐ๋จํ์ง ์์ ๊ฒ์ผ๋ก ํ๋ช ๋๋ฉด ์ด๋ป๊ฒ ํด์ผํ ์ง ๋งํ์ง ์์ต๋๋ค.
๋งํ์ง ์์๋ค. ์ด ๊ฒฝ์ฐ Android์ฉ ๊ณต์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฌด์์ ํ๋์ง ๋ณผ๊น์? ใ
278 static const char *goodPrime = "c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b";
279 if (!strcasecmp(prime, goodPrime)) {
์๋, ๋ฌผ๋ก ๊ฑฐ๊ธฐ ์ผ๋ถ ์ซ์์ ๋จ์์ฑ์ ๋ํ ๊ฒ์ฌ๊ฐ ์์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ๋ ์ด์ ์ํ์ ๋ํ ์ถฉ๋ถํ ์ง์์ด ์์ต๋๋ค.
์, ๋ง์คํฐ ํค๋ฅผ ์ป์์ต๋๋ค. ๋ก๊ทธ์ธํ๋ ค๋ฉด, ์ฆ ์์ฒญ์ ๋ณด๋ด๋ ค๋ฉด ์ด๋ฏธ AES๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ์ํธํ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
๋ฉ์์ง ํค๋ ํจ๋ฉ ๋ฐ์ดํธ๋ฅผ ํฌํจํ์ฌ ๋ฉ์์ง ๋ณธ๋ฌธ(์ธ์ , ๋ฉ์์ง ID ๋ฑ ํฌํจ)์ SHA128์ ์ค๊ฐ 256๋นํธ๋ก ์ ์๋๋ฉฐ ์ธ์ฆ ํค์์ ๊ฐ์ ธ์จ 32๋ฐ์ดํธ๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
๋ฐ์ค๋ฆฌ, [22.06.18/14/08 XNUMX:XNUMX PM] ํ๋ฒํ ๋ ๋ค
๋ฐ์
auth_key
. ๋ชจ๋. ๋ ๋์๊ฐ ... ๋ถ๋์์ ๋ช ํํ์ง ์์ต๋๋ค. ์คํ ์์ค ์ฝ๋๋ฅผ ์์ ๋กญ๊ฒ ๊ณต๋ถํ์ญ์์ค.MTProto 2.0์ 12์์ 1024๋ฐ์ดํธ์ ํจ๋ฉ์ด ํ์ํ๋ฉฐ ๊ฒฐ๊ณผ ๋ฉ์์ง ๊ธธ์ด๋ฅผ 16๋ฐ์ดํธ๋ก ๋๋ ์ ์๋ค๋ ์กฐ๊ฑด์ด ์ฌ์ ํ ์ ์ฉ๋ฉ๋๋ค.
๊ทธ๋ผ ์ผ๋ง๋ ๋ง์ ํจ๋ฉ์ ๋ฃ์ด์ผ ํ ๊น์?
๊ทธ๋ฆฌ๊ณ ์, ์ฌ๊ธฐ์์๋ ์ค๋ฅ์ ๊ฒฝ์ฐ 404
๋๊ตฐ๊ฐ ๋ค์ด์ด๊ทธ๋จ๊ณผ ๋ฌธ์์ ํ ์คํธ๋ฅผ ์ฃผ์ ๊น๊ฒ ์ฐ๊ตฌํ๋ค๋ฉด ๊ฑฐ๊ธฐ์ MAC์ด ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ AES๋ ๋ค๋ฅธ ๊ณณ์์๋ ์ฌ์ฉ๋์ง ์๋ ์ผ๋ถ IGE ๋ชจ๋์์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฌผ๋ก ๊ทธ๋ค์ FAQ์ ๊ทธ๊ฒ์ ๋ํด ์๋๋ค... ์ฌ๊ธฐ์์ ๋ฉ์์ง ํค ์์ฒด๋ ๋์์ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํด๋ ๋ ๋ฐ์ดํฐ์ SHA ํด์์ด๋ฉฐ ๋ถ์ผ์น์ ๊ฒฝ์ฐ์ ๋ํ ๋ฌธ์์ ๋๋ค. ์ด๋ค ์ด์ ๋ก ์กฐ์ฉํ ๋ฌด์ํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค (ํ์ง๋ง ๋ณด์์ ์ด๋ป์ต๋๊น? ๊ฐ์๊ธฐ ์ฐ๋ฆฌ๋ฅผ ๊นจ๋จ๋ฆด๊น์?).
๋๋ ์ํธ ์์ฑ์๊ฐ ์๋๋๋ค. ์๋ง๋ ์ด ๋ชจ๋์์๋ ์ด๋ก ์ ๊ด์ ์์ ์๋ชป๋ ๊ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ Telegram Desktop์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ง์ ์ธ ๋ฌธ์ ๋ฅผ ๋ถ๋ช
ํ ๋งํ ์ ์์ต๋๋ค. MTProto(์ด ๊ฒฝ์ฐ์๋ง ๋ฒ์ 877)์ ๋ฉ์์ง์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ก์ปฌ ์บ์(์ด ๋ชจ๋ D783F5D3D8EF1.0C)๋ฅผ ์ํธํํฉ๋๋ค. ๋จผ์ ๋ฉ์์ง ํค, ๊ทธ ๋ค์ ๋ฐ์ดํฐ ์์ฒด(๊ทธ๋ฆฌ๊ณ ์ฃผ์ ํฐ auth_key
256๋ฐ์ดํธ(์์ผ๋ฉด msg_key
์ธ๋ชจ ์๋). ๋ฐ๋ผ์ ๋์ฉ๋ ํ์ผ์์ ๋ฌธ์ ๊ฐ ๋์ ๋๊ฒ ๋ฉ๋๋ค. ์ฆ, ์ํธํ ๋ฐ ํด๋
๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ ์ฌ๋ณธ์ ๋ณด๊ดํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฅผ ๋ค์ด ๋ฉ๊ฐ๋ฐ์ดํธ ๋๋ ์คํธ๋ฆฌ๋ฐ ๋น๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ? .. ์ํธ๋ฌธ ๋ค์ MAC์ด ์๋ ํด๋์ ์ฒด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํธ๋ฆฌ๋ฐ์ ์ฝ๊ณ ์ฆ์ ์ ์กํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ MTProto๋ฅผ ์ฌ์ฉํ๋ฉด ์ฒ์์๋ ์ ์ฒด ๋ฉ์์ง๋ฅผ ์ํธํํ๊ฑฐ๋ ํด๋
ํ ๋ค์ ๋คํธ์ํฌ๋ ๋์คํฌ๋ก ์ ์กํ์ญ์์ค. ๋ฐ๋ผ์ Telegram Desktop์ ์ต์ ๋ฒ์ ์์ ์บ์์ ์๋ user_data
CTR ๋ชจ๋์์ AES์ ํจ๊ป ๋ค๋ฅธ ํ์์ด ์ด๋ฏธ ์ฌ์ฉ๋์์ต๋๋ค.
Vasily, [21.06.18/01/27 20:XNUMX AM] ์ค, IGE๊ฐ ๋ฌด์์ธ์ง ์๊ฒ ๋์์ต๋๋ค. IGE๋ ์๋ Kerberos๋ฅผ ์ํ "์ธ์ฆ ์ํธํ ๋ชจ๋"์ ์ฒซ ๋ฒ์งธ ์๋์์ต๋๋ค. ์คํจํ ์๋(๋ฌด๊ฒฐ์ฑ ๋ณดํธ๋ฅผ ์ ๊ณตํ์ง ์์)์ด๋ฏ๋ก ์ ๊ฑฐํด์ผ ํ์ต๋๋ค. ๊ทธ๊ฒ์ ์๋ํ๋ ์ธ์ฆ ์ํธํ ๋ชจ๋์ ๋ํ XNUMX๋ ํ๊ตฌ์ ์์์ด์๊ณ , ์ต๊ทผ์๋ OCB ๋ฐ GCM๊ณผ ๊ฐ์ ๋ชจ๋์์ ์ ์ ์ ๋ฌํ์ต๋๋ค.
์ด์ ์นดํธ ์ธก์ ์ธ์:
Nikolai Durov๊ฐ ์ด๋๋ Telegram ํ์ XNUMX๋ช ์ ACM ์ฑํผ์ธ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ๊ทธ ์ค ์ ๋ฐ์ ์ํ ๋ฐ์ฌ์ ๋๋ค. MTProto์ ํ์ฌ ๋ฒ์ ์ ์ถ์ํ๋ ๋ฐ ์ฝ XNUMX๋ ์ด ๊ฑธ๋ ธ์ต๋๋ค.
๋ญ๊ฐ ์๊ฒจ. ํ์ ๋ ๋ฒจ๊น์ง XNUMX๋
์๋๋ฉด ๊ทธ๋ฅ tls๋ฅผ ๊ฐ์ ธ๊ฐ ์๋ ์์ต๋๋ค.
์ข์, ์ฐ๋ฆฌ๊ฐ ์ํธํ ๋ฐ ๊ธฐํ ๋์์ค๋ฅผ ์ํํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ๋ง์นจ๋ด TL ์ง๋ ฌํ๋ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ์ญ์ง๋ ฌํํ ์ ์์ต๋๊น? ๊ทธ๋ผ ๋ฌด์์, ์ด๋ป๊ฒ ๋ณด๋ด์ผ ํ ๊น์? ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Vasily, [25.06.18/18/46 XNUMX:XNUMX PM] ์ฐ๊ฒฐ์ ์ด๊ธฐํํ๊ณ ์ฌ์ฉ์์ ์ฅ์น ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
app_id, device_model, system_version, app_version ๋ฐ lang_code๋ฅผ ํ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ผ๋ถ ์ฟผ๋ฆฌ
์ธ์ ๋์ฒ๋ผ ๋ฌธ์. ์คํ ์์ค๋ฅผ ์์ ๋กญ๊ฒ ๊ณต๋ถํ์ญ์์ค.
invokeWithLayer๋ก ๋ชจ๋ ๊ฒ์ด ๋๋ต์ ์ผ๋ก ๋ช ํํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋ฌด์์ ๋๊น? ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ์๋ฒ์ ์์ฒญํ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณด๋ด๋ ค๋ ์์ฒญ์ด ์์ต๋๋ค.
Vasily, [25.06.18/19/13 XNUMX:XNUMX] ์ฝ๋๋ก ํ๋จํ๋ฉด ์ฒซ ๋ฒ์งธ ํธ์ถ์ ์ด ๊ฐ๋น์ง๋ก ๋ํ๋๊ณ ๊ฐ๋น์ง ์์ฒด๋ invokewithlayer์ ์์ต๋๋ค.
initConnection์ด ๋ณ๋์ ํธ์ถ์ผ ์ ์๊ณ ๋ํผ์ฌ์ผ ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์, ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ธฐ๋ณธ ํค์ ๊ฐ์ด ํ ๋ฒ์ด ์๋๋ผ ๊ฐ ์ธ์
์ด ์์๋ ๋๋ง๋ค ์ํํด์ผ ํฉ๋๋ค. ํ์ง๋ง! ๊ถํ์ด ์๋ ์ฌ์ฉ์๊ฐ ํธ์ถํ ์ ์์ต๋๋ค! ์ ์ฉํ ์ ์๋ ๋จ๊ณ์ ์ด๋ฅด๋ ์ต๋๋ค.
์ธ์ฆ๋์ง ์์ ์ฌ์ฉ์๋ API ๋ฉ์๋์ ์ผ๋ถ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ธ์ฆ.์ ์ก์ฝ๋
- ์ธ์ฆ.์ฌ์ ์ก์ฝ๋
- account.getPassword
- auth.checkPassword
- au.check์ ํ
- ์ธ์ฆ.๊ฐ์
- ์ธ์ฆ.๋ก๊ทธ์ธ
- auth.import๊ถํ ๋ถ์ฌ
- help.getConfig
- help.getNearestDc
- help.getAppUpdate
- help.getCdnConfig
- langpack.getLangPack
- langpack.getStrings
- langpack.getDifference
- langpack.getLanguages
- langpack.getLanguage
๊ทธ ์ค ๊ฐ์ฅ ๋จผ์ auth.sendCode
, api_id ๋ฐ api_hash๋ฅผ ๋ณด๋ด๊ณ ๊ทธ ํ์ ์ฝ๋๊ฐ ํฌํจ๋ SMS๋ฅผ ๋ฐ๋ ์์คํ ์ฒซ ๋ฒ์งธ ์์ฒญ์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ชป๋ DC์ ๋๋ฌํ๋ฉด(์๋ฅผ ๋ค์ด ์ด ๊ตญ๊ฐ์ ์ ํ ๋ฒํธ๋ ๋ค๋ฅธ ๊ตญ๊ฐ์์ ์ ๊ณต๋จ) ์ํ๋ DC ๋ฒํธ์ ํจ๊ป ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. DC ๋ฒํธ๋ก ์ฐ๊ฒฐํด์ผ ํ๋ IP ์ฃผ์๋ฅผ ์ฐพ์ผ๋ ค๋ฉด help.getConfig
. ํ๋๋ 5๊ฐ๋ง ์ถํ๋์ง๋ง 2018๋
์ ๋ช
ํ์ฌ ์ดํ ํฌ๊ฒ ๋์๋ค.
์ด์ ์ต๋ช ์๋ฒ์์ ์ด ๋จ๊ณ์ ๋๋ฌํ์์ ๊ธฐ์ตํฉ์๋ค. IP ์ฃผ์๋ง ๋ฐ๊ธฐ์๋ ๋๋ฌด ๋น์ธ์ง ์๋์? MTProto์ ์ํธํ๋์ง ์์ ๋ถ๋ถ์์ ์ด ์์ ๊ณผ ๋ค๋ฅธ ์์ ์ ์ํํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? โ๊ฐ์ง ์ฃผ์๋ก ์๋ตํ๋ ๊ฒ์ด RKN์ด ์๋๋ผ๋ ๊ฒ์ ์ด๋ป๊ฒ ํ์ ํ ์ ์์ต๋๊น?โ๋ผ๋ ๋ฐ๋ ์๊ฒฌ์ด ๋ค๋ฆฝ๋๋ค. ์ด๊ฒ์ ๋ํด ์ฐ๋ฆฌ๋ ์ฌ์ค ๊ณต์ ๊ณ ๊ฐ์์ ์๋ฒ ๋๋ RSA ํค, ์ฆ. ๋น์ ์ ๊ทธ๋ฅ ํ ์ ์์ต๋๋ค ์งํ ์ด ์ ๋ณด. ์ค์ ๋ก ์ด๊ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฅธ ์ฑ๋์ ํตํด ๋ฐ๋ ์ ๊ธ ์ฐํ์ ๋ํ ์ ๋ณด์ ๋ํด ์ด๋ฏธ ์ํ๋์์ต๋๋ค(์ฌ์ ํ ์ฐ๊ฒฐํ ์์น๋ฅผ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ MTProto ์์ฒด์์ ์ํํ ์ ์๋ค๋ ๊ฒ์ด ๋ ผ๋ฆฌ์ ์ ๋๋ค).
์ข์์. ์ด ํด๋ผ์ด์ธํธ ์ธ์ฆ ๋จ๊ณ์์๋ ์์ง ์ธ์ฆ๋์ง ์์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ์ง ์์์ต๋๋ค. ์ง๊ธ์ ๊ถํ์ด ์๋ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋ฒ๊ฐ ์๋ตํ๋ ๊ฒ์ ํ์ธํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐโฆ
๋ฐ์ค๋ฆฌ, [10.07.18 14:45]
https://core.telegram.org/method/help.getConfig config#7dae33e0 [...] = Config; help.getConfig#c4f9186b = Config;
https://core.telegram.org/api/datacenter config#232d5905 [...] = Config; help.getConfig#c4f9186b = Config;
๊ณํ์์ ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ๊ฐ ์จ๋ค
tdesktop ์คํค๋ง์์ ์ธ ๋ฒ์งธ ๊ฐ์
์, ๋ฌผ๋ก ๊ทธ ์ดํ๋ก ๋ฌธ์๊ฐ ์ ๋ฐ์ดํธ๋์์ต๋๋ค. ๊ณง ๋ค์ ๊ด๋ จ์ด ์๊ฒ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ณด ๊ฐ๋ฐ์๋ ์ด๋ป๊ฒ ์์์ผ ํฉ๋๊น? ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฑ๋กํ๋ฉด ์๋ ค์ค๊น์? Vasily๋ ์ด๊ฒ์ํ์ง๋ง ์์ฝ๊ฒ๋ ๊ทธ์๊ฒ ์๋ฌด๊ฒ๋ ๋ณด๋ด์ง ์์์ต๋๋ค (๋ค์ ๋งํ์ง๋ง ๋ ๋ฒ์งธ ๋ถ๋ถ์์ ์ด์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค).
... ๋น์ ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์ด๋ป๊ฒ ๋ API๋ก ์ด๋ํ์์ ์์์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ก ์ด๋ํ์ฌ MTProto ํ ๋ง์์ ๋ญ๊ฐ๋ฅผ ๋์ณค์ต๋๊น? ๋๋ผ์ด ๊ฒ์ ์์ต๋๋ค:
Vasily, [28.06.18/02/04 2:XNUMX AM] ์, ๊ทธ๋ค์ eXNUMXe์ ์ผ๋ถ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ง๊ณ ์์ต๋๋ค.
Mtproto๋ ๋ ๋๋ฉ์ธ ๋ชจ๋์ ๋ํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ ๋ฐ ํค์ ์ฝ๊ฐ์ ๋ํผ ๊ตฌ์กฐ๋ฅผ ์ ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๋ค์ ์๋ก ๋ค๋ฅธ ์คํ ์์ค์ ์ง์์ ์ผ๋ก ํผํฉํ๋ฏ๋ก mtproto๊ฐ ์ด๋์์ ๋๋๊ณ ๋ค์ ์์ค์ด ์์๋์๋์ง ํญ์ ๋ช ํํ์ง ์์ต๋๋ค.
๊ทธ๋ค์ ์ด๋ป๊ฒ ํผํฉ๋์ด ์์ต๋๊น? ๊ธ์, ์๋ฅผ ๋ค์ด PFS์ ๋ํ ๋์ผํ ์์ ํค๊ฐ ์์ต๋๋ค (๊ทธ๋ฐ๋ฐ Telegram Desktop์ ์ํ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ
๋๋ค). API ์์ฒญ์ ์ํด ์คํ๋ฉ๋๋ค. auth.bindTempAuthKey
, ์ฆ. ์ต์์ ์์ค์์. ๊ทธ๋ฌ๋ ๋์์ ๋ฎ์ ์์ค์ ์ํธํ๋ฅผ ๋ฐฉํดํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ดํ์ ๋ค์ ์ํํด์ผ ํฉ๋๋ค. initConnection
๋ฑ๋ฑ ์ด๊ฑด ์๋๋ค ๋ง ์ ์์ ์ธ ์์ฒญ. ์ด์๋ ๋ณ๋๋ก DC์ ํ๋์ ์์ ํค๋ง ๊ฐ์ง ์ ์์์ ์ ๋ฌํฉ๋๋ค. auth_key_id
๊ฐ ๋ฉ์์ง์์ ์ ์ด๋ ๋ชจ๋ ๋ฉ์์ง์ ํค๋ฅผ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ์๋ฒ๋ ์ธ์ ๋ ์ง ์์ ํค๋ฅผ "์์ด๋ฒ๋ฆด" ๊ถ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ฏธ๋์ ์ํธ ์ธํธ์ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ ํค๋ฅผ ๊ฐ์ง ์๋ ์์ง๋ง ?..
MTProto ํ ๋ง์์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ฌํญ์ด ์์ต๋๋ค.
๋ฉ์์ง ๋ฉ์์ง, msg_id, msg_seqno, ์น์ธ, ์๋ชป๋ ๋ฐฉํฅ์ ํ ๋ฐ ๊ธฐํ ํน์ด์ฑ
๊ทธ๋ค์ ๋ํด ์์์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํ ์์ค ๋ ๋์ "๋์ค"์ด๊ธฐ ๋๋ฌธ์ API๋ก ์์ ํ ๋ ์ด์ ๋ํด ์์์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ msg_key์ ๊ด์ฌ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ํ์ ์์ค์ด ์ฐ๋ฆฌ๋ฅผ ์ํด ๋ชจ๋ ๊ฒ์ ํด๋ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํด๋ ๋ ๋ฐ์ดํฐ ๋ด๋ถ์๋ ๋ค์๊ณผ ๊ฐ์ ํ๋๊ฐ ์์ต๋๋ค(ํจ๋ฉ ์์น๋ฅผ ์๊ธฐ ์ํ ๋ฐ์ดํฐ ๊ธธ์ด๋ ์์ง๋ง ์ค์ํ์ง ์์).
- ์๊ธ int64
- session_id - int64
- message_id - int64
- seq_no-int32
์๊ธ์ ์ ์ฒด DC์ ๋ํด ํ๋๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์ ๊ทธ๊ฒ์ ๋ํด ์๊ณ ์์ต๋๊น? ์์ฒญ์ด ์์ ๋ฟ๋ง ์๋๋ผ get_future_salts
, ์ด๋ค ๊ฐ๊ฒฉ์ด ์ ํจํ์ง ์๋ ค์ฃผ์ง๋ง ์๊ธ์ด "์ฉ์" ๊ฒฝ์ฐ ๋ฉ์์ง(์์ฒญ)๊ฐ ๋จ์ํ ์์ค๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋ฒ๋ ๋ฌผ๋ก ์๋ก์ด ์ํธ๋ฅผ ๋ฐํํ์ฌ ๋ณด๊ณ ํ ๊ฒ์
๋๋ค. new_session_created
-ํ์ง๋ง ์ด์ ๋ฒ์ ์์๋ ์๋ฅผ ๋ค์ด ์ด๋ป๊ฒ ๋ ๋ค์ ๋ณด๋ด์ผํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ง๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํคํ
์ฒ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์๋ฒ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์ธ์
์ ์์ ํ ์ญ์ ํ๊ณ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๋ตํ ์ ์์ต๋๋ค. ์ค์ ๋ก ํด๋ผ์ด์ธํธ ์ธก์์ MTProto ์ธ์
์ด๋ ๋ฌด์์
๋๊น? ์ด๊ฒ์ ๋ ๊ฐ์ ์ซ์์
๋๋ค. session_id
ะธ seq_no
์ด ์ธ์
๋ด์ ๋ฉ์์ง. ๋ฌผ๋ก ๊ธฐ๋ณธ TCP ์ฐ๊ฒฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ์ด ๋๊ฒผ๋ค๊ฐ ๋ค์ ์ฐ๊ฒฐ๋๋ ๋ฑ ๋ง์ ์์
์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ ํ ๋ชจ๋ฅธ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ด ๋น ๋ฅด๊ฒ ๋ฐ์ํ๋ฉด ์ด์ ์ธ์
์ด ์ TCP ์ฐ๊ฒฐ์์ ๊ณ์๋๋ฉด ์ฆ๊ฐ seq_no
๋ ๋์๊ฐ. ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์๋ฒ์์ ์ญ์ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์๋ธ ๋ฐ์ ๊ฐ์ด ์๋ฒ ์ธก์์๋ ๋๊ธฐ์ด์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฌด์์ด ๋์ด์ผ ํ๋๊ฐ seq_no
? ์ค, ๊น๋ค๋ก์ด ์ง๋ฌธ์
๋๋ค. ๋ฌด์จ ๋ป์ธ์ง ์ ์งํ๊ฒ ์ดํดํ๋ ค๊ณ ๋
ธ๋ ฅํ์ญ์์ค.
์ฝํ ์ธ ๊ด๋ จ ๋ฉ์์ง
๋ช ์์ ์ธ ํ์ธ์ด ํ์ํ ๋ฉ์์ง์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋ชจ๋ ์ฌ์ฉ์ ๋ฐ ๋ง์ ์๋น์ค ๋ฉ์์ง๊ฐ ํฌํจ๋๋ฉฐ ์ปจํ ์ด๋ ๋ฐ ์น์ธ์ ์ ์ธํ ๊ฑฐ์ ๋ชจ๋ ๋ฉ์์ง๊ฐ ํฌํจ๋ฉ๋๋ค.
๋ฉ์์ง ์ํ์ค ๋ฒํธ(msg_seqno)
์ด ๋ฉ์์ง ์ด์ ์ ๋ฐ์ ์๊ฐ ์์ฑํ "์ฝํ ์ธ ๊ด๋ จ" ๋ฉ์์ง(ํ์ธ์ด ํ์ํ ๋ฉ์์ง, ํนํ ์ปจํ ์ด๋๊ฐ ์๋ ๋ฉ์์ง) ์์ ๋ ๋ฐฐ์ ํด๋นํ๋ 32๋นํธ ์ซ์์ด๋ฉฐ ์ดํ์ ํ์ฌ ๋ฉ์์ง๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ XNUMX์ฉ ์ฆ๊ฐํฉ๋๋ค. ์ฝํ ์ธ ๊ด๋ จ ๋ฉ์์ง. ์ปจํ ์ด๋๋ ํญ์ ์ ์ฒด ๋ด์ฉ ๋ค์์ ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ํ์ค ๋ฒํธ๋ ํฌํจ๋ ๋ฉ์์ง์ ์ํ์ค ๋ฒํธ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ต๋๋ค.
1์ฆ๊ฐํ๊ณ ๋ 2์ฆ๊ฐํ๋ ์ด๊ฒ ๋ฌด์จ ์์ปค์ค์ผ?.. ์๋ ์๋ฏธ๋ "ACK๋ ๋ก์ฐ๋นํธ, ๋๋จธ์ง๋ ์ซ์"๋ผ๊ณ ์๊ฐํ๋๋ฐ, ๊ฒฐ๊ณผ๊ฐ ์์ฃผ ์ณ์ง ์๋ค - ํนํ, ๋ณด๋ผ ์ ์๋ค๊ณ ํฉ๋๋ค ์ฌ๋ฌ ๋์ผํ๋ค๋ ํ์ธ seq_no
! ์ด๋ป๊ฒ? ์๋ฅผ ๋ค์ด, ์๋ฒ๋ ์ฐ๋ฆฌ์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณด๋ด๊ณ ๋ณด๋ด๊ณ ์ฐ๋ฆฌ๋ ์นจ๋ฌตํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ์ ๋ฉ์์ง ์์ ์ ๋ํ ์๋น์ค ํ์ธ ๋ฉ์์ง๋ก๋ง ๋๋ตํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฐ์ ํ์ธ์ ๋์ผํ ๋ฐ์ ๋ฒํธ๋ฅผ ๊ฐ์ต๋๋ค. TCP์ ์ต์ํ๊ณ ์ด์ํ๊ฒ ๋ค๋ฆฐ๋ค๊ณ ์๊ฐํ๋ค๋ฉด TCP์์๋ seq_no
๋ณ๊ฒฝ๋์ง ์๊ณ ํ์ธ์ด seq_no
๋ค๋ฅธ ์ชฝ-์๋๋ฌ ํ๋ฅผ๋
๋๋ค. MTProto์ ํ์ธ์ด ์ค๊ณ ์์ต๋๋ค. NOT ์ seq_no
, TCP์์์ ๊ฐ์ง๋ง msg_id
!
์ด๊ฒ ๋ญ๊ฐ์ msg_id
, ์ด ๋ถ์ผ์ ๊ฐ์ฅ ์ค์ํ? ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ๋ฉ์์ง์ ๊ณ ์ ID์
๋๋ค. ์ด๊ฒ์ 64๋นํธ ์ซ์๋ก ์ ์๋๋ฉฐ, ์ตํ์ ๋นํธ๋ ๋ค์ ์๋ฒ๊ฐ ์๋ ์๋ฒ ๋ง๋ฒ์ ๊ฐ์ง๋ฉฐ ๋๋จธ์ง๋ ์์ ๋ถ๋ถ์ ํฌํจํ์ฌ ์ผ์ชฝ์ผ๋ก 32๋นํธ ์ด๋๋ Unix ํ์์คํฌํ์
๋๋ค. ์ ๊ฒ๋ค. ํ์์คํฌํ ์์ฒด(์๊ฐ์ด ๋๋ฌด ๋ค๋ฅธ ๋ฉ์์ง๋ ์๋ฒ์์ ๊ฑฐ๋ถ๋จ). ์ด๊ฒ์ผ๋ก๋ถํฐ ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ํด๋ผ์ด์ธํธ์ ๋ํด ์ ์ญ์ ์ธ ์๋ณ์๋ผ๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค. ๋์ - ๊ธฐ์ต session_id
- ์ฐ๋ฆฌ๋ ๋ค์์ ๋ณด์ฅํฉ๋๋ค: ์ด๋ค ๊ฒฝ์ฐ์๋ ํ ์ธ์
์ ์ํ ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ ์ธ์
์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.. ์ฆ, ์ด๋ฏธ ์์์ด ๋ฐํ์ก์ต๋๋ค. ์ธ ๋ ๋ฒจ โ ์ธ์
, ์ธ์
๋ฒํธ, ๋ฉ์์ง ID. ์ ๊ทธ๋ ๊ฒ ๋ณต์กํ์ง, ์ด ๋ฏธ์คํฐ๋ฆฌ๋ ๋งค์ฐ ํฝ๋๋ค.
๋ฐ๋ผ์, msg_id
ํ์ํโฆ
RPC: ์์ฒญ, ์๋ต, ์ค๋ฅ. ํ์ธ.
์๋ค์ํผ ์คํค๋ง์ ์ด๋ ๊ณณ์๋ "RPC ์์ฒญ ๋ง๋ค๊ธฐ"๋ผ๋ ํน์ํ ์ ํ์ด๋ ํจ์๋ ์์ง๋ง ์๋ต์ ์์ต๋๋ค. ๊ฒฐ๊ตญ ์ฝํ
์ธ ๊ด๋ จ ๋ฉ์์ง๊ฐ ์์ต๋๋ค! ๊ทธ๊ฑด, ์ด๋ค ๋ฉ์์ง๋ ์์ฒญ์ด ๋ ์ ์์ต๋๋ค! ๊ทธ๋ ์ง ์์ผ๋ฉด. ๊ฒฐ๊ตญ, ๊ฐ ์ด msg_id
. ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult;
์ด๊ฒ์ด ์ด๋ค ๋ฉ์์ง์ ๋ํ ์๋ต์ธ์ง ํ์๋๋ ๊ณณ์
๋๋ค. ๋ฐ๋ผ์ API์ ์ต์์ ์์ค์์ ๊ทํ์ ์์ฒญ์ด ๋ช ๋ฒ์ธ์ง ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ์์
์ด ๋น๋๊ธฐ์์ด๋ฉฐ ๋์์ ์ฌ๋ฌ ์์ฒญ์ด ์์ ์ ์๋ค๋ ๊ฒ์ ์ค๋ช
ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ค ์์๋ก๋ ๋ฐํํ ์ ์์ต๋๊น? ์์น์ ์ผ๋ก ์ด๊ฒ๊ณผ ์์
์ ์์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฉ์์ง์์ ์ด ์ํคํ
์ฒ์ ์ด๋ฉด์ ์๋ ์ํคํ
์ฒ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์์ TCP ์ฐ๊ฒฐ์ ์ ์งํ๋ ์๋ฒ๋ ํ๋ฐํธ ์๋ ๋ฐธ๋ฐ์์ด๋ฉฐ ์์ฒญ์ ๋ฐฑ์๋๋ก ๋ณด๋ด๊ณ ๋ค์ ์์งํฉ๋๋ค. message_id
. ์ฌ๊ธฐ์์๋ ๋ชจ๋ ๊ฒ์ด ๋ช
ํํ๊ณ ๋
ผ๋ฆฌ์ ์ด๋ฉฐ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค?.. ๊ทธ๋ฆฌ๊ณ ์๊ฐํด๋ณด๋ฉด? ๊ฒฐ๊ตญ RPC ์๋ต ์์ฒด์๋ ํ๋๊ฐ ์์ต๋๋ค. msg_id
! ์ฐ๋ฆฌ๋ ์๋ฒ์์ "๋น์ ์ ๋ด ๋๋ต์ ์๋ตํ์ง ์์ต๋๋ค!"๋ผ๊ณ ์๋ฆฌ์ณ์ผ ํฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ์, ํ์ธ์ ๋ํด ๋ฌด์์ด ์์์ต๋๊น? ํ์ด์ง ์ ๋ณด
msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;
๊ทธ๋ฆฌ๊ณ ์์ชฝ์ด ๊ทธ๋ ๊ฒ ํด์ผ ํฉ๋๋ค. ํ์ง๋ง ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋๋ค! RpcResult๋ฅผ ๋ฐ์ผ๋ฉด ์์ฒด์ ์ผ๋ก ์น์ธ ์ญํ ์ ํฉ๋๋ค. ์ฆ, ์๋ฒ๋ MsgsAck๋ก ์์ฒญ์ ์๋ตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด "๋ฐ์์ต๋๋ค." RpcResult์ ์ฆ์ ์๋ตํ ์ ์์ต๋๋ค. ๋ ๋ค์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค, ์ฌ์ ํ ๋๋ตํด์ผ ํฉ๋๋ค! ํ์ธ. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฒ์์ ๋ฐฐ๋ฌ๋์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ๋ค์ ๋ฒ๋ฆฝ๋๋ค. ์ฌ์ ์ ํ์๋. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ฌผ๋ก ์๊ฐ ์ด๊ณผ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค. ์ ์ ํ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋์ ์ฟผ๋ฆฌ ์คํ์์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
rpc_error#2144ca19 error_code:int error_message:string = RpcError;
์ค, ๋๊ตฐ๊ฐ ์ธ์น ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์ ๋ ์ธ๊ฐ์ ์ธ ํ์์ด ์์ต๋๋ค. ์ค์ด ์์ต๋๋ค! ์ฒ์ฒํํ์ธ์. ์ฌ๊ธฐ FLOOD_WAIT_3600
XNUMX์๊ฐ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๋ ๋ป์ด๊ณ , PHONE_MIGRATE_5
์ด ํ๋ฆฌํฝ์ค๊ฐ ์๋ ์ ํ๋ฒํธ๋ 5๋ฒ์งธ DC์ ๋ฑ๋ก๋์ด์ผ ํฉ๋๋ค. ํ์
์ธ์ด๊ฐ ์์ฃ ? ๋ฌธ์์ด์์ ์ธ์๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ ๊ท์์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ค์ ๋งํ์ง๋ง ์ด๊ฒ์ ์๋น์ค ๋ฉ์์ง ํ์ด์ง์ ์์ง๋ง ์ด ํ๋ก์ ํธ์์ ์ด๋ฏธ ๊ด๋ก์ ์ผ๋ก ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ฌธ์ ํ์ด์ง์์. ๋๋ ์์ฌ์ ๋ถ๋ฌ์ผ์ผํค๋ค. ๋จผ์ , ํ์ดํ/๋ ์ด์ด ์๋ฐ - RpcError
์ ํฌ์ํ ์ ์๋ค RpcResult
. ๋ฐ์์ ์ ์๋ผ? ์ฐ๋ฆฌ๋ ๋ฌด์์ ๊ณ ๋ คํ์ง ์์์ต๋๊น?.. ๋ฐ๋ผ์ ๋ณด์ฅ์ ์ด๋์ ์์ต๋๊น? RpcError
์ ํฌ์ํ์ง ์์ ์ ์์ต๋๋ค RpcResult
, ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ ํ์ ์ง์ ๋๋ ์ค์ฒฉ๋์ด ์์ต๋๊น? ๋ถ์กฑํ๋ค req_msg_id
? ..
๊ทธ๋ฌ๋ ์๋น์ค ๋ฉ์์ง์ ๋ํด ๊ณ์ํฉ์๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ์ค๋ซ๋์ ์๊ฐํ๊ณ ์๋ค๊ณ ์๊ฐํ๊ณ ๋ฉ์ง ์์ฒญ์ ํ ์ ์์ต๋๋ค.
rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;
์ธ ๊ฐ์ง ๋๋ต์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ค์ ํ์ธ ๋ฉ์ปค๋์ฆ๊ณผ ๊ต์ฐจํ์ฌ ๋ฌด์์ด ๋์ด์ผ ํ๋์ง(๋ฐ ์ผ๋ฐ์ ์ผ๋ก ํ์ธ์ด ํ์ํ์ง ์์ ์ ํ์ ๋ชฉ๋ก์ ๋ฌด์์ธ์ง) ์ดํดํ๋ ค๊ณ ์๋ํ๋ฉด ๋ ์๋ ์์ ๋ก ๋จ์ต๋๋ค(์ฐธ๊ณ : Telegram Desktop ์์ค์ ์ ๋ณด๊ฐ ์์ ํ์ง ์์).
์ค๋
: ๋ฉ์์ง ๊ฒ์๋ฌผ ์ํ
์ผ๋ฐ์ ์ผ๋ก TL, MTProto ๋ฐ Telegram์ ๋ง์ ๊ณณ์ ์ผ๋ฐ์ ์ผ๋ก ์๊ณ ํ ๋๋์ ๋จ๊ธฐ์ง ๋ง ๊ณต์ํจ, ์ฌ์น ๋ฐ ๊ธฐํ ์ํํธ ์คํฌ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์ ์คํ๊ฒ ์นจ๋ฌต์ ์ง์ผฐ๊ณ ๋ํ์ ์๋๋ฌผ์ ๊ฒ์ด๋์์ต๋๋ค. ๊ทธ๋ฌ๋, ์ด ์ฅ์ะํ์ด์ง์ ๋๋ถ๋ถ
ํ์ธ๊ณผ ํจ๊ป ๋ฌดํดํ๊ฒ ์์๋ฉ๋๋ค. ๋ค์์ผ๋ก ์ฐ๋ฆฌ๋
bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification;
bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification;
์, MTProto๋ก ์์ ์ ์์ํ๋ ๋ชจ๋ ์ฌ๋์ "์์ - ์ฌ์ปดํ์ผ - ์์" ์ฃผ๊ธฐ์์ ์์ ์ค์ ์ฉ์ ์ซ์ ์ค๋ฅ ๋๋ ์ํธ๋ฅผ ์ป๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค.
- ์๋ณธ ๋ฉ์์ง๊ฐ ์์ค๋ฉ๋๋ค. ์ผ๋ถ ๋๊ธฐ์ด์ ์ฐจ๋จํด์ผ ํฉ๋๋ค. ๋์ค์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
- ๊ทธ ์ด์ํ ์ค๋ฅ ๋ฒํธ๋ ๋ฌด์์ ๋๊น? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64โฆ ๋๋จธ์ง ์ซ์๋ ์ด๋์ ์์ต๋๊น, ํ ๋ฏธ?
์ค๋ช ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ช ์๋์ด ์์ต๋๋ค.
์๋๋ error_code ๊ฐ์ด ๊ทธ๋ฃนํ๋๋ ๊ฒ์ ๋๋ค(error_code >> 4). ์๋ฅผ ๋ค์ด ์ฝ๋ 0x40 - 0x4f๋ ์ปจํ ์ด๋ ๋ถํด์ ์ค๋ฅ์ ํด๋นํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฒซ ๋ฒ์งธ๋ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก์ ์ด๋์ด๊ณ ๋ ๋ฒ์งธ๋ ๋๋จธ์ง ์ฝ๋๊ฐ ์ด๋์ ์๋์ง๋ ์ค์ํ์ง ์์ต๋๊น? ์๊ฐ์ ๋จธ๋ฆฌ ์์?.. ๊ทธ๋ฌ๋ ์ด๊ฒ๋ค์ ์ฌ์ํ ์ผ์ ๋๋ค.
์ค๋ ์ ๊ฒ์๋ฌผ ์ํ ๋ฉ์์ง์ ๊ฒ์๋ฌผ ์ฌ๋ณธ์์ ์์๋ฉ๋๋ค.
- ๋ฉ์์ง ์ํ ์ ๋ณด ์์ฒญ
ํ ๋น์ฌ์๊ฐ ํ๋์ ๋ฐ์ ๋ฉ์์ง ์ํ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์ง ๋ชปํ ๊ฒฝ์ฐ ์๋๋ฐฉ์๊ฒ ๋ช ์์ ์ผ๋ก ์์ฒญํ ์ ์์ต๋๋ค.
msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
- ๋ฉ์์ง ์ํ์ ๊ดํ ์ ๋ณด ๋ฉ์์ง
msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
์ฌ๊ธฐinfo
๋ค์ด์ค๋ msg_ids ๋ชฉ๋ก์ ๊ฐ ๋ฉ์์ง์ ๋ํด ์ ํํ XNUMX๋ฐ์ดํธ์ ๋ฉ์์ง ์ํ๋ฅผ ํฌํจํ๋ ๋ฌธ์์ด์ ๋๋ค.- 1 = ๋ฉ์์ง์ ๋ํด ์๋ ค์ง ๊ฒ์ด ์์(msg_id๊ฐ ๋๋ฌด ๋ฎ์, ์๋๋ฐฉ์ด ์์ด๋ฒ๋ ธ์ ์ ์์)
- 2 = ๋ฉ์์ง๊ฐ ์์ ๋์ง ์์(msg_id๋ ์ ์ฅ๋ ์๋ณ์ ๋ฒ์์ ์ํ์ง๋ง ์๋๋ฐฉ์ ํ์คํ ๊ทธ๋ฌํ ๋ฉ์์ง๋ฅผ ์์ ํ์ง ์์)
- 3 = ๋ฉ์์ง๊ฐ ์์ ๋์ง ์์(msg_id๊ฐ ๋๋ฌด ๋์ง๋ง ์๋๋ฐฉ์ด ์์ง ์์ ํ์ง ์์ ๊ฒ์ด ํ์คํจ)
- 4 = ๋ฉ์์ง ์์ ๋จ(์ด ์๋ต์ ๋์์ ์์ ํ์ธ์ด๊ธฐ๋ ํจ)
- +8 = ์ด๋ฏธ ํ์ธ๋ ๋ฉ์์ง
- +16 = ์น์ธ์ด ํ์ํ์ง ์์ ๋ฉ์์ง
- +32 = ์ฒ๋ฆฌ ์ค์ด๊ฑฐ๋ ์ฒ๋ฆฌ๊ฐ ์ด๋ฏธ ์๋ฃ๋ ๋ฉ์์ง์ ํฌํจ๋ RPC ์ฟผ๋ฆฌ
- +64 = ์ด๋ฏธ ์์ฑ๋ ๋ฉ์์ง์ ๋ํ ์ฝํ ์ธ ๊ด๋ จ ์๋ต
- +128 = ์๋๋ฐฉ์ด ๋ฉ์์ง๊ฐ ์ด๋ฏธ ์์ ๋์๋ค๋ ์ฌ์ค์ ์๊ณ ์์
์ด ์๋ต์๋ ์น์ธ์ด ํ์ํ์ง ์์ต๋๋ค. ๊ด๋ จ msgs_state_req ์์ฒด์ ๋ํ ์น์ธ์ ๋๋ค.
๊ฐ์๊ธฐ ์๋๋ฐฉ์๊ฒ ๋ณด๋ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ฉ์์ง๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฉ์์ง๋ฅผ ๋ค์ ๋ณด๋ผ ์ ์์ต๋๋ค. ์๋๋ฐฉ์ด ๋์์ ๋ ๊ฐ์ ๋ฉ์์ง ์ฌ๋ณธ์ ์์ ํ๋๋ผ๋ ์ค๋ณต ๋ฉ์์ง๋ ๋ฌด์๋ฉ๋๋ค. (๋๋ฌด ๋ง์ ์๊ฐ์ด ๊ฒฝ๊ณผํ์ฌ ์๋ msg_id๊ฐ ๋ ์ด์ ์ ํจํ์ง ์์ ๊ฒฝ์ฐ ๋ฉ์์ง๋ msg_copy๋ก ๋ํ๋ฉ๋๋ค.)
- ๋ฉ์์ง ํํฉ ์๋ฐ์ ์ ๋ฌ
๊ฐ ๋น์ฌ์๋ ์๋๋ฐฉ์ด ์ ์กํ ๋ฉ์์ง์ ์ํ๋ฅผ ์๋ฐ์ ์ผ๋ก ์๋๋ฐฉ์๊ฒ ์๋ฆด ์ ์์ต๋๋ค.
msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
- ํ๋์ ๋ฉ์์ง ์ํ์ ๋ํ ํ์ฅ๋ ์๋ฐ์ ํต์
...
msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo;
msg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo;
- ๋ฉ์์ง ์ฌ์ ์ก์ ๋ํ ๋ช
์์ ์์ฒญ
msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
์๊ฒฉ ๋น์ฌ์๋ ์์ฒญ๋ ๋ฉ์์ง๋ฅผ ๋ค์ ์ ์กํ์ฌ ์ฆ์ ์๋ต [...] - ๋ต๋ณ ์ฌ์ ์ก์ ๋ํ ๋ช
์์ ์์ฒญ
msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
์๊ฒฉ ๋น์ฌ์๋ ์ฆ์ ์ฌ์ ์กํ์ฌ ์๋ตํฉ๋๋ค. ๋ต๋ณ ์์ฒญ๋ ๋ฉ์์ง์ [โฆ] - ๋ฉ์์ง ์ฌ๋ณธ
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ ์ด์ ์ ํจํ์ง ์์ msg_id๊ฐ ์๋ ์ด์ ๋ฉ์์ง๋ฅผ ๋ค์ ๋ณด๋ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ณต์ฌ ์ปจํ ์ด๋์ ๋ํ๋ฉ๋๋ค.
msg_copy#e06046b2 orig_message:Message = MessageCopy;
์์ ๋๋ฉด ๋ฉ์์ง๋ ๋ํผ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ orig_message.msg_id ๋ฉ์์ง๊ฐ ์์ ๋ ๊ฒ์ด ํ์คํ ๊ฒฝ์ฐ ์ ๋ฉ์์ง๋ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค(๋์์ ํด๋น ๋ฉ์์ง์ orig_message.msg_id๊ฐ ํ์ธ๋จ). orig_message.msg_id์ ๊ฐ์ ์ปจํ ์ด๋์ msg_id๋ณด๋ค ์์์ผ ํฉ๋๋ค.
์ฌ์ค์ ๋ํด์๋ ์นจ๋ฌต์ ์งํต์๋ค. msgs_state_info
๋ค์, ๋ฏธ์์ฑ TL์ ๊ท๊ฐ ํ์ด๋์ต๋๋ค(์ฐ๋ฆฌ๋ ๋ฐ์ดํธ ๋ฒกํฐ๊ฐ ํ์ํ๊ณ enum์ ํ์ ๋ ๋นํธ์ ์ด์ ๋นํธ ํ๋๊ทธ์ ํ์ํ์ต๋๋ค). ์์ ์ ๋ค๋ฅธ ๊ฒ์
๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ด ์ค์ ๋ก ์คํ๋๋ ์ด์ ๋ฅผ ์ดํดํ๋ ์ฌ๋์ด ์์ต๋๊น? ์ค์ ํด๋ผ์ด์ธํธ์์ ํ์ํ๊ฐ์?.. ์ด๋ ค์์ด ์์ง๋ง ์ฌ๋์ด ๋๋ฒ๊น
์ ์ฐธ์ฌํ๊ณ ๋ํ์ ๋ชจ๋์์ ์๋ฒ์ ๋ฌด์์ ์ด๋ป๊ฒ ๋ฌผ์ด๋ณด๋ฉด ์ด๋ค ์ด์ ์ด ์๋์ง ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฒญ์ ์ฌ๊ธฐ์ ์ค๋ช
๋์ด ์์ต๋๋ค. ์๋ณต ์ฌํ.
๋ฐ๋ผ์ ๊ฐ ์ธก์ ๋ฉ์์ง๋ฅผ ์ํธํํ๊ณ ๋ณด๋ผ ๋ฟ๋ง ์๋๋ผ ๋ฉ์์ง์ ๋ํ ๋ฐ์ดํฐ, ๋ฉ์์ง์ ๋ํ ๋ต๋ณ ๋ฐ ์ ์ ์๋ ์๊ฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ค๋ช ์์๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์ด๋ฐ์ด๋ ์ค์ ์ ์ฉ ๊ฐ๋ฅ์ฑ์ด ์ค๋ช ๋์ด ์์ง ์์ต๋๋ค. ์ด๋ ํ ๋ฐฉ์์ผ๋ก. ๊ฐ์ฅ ๋๋ผ์ด ๊ฒ์ ์ค์ ๋ก ๊ณต์ ํด๋ผ์ด์ธํธ์ ์ฝ๋์์ ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ๋๋ค! ๋ถ๋ช ํ ๊ทธ๋ค์ ๊ณต๊ฐ ๋ฌธ์์ ํฌํจ๋์ง ์์ ๋ด์ฉ์ ๋ค์์ต๋๋ค. ์ฝ๋์์ ์ดํด ์ด์ , ๋ ์ด์ TL์ ๊ฒฝ์ฐ์ฒ๋ผ ๋จ์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ (๋น๊ต์ ์ผ๋ก) ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌ๋ ๋ถ๋ถ์ด ์๋๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ์ ์ฐ๊ฒฐ๋ ๋ถ๋ถ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์ดํดํ๋ ๋ฐ ํจ์ฌ ๋ ๋ง์ ์๊ฐ์ด ํ์ํฉ๋๋ค.
ํ๊ณผ ํ์ด๋ฐ. ๋๊ธฐ์ด.
๋ชจ๋ ๊ฒ์์ ์๋ฒ ์ํคํ ์ฒ(๋ฐฑ์๋ ๊ฐ ์์ฒญ ๋ฐฐํฌ)์ ๋ํ ์ถ์ธก์ ๊ธฐ์ตํ๋ฉด ๋ค์ ๋ํ ์ผ์ด ๋ค๋ฐ๋ฆ ๋๋ค. TCP์ ๋ชจ๋ ์ ๋ฌ ๋ณด์ฅ์๋ ๋ถ๊ตฌํ๊ณ (๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๊ฑฐ๋ ์ค๋จ๋์ง๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์๊ฐ๊น์ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋ฉ๋๋ค), MTProto ์์ฒด์์ ํ์ธ- ๋ณด์ฅ ์์. ์๋ฒ๋ ์ฝ๊ฒ ๋ฉ์์ง๋ฅผ ์๊ฑฐ๋ ๋ฒ๋ฆด ์ ์์ผ๋ฉฐ ๋ค์ํ ์ ํ์ ๋ชฉ๋ฐ์ ๋ง๋ ๊ฒ ์ธ์๋ ์๋ฌด๊ฒ๋ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค๋ - ๋ฉ์์ง ํ. ๊ธ์์, ํ ๊ฐ์ง๋ ์ฒ์๋ถํฐ ๋ชจ๋ ๊ฒ์ด ๋ถ๋ช ํ์ต๋๋ค. ํ์ธ๋์ง ์์ ๋ฉ์์ง๋ ์ ์ฅํ๊ณ ๋ค์ ๋ณด๋ด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช์์? ๊ทธ๋ฆฌ๊ณ ๊ด๋๋ ๊ทธ๋ฅผ ์๊ณ ์์ต๋๋ค. ์๋ง๋ ์ด๋ฌํ ์ค๋ ์ ์๋น์ค ๋ฉ์์ง๋ ๋ชฉ๋ฐ๋ก์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ๋ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Telegram Desktop์๋ ์ด์ ํด๋นํ๋ ์ฝ 4 ๊ฐ์ ๋๊ธฐ์ด์ด ์์ต๋๋ค (์๋ง๋ ์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ๋ ๋ง์ ์ ์์ผ๋ฏ๋ก ์ฝ๋์ ์ํคํ ์ฒ๋ฅผ ๋ ์ง์งํ๊ฒ ์กฐ์ฌํด์ผํฉ๋๋ค. ๋์์ ์๊ฐ, ์ฐ๋ฆฌ๋ ์ํ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ MTProto ์ฒด๊ณ์ ํน์ ์ ํ์ด ์ฌ์ฉ๋์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํฉ๋๊น? ์๋ง๋ ์๋ฒ ํ๋ก๊ทธ๋๋จธ๊ฐ ํด๋ฌ์คํฐ ๋ด์์ ์์ ์ฑ์ ๋ณด์ฅํ์ง ๋ชปํ๊ฑฐ๋ ์ ์ด๋ ํ๋ก ํธ ๋ฐธ๋ฐ์์์ ๋ฒํผ๋ง์กฐ์ฐจ ํ ์ ์์๊ณ ์ด ๋ฌธ์ ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ฎ๊ฒผ์ ๊ฒ์ ๋๋ค. ํ์ฌ์ ์ผ๋ก Vasily๋ TCP์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ๋๊ธฐ์ด๋ง ์๋ ๋์ฒด ์ต์ ์ ๊ตฌํํ๋ ค๊ณ ์๋ํ์ต๋๋ค. ์ฆ, ์๋ฒ์ ๋ํ RTT๋ฅผ ์ธก์ ํ๊ณ ์น์ธ๋์ง ์์ ์์ฒญ ์์ ๋ฐ๋ผ "์ฐฝ" ํฌ๊ธฐ(๋ฉ์์ง์์)๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ๋๋ค. ์ฆ, ์๋ฒ ๋ถํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํ ๋๋ต์ ์ธ ํด๋ฆฌ์คํฑ์ ๋๋ค. ๋์์ ์น์ ์ ์๊ณ ์์ง ์์ ์ ์๋ ์์ฒญ ์์ ๋๋ค.
๊ธ์์, ์ดํดํ์๊ฒ ์ฃ ? TCP๋ฅผ ํตํด ์๋ํ๋ ํ๋กํ ์ฝ ์์ TCP๋ฅผ ๋ค์ ๊ตฌํํด์ผ ํ๋ค๋ฉด ์ด๋ ๋งค์ฐ ์๋ชป ์ค๊ณ๋ ํ๋กํ ์ฝ์ ๋ํ๋ ๋๋ค.
๋ค, ์ ๋ ์ด์์ ๋๊ธฐ์ด์ด ํ์ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ด ๊ณ ์์ค API๋ก ์์
ํ๋ ์ฌ๋์๊ฒ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ๋ณด์ธ์, ์์ฒญ์ ํ๊ณ ์ง๋ ฌํํ์ง๋ง ์ฆ์ ๋ณด๋ด๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์? ๋๋ต์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ msg_id
, ์ผ์์ ์ธะฐ๋๋ ์ฝ์์ ๊ฐ๋ฅํ ํ ๋ฆ๊ฒ ์ฐ๊ธฐํ๋ ๊ฒ์ด ๋ ์ข์ ๋ ์ด๋ธ์
๋๋ค. ์ฐ๋ฆฌ์ ๊ทธ๊ฒ ์ฌ์ด์ ์๊ฐ ๋ถ์ผ์น๋ก ์ธํด ๊ฐ์๊ธฐ ์๋ฒ๊ฐ ๊ฑฐ๋ถํฉ๋๋ค (๋ฌผ๋ก ์ฐ๋ฆฌ๋ ์๊ฐ์ ํ์ฌ์์ ์ด๋์ํค๋ ๋ฒํ๋ชฉ์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฒ ์๋ต์์ ๊ณ์ฐ๋ ๋ธํ๋ฅผ ์ถ๊ฐํ์ฌ ์๋ฒ ์๊ฐ์ - ๊ณต์ ํด๋ผ์ด์ธํธ๊ฐ ์ด ์์
์ ์ํํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ๋ฒํผ๋ง์ผ๋ก ์ธํด ์กฐ์กํ๊ณ ๋ถ์ ํํฉ๋๋ค. ๋ฐ๋ผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ก์ปฌ ํจ์ ํธ์ถ๋ก ์์ฒญํ๋ฉด ๋ฉ์์ง๋ ๋ค์ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
- ๋์ผํ ๋๊ธฐ์ด์ ์์ผ๋ฉฐ ์ํธํ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค.
- ์ ํด์ง
msg_id
๋ฉ์์ง๋ ๋ค๋ฅธ ๋๊ธฐ์ด๋ก ์ด๋ํ์ต๋๋ค. ๊ฐ๋ฅํ ์ ๋ฌ; ์์ผ์ผ๋ก ๋ณด๋ ๋๋ค. - a) ์๋ฒ๊ฐ MsgsAck์ ์๋ตํ์ต๋๋ค. ๋ฉ์์ง๊ฐ ์ ๋ฌ๋์์ผ๋ฏ๋ก "๋ค๋ฅธ ๋๊ธฐ์ด"์์ ์ญ์ ํฉ๋๋ค.
b) ๋๋ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ, ๊ทธ๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ข์ํ์ง ์์๊ณ badmsg๋ผ๊ณ ๋๋ตํ์ต๋๋ค. ์ฐ๋ฆฌ๋ "๋ค๋ฅธ ๋๊ธฐ์ด"์์ ๋ค์ ๋ณด๋ ๋๋ค.
c) ์๋ ค์ง ๋ฐ๊ฐ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ํ์์ ๋ฉ์์ง๋ฅผ ๋ค์ ๋ณด๋ด์ผ ํ์ง๋ง ์ ํํ ์ธ์ ์ธ์ง๋ ์ ์ ์์ต๋๋ค. - ์๋ฒ๊ฐ ๋ง์นจ๋ด ์๋ตํจ
RpcResult
- ์ค์ ์๋ต(๋๋ ์ค๋ฅ) - ์ ๋ฌ๋์์ ๋ฟ๋ง ์๋๋ผ ์ฒ๋ฆฌ๋์์ต๋๋ค.
์ด์ฉ๋ฉด, ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ถ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ง์ ๋ฉ์์ง๊ฐ ํ๋๋ก ์์ถ๋๊ณ ์๋ฒ๊ฐ ํ ๋ฒ์ ๋ชจ๋์ ๋ํ ์น์ธ์ผ๋ก ์๋ตํ๋ ๊ฒฝ์ฐ์
๋๋ค. msg_id
. ๊ทธ๋ฌ๋ ๊ทธ๋ ๋ํ ์ด ํฉ์ ๊ฑฐ๋ถํ ๊ฒ์
๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ฒด๋ ๊ฑฐ๋ถํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์์ ์์ ๋น๊ธฐ์ ์ ๊ณ ๋ ค ์ฌํญ์ด ์์ฉํฉ๋๋ค. ๊ฒฝํ์ ํตํด ์ฐ๋ฆฌ๋ ๋ง์ ๋ชฉ๋ฐ์ ๋ณด์๊ณ ์ด์ ๋์ ์กฐ์ธ๊ณผ ์ํคํ ์ฒ์ ๋ ๋ง์ ์๋ฅผ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์กฐ๊ฑด์์ ๊ทธ๋ฌํ ๊ฒฐ์ ์ ์ ๋ขฐํ๊ณ ๋ด๋ฆด ๊ฐ์น๊ฐ ์์ต๋๊น? ์ง๋ฌธ์ ์์ฌ์ ์ ๋๋ค(๋ฌผ๋ก ์๋๋๋ค).
์ฐ๋ฆฌ๋ ๋ฌด์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๊น? "๋ฉ์์ง์ ๋ํ ์ค๋ ์ฑ ๋ฉ์์ง"๋ผ๋ ์ฃผ์ ์ ๋ํด "๋น์ ์ ๋ฉ์ฒญํ๊ณ ์ฐ๋ฆฌ์ ํ๋ฅญํ ์์ด๋์ด๋ฅผ ์ดํดํ์ง ๋ชปํ์ต๋๋ค! "์ ๊ฐ์ ๋ฐ๋ ์๊ฒฌ์ผ๋ก ์ฌ์ ํ ์ถ์ธก ํ ์ ์์ต๋๋ค. (๊ทธ๋ฌ๋ฏ๋ก ๋จผ์ ์ผ๋ฐ ์ฌ๋๋ค์ด ํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ์ด๋ก ์ ๊ทผ๊ฑฐ์ ํจํท ๊ตํ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ ๋์ ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค) ํ์ด๋ฐ/์๊ฐ ์ด๊ณผ๋ ์์ ํ ์ค์ฉ์ ์ด๊ณ ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ์ด๋ฉฐ ๋ชจ๋ ๊ฒ์ด ์ฌ๊ธฐ์์ ์ค๋ซ๋์ ์๋ ค์ ธ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ช ์๋ ์๊ฐ ์ด๊ณผ์ ๋ํด ๋ฌด์์ ์๋ ค ์ค๋๊น?
์๋ฒ๋ ์ผ๋ฐ์ ์ผ๋ก RPC ์๋ต์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฉ์์ง(์ผ๋ฐ์ ์ผ๋ก RPC ์ฟผ๋ฆฌ) ์์ ์ ํ์ธํฉ๋๋ค. ์๋ต์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ ์๋ฒ๋ ๋จผ์ ์์ ํ์ธ์ ๋ณด๋ด๊ณ ๋ค์ ๋์ค์ RPC ์๋ต ์์ฒด๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์์ง๊ฐ ๋๋ฌด ๋ฆ๊ฒ ์ ์ก๋์ง ์์ ๊ฒฝ์ฐ(์: ์์ ํ 60-120์ด ํ์ ์์ฑ๋ ๊ฒฝ์ฐ) ๋ค์ RPC ์ฟผ๋ฆฌ์ ์น์ธ์ ์ถ๊ฐํ์ฌ ์๋ฒ๋ก๋ถํฐ ๋ฉ์์ง(์ผ๋ฐ์ ์ผ๋ก RPC ์๋ต) ์์ ์ ์น์ธํฉ๋๋ค. ์๋ฒ์์ ๋ณด๋ธ ๋ฉ์์ง). ๊ทธ๋ฌ๋ ์ค๋ ๊ธฐ๊ฐ ๋์ ์๋ฒ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ด์ ๊ฐ ์๊ฑฐ๋ ์๋ฒ์์ ์น์ธ๋์ง ์์ ๋ฉ์์ง๊ฐ ๋ง์ ๊ฒฝ์ฐ(์: 16๊ฐ ์ด์) ํด๋ผ์ด์ธํธ๋ ๋ ๋ฆฝ ์คํํ ์น์ธ์ ์ ์กํฉ๋๋ค.
... ๋๋ ๋ฒ์ญํฉ๋๋ค : ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ์ผ๋ง๋ ํ์ํ์ง, ์ด๋ป๊ฒ ํ์ํ์ง ๋ชจ๋ฆ ๋๋ค. ์, ์ด๋ ๊ฒ๋๋๋ก ์ถ์ ํฉ์๋ค.
ํ ์ ๋ณด:
ํ ๋ฉ์์ง(PING/PONG)
ping#7abe77ec ping_id:long = Pong;
์๋ต์ ์ผ๋ฐ์ ์ผ๋ก ๋์ผํ ์ฐ๊ฒฐ๋ก ๋ฐํ๋ฉ๋๋ค.
pong#347773c5 msg_id:long ping_id:long = Pong;
์ด๋ฌํ ๋ฉ์์ง์๋ ์น์ธ์ด ํ์ํ์ง ์์ต๋๋ค. Pong์ Ping์ ๋ํ ์๋ต์ผ๋ก๋ง ์ ์ก๋๋ฉฐ Ping์ ์์ชฝ์์ ์์ํ ์ ์์ต๋๋ค.
์ง์ฐ๋ ์ฐ๊ฒฐ ํ์ + PING
ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;
ํ์ฒ๋ผ ์๋ํฉ๋๋ค. ๋ํ ์ด ๋ฉ์์ง๋ฅผ ์์ ํ ํ ์๋ฒ๋ ๋ชจ๋ ์ด์ ํ์ด๋จธ๋ฅผ ์๋์ผ๋ก ์ฌ์ค์ ํ๋ ๋์ผํ ์ ํ์ ์ ๋ฉ์์ง๋ฅผ ์์ ํ์ง ์๋ ํ disconnect_delay์ด ํ์ ํ์ฌ ์ฐ๊ฒฐ์ ๋ซ๋ ํ์ด๋จธ๋ฅผ ์์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ํด๋ผ์ด์ธํธ๊ฐ 60์ด๋ง๋ค ํ ๋ฒ์ฉ ์ด๋ฌํ ping์ ๋ณด๋ด๋ ๊ฒฝ์ฐ disconnect_delay๋ฅผ 75์ด๋ก ์ค์ ํ ์ ์์ต๋๋ค.
๋น์ ๋ฏธ์ณค์ด?! 60์ด ์์ ๊ธฐ์ฐจ๋ ์ญ์ ์ง์ ํ์ฌ ์น๊ฐ์ ๋ด๋ฆฌ๊ณ ํ์ฐ๊ณ ํฐ๋์์ ๋ค์ ์ฐ๊ฒฐ์ด ๋๊น๋๋ค. 120์ด ์์ ์ฃผ๋ณ์ ์ฐ๋ฅด๋ ๋์ ๊ทธ๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋์ฐฉํ๊ณ ์ฐ๊ฒฐ์ด ๋์ด์ง ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์, ๋ค๋ฆฌ๊ฐ ์ด๋์์ ์๋ผ๋์ง๋ ๋ถ๋ช ํฉ๋๋ค. "์ธ๋ฆฌ๋ ์๋ฆฌ๊ฐ ๋ค๋ฆฌ์ง๋ง ์ด๋ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค." ๋ํ์ ์์ ์์ํ Nagle ์๊ณ ๋ฆฌ์ฆ๊ณผ TCP_NODELAY ์ต์ ์ด ์์ต๋๋ค. ํ์ง๋ง ์ฃ์กํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ธ 200์ ์ง์ฐ์ํค์ธ์. ๋ฐ๋ฆฌ์ด. ์ ๋ง๋ก ๋น์ทํ ๊ฒ์ ๋ฌ์ฌํ๊ณ ๊ฐ๋ฅํ ๋ช ๊ฐ์ ํจํท์ ์ ์ฝํ๊ณ ์ถ๋ค๋ฉด - ์, ์ ์ด๋ 5์ด ๋์ ์ฐ๊ธฐํ๊ฑฐ๋ "์ฌ์ฉ์๊ฐ ์ ๋ ฅ ์ค์ ๋๋ค..." ๋ฉ์์ง์ ์๊ฐ ์ ํ์ด ๋ฌด์์ด๋ ๊ฐ์ ์ง๊ธ์ด ๋ฌด์์ด๋ ์ฐ๊ธฐํ์ญ์์ค. ํ์ง๋ง ๋ ์ด์.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ํ. ์ฆ, TCP ์ฐ๊ฒฐ์ ํ์ฑ ์ํ๋ฅผ ํ์ธํฉ๋๋ค. ์ฌ๋ฐ์ง ๋ง ์ฝ 10 ๋ ์ ์ ์ ๋ ์ฐ๋ฆฌ ๊ต์์ง ํธ์คํ ๋ฉ์ ์ ์ ๋ํ ๋นํ์ ์ธ ํ ์คํธ๋ฅผ ์ผ์ต๋๋ค. ๊ทธ๊ณณ์์ ์ ์๋ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ฅผ ํํ๊ณ ๊ทธ ๋ฐ๋๋ ์๋๋๋ค. ๊ทผ๋ฐ 3ํ๋ ๋ ๊ทธ๋ ๊ณ , ๊ตญ์ ์ฌ๋ฌด์๋ ๋ ๋ค๋ฅธ๊ฑฐ์ฃ ? ..
์ฒซ์งธ, ์๊ท๋ชจ ๊ต์ก ํ๋ก๊ทธ๋จ์ ๋๋ค. ํจํท ๊ตํ์ด ์๋ TCP ์ฐ๊ฒฐ์ ๋ช ์ฃผ ๋์ ์ง์๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ข๊ธฐ๋ ํ๊ณ ๋์๊ธฐ๋ ํฉ๋๋ค. ๊ธ์, ์๋ฒ์ ๋ํ SSH ์ฐ๊ฒฐ์ด ์ด๋ ค ์์ผ๋ฉด ์ปดํจํฐ์์ ์ผ์ด๋ ํ์ ๋ผ์ฐํฐ๋ฅผ ์ฌ๋ถํ ํ๊ณ ์ ์๋ฆฌ๋ก ๋์ ์์ต๋๋ค. ์ด ์๋ฒ๋ฅผ ํตํ ์ธ์ ์ ์ค๋จ๋์ง ์์์ต๋๋ค (์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์์๊ณ ํจํท๋ ์์์ต๋๋ค). ํธ๋ฆฌํ. ์๋ฒ์ ์์ฒ ๊ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์๊ณ ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค๋ฅผ ์ฐจ์งํ๊ณ (์๋ ํ์ธ์ Postgres!) ํด๋ผ์ด์ธํธ ํธ์คํธ๊ฐ ์ค๋ ์ ์ ์ฌ๋ถํ ๋์์ ์ ์์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์ ์ ์์ต๋๋ค.
์ฑํ /IM ์์คํ ์ ๋ ๋ค๋ฅธ ์ถ๊ฐ ์ด์ ์ธ ์จ๋ผ์ธ ์ํ๋ก ์ธํด ๋ ๋ฒ์งธ ๊ฒฝ์ฐ์ ์ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ "๋จ์ด์ก๋ค"๋ฉด ๋ํ ์๋์๊ฒ ์๋ ค์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด Jabber์ ์ ์์๊ฐ ๋ง๋ (๊ทธ๋ฆฌ๊ณ 20๋ ๋์ ์์ ๋) ์ค์๊ฐ ์์ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์์ ์ฐ๊ฒฐ์ด ๋์ด์ก์ง๋ง ์ฌ์ฉ์๋ ๊ทธ๊ฐ ์จ๋ผ์ธ ์ํ๋ผ๊ณ ๋ฏฟ๊ณ ๊ณ์ํด์ ๊ทธ์๊ฒ ๋ฉ์์ง๋ฅผ ์๋๋ค(๋ช ๋ถ ์ ์ ์์ ํ ์์ค๋จ). ํด์์ด ๋ฐ๊ฒฌ๋์์ต๋๋ค). ์๋์, TCP ํ์ด๋จธ์ ์๋ ๋ฐฉ์์ ์ดํดํ์ง ๋ชปํ๋ ๋ง์ ์ฌ๋๋ค์ด ์ด๋์์๋ ํ์ด ๋์ค๋ TCP_KEEPALIVE ์ต์ (์์ญ ์ด์ ๊ฐ์ ์ผ์ ๊ฐ ์ค์ )์ ์ฌ๊ธฐ์์ ๋์์ด ๋์ง ์์ต๋๋ค. ์ฌ์ฉ์์ ์ปดํจํฐ๋ ์ด์ ์์ง๋ง ์๋ตํ ์ ์๊ณ ์์ฉ ํ๋ก๊ทธ๋จ ์์ฒด๋ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค(์ ์งํ ์ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น? Ubuntu 18.04์ Telegram Desktop์ด ๋ฐ๋ณต์ ์ผ๋ก ์ถฉ๋ํ์ต๋๋ค).
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ping์ ํด์ผ ํฉ๋๋ค. ์๋ฒ ๊ทธ ๋ฐ๋๊ฐ ์๋ ํด๋ผ์ด์ธํธ - ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ ๊ฒ ํ๋ฉด ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ํ์ด ์ ๋ฌ๋์ง ์๊ณ ๋ชฉํ๊ฐ ๋ฌ์ฑ๋์ง ์์ต๋๋ค.
Telegram์์ ๋ฌด์์ ๋ณผ ์ ์์ต๋๊น? ๋ชจ๋ ๊ฒ์ด ์ ๋ฐ๋์
๋๋ค! ์, ์ฆ ๋ฌผ๋ก ๊ณต์์ ์ผ๋ก ์์ธก์ ์๋ก ํํ ์ ์์ต๋๋ค. ์ค์ ๋ก ํด๋ผ์ด์ธํธ๋ ๋ชฉ๋ฐ์ ์ฌ์ฉํฉ๋๋ค. ping_delay_disconnect
, ์๋ฒ์ ํ์ด๋จธ๋ฅผ ์๋์ํต๋๋ค. ์, ์ฃ์กํฉ๋๋ค. ๊ณ ๊ฐ์ด ํ ์์ด ๊ทธ๊ณณ์์ ์ผ๋ง๋ ์ค๋ ์ด๊ณ ์ถ์์ง ๊ฒฐ์ ํ๋ ๊ฒ์ ๊ณ ๊ฐ์ ์ผ์ด ์๋๋๋ค. ๋ถํ์ ๋ฐ๋ผ ์๋ฒ๊ฐ ๋ ์ ์๋๋ค. ๊ทธ๋ฌ๋ ๋ฌผ๋ก ์์์ ๋ํด ๋ฏธ์ํ๋ค๊ณ ๋๋ผ์ง ์์ผ๋ฉด ๊ทธ๋ค์ ์ฌ์
ํ ํผ๋
ธํค์ค ์์ฒด์ด๋ฉฐ ๋ชฉ๋ฐ์ด ๋ด๋ ค์ฌ ๊ฒ์
๋๋ค ...
์ด๋ป๊ฒ ์ค๊ณํ์ด์ผ ํ ๊น์?
์์ ์ฌ์ค์ ์ ์ก (๋ฐ ํ์) ์์ค์ ์ปดํจํฐ ๋คํธ์ํฌ ๋ถ์ผ์์ Telegram / VKontakte ํ์ ์ญ๋์ด ๊ทธ๋ค์ง ๋์ง ์๊ณ ๊ด๋ จ ๋ฌธ์ ์ ๋ํ ์๊ฒฉ์ด ๋ฎ์์ ๋ถ๋ช ํ ๋ํ๋ ๋๋ค.
์ ๊ทธ๋ ๊ฒ ๋ณต์กํด์ก์ผ๋ฉฐ Telegram ์ค๊ณ์๋ ์ด๋ป๊ฒ ์ด์๋ฅผ ์ ๊ธฐํ ์ ์์ต๋๊น? TCP ์ฐ๊ฒฐ์ด ๋์ด์ ธ๋ ์ด์๋จ๋ ์ธ์ ์ ๋ง๋ค๋ ค๊ณ ํ๋ค๋ ์ฌ์ค, ์ฆ ์ง๊ธ ์ ๋ฌํ์ง ๋ชปํ ๊ฒ์ ๋์ค์ ์ ๋ฌํ๊ฒ ์ต๋๋ค. ๊ทธ๋ค์ ๋ํ UDP ์ ์ก์ ์๋ํ์ง๋ง ์ด๋ ค์์ ๋ถ๋ชํ ํฌ๊ธฐํ์ง๋ง (๋ฌธ์๊ฐ ๋น์ด์๋ ์ด์ ์ ๋๋ค. ์๋ ํ ๊ฒ์ด ์์์ต๋๋ค). ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋คํธ์ํฌ์ ํนํ TCP๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง, ์ด๋์ ์์กดํ ์ ์๋์ง, ์ด๋์ ์ง์ ์ํํด์ผ ํ๋์ง(๋ฐ ๋ฐฉ๋ฒ)์ ๋ํ ์ดํด ๋ถ์กฑ์ผ๋ก ์ธํด "one shot of two" ์ํธํ์ ๊ฒฐํฉํ๋ ค๋ ์๋๊ฐ ์์ต๋๋ค. ํ๋์ ๋์ ๊ฐ์ง ์โ-๊ทธ๋ฐ ์์ฒด๊ฐ ๋์์ต๋๋ค.
์ด๋ ์ด์ผ ํ๋? ์ฌ์ค์ ๊ทผ๊ฑฐ msg_id
์ฌ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ํธํ์ ์ผ๋ก ํ์ํ ํ์์คํฌํ์ ๊ณ ์ ์๋ณ์ ๊ธฐ๋ฅ์ ๋ถ์ด๋ ๊ฒ์ ์ค๋ฅ์
๋๋ค. ๋ฐ๋ผ์ ํ์ฌ ์ํคํ
์ฒ๋ฅผ ํฌ๊ฒ ๋ณ๊ฒฝํ์ง ์๊ณ (์
๋ฐ์ดํธ ์ค๋ ๋๊ฐ ํ์ฑ๋ ๋ ์ด๊ฒ์ ์ด ๊ฒ์๋ฌผ ์๋ฆฌ์ฆ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํ ์์ ์์ค API ์ฃผ์ ์) ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ์ ๋ํ TCP ์ฐ๊ฒฐ์ ์ ์งํ๋ ์๋ฒ๊ฐ ์ฑ ์์ ์ง๋๋ค. ์์ผ์์ ๋นผ๊ฑฐ๋ โโํ์ธ, ์ฒ๋ฆฌ ๋๋ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ฉด ์์ค์ด ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์ธ์ด ๋๋ ๊ฒ์ id์ ๋ฒกํฐ๊ฐ ์๋๋ผ ๋จ์ํ "๋ง์ง๋ง์ผ๋ก ์์ ๋ seq_no"์ ๋๋ค. TCP์์์ ๊ฐ์ด ์ซ์์ผ ๋ฟ์ ๋๋ค(XNUMX๊ฐ์ ์ซ์ - ์์ ์ seq์ ํ์ธ๋จ). ์ฐ๋ฆฌ๋ ํญ์ ํ์ ์ค์ ๋๋ค, ๊ทธ๋ ์ฃ ?
- ์ฌ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํ ํ์์คํฌํ๋ ๋ณ๋์ ํ๋์ธ la nonce๊ฐ ๋ฉ๋๋ค. ์ ํํ์ง๋ง ๋ค๋ฅธ ๊ฒ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. ์ถฉ๋ถํ๊ณ
uint32
- ์๊ธ์ด ์ ์ด๋ ๋ฐ๋์ ๋ง๋ค ๋ณ๊ฒฝ๋๋ฉด ํ์ฌ ์๊ฐ์ ์ ์ ๋ถ๋ถ์ ํ์ ๋นํธ์ 16๋นํธ๋ฅผ ํ ๋นํ๊ณ ๋๋จธ์ง๋ ์ด์ ์์ ๋ถ๋ถ์ ํ ๋นํ ์ ์์ต๋๋ค(์ง๊ธ์ฒ๋ผ). - ์ฒ ํ๋จ
msg_id
์ ํ-๋ฐฑ์๋์์ ์์ฒญ์ ๊ตฌ๋ณํ๋ ๊ด์ ์์ ๋ณผ ๋ ์ฒซ ๋ฒ์งธ๋ก ํด๋ผ์ด์ธํธ ID๊ฐ ์๊ณ ๋ ๋ฒ์งธ๋ก ์ธ์ ID๊ฐ ์์ผ๋ฉฐ ์ฐ๊ฒฐํฉ๋๋ค. ๋ฐ๋ผ์ ์์ฒญ ์๋ณ์๋ ํ๋๋ง ์์ผ๋ฉด ์ถฉ๋ถํฉ๋๋ค.seq_no
.
๋ํ ์ต์ ์ ์ ํ์ ์๋์ง๋ง ์์ ํ ๋ฌด์์๊ฐ ์๋ณ์ ์ญํ ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๊ฒ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋ ์์ ์์ค API์์ ์ด๋ฏธ ์ํ๋ฉ๋๋ค. ์ํคํ ์ฒ๋ฅผ ์๋์์ ์ ๋์ผ๋ก ๋ชจ๋ ๋ณ๊ฒฝํ๋ฉด ๋ ์ข๊ฒ ์ง๋ง, ์ด๊ฒ์ ์ด ๊ฒ์๋ฌผ์ด ์๋ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํ ์ฃผ์ ์ ๋๋ค.
API?
๋ฐ๋ด! ๊ทธ๋์ ๊ณ ํต๊ณผ ๋ชฉ๋ฐ๋ก ๊ฐ๋ ์ฐฌ ๊ธธ์ ํต๊ณผํ ์ฐ๋ฆฌ๋ ๋ง์นจ๋ด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์๋ฒ์์ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ ์ ์์์ต๋๋ค(์์ฒญ์ ๋ํ ์๋ต์ด ์๋๋ผ ๋๊ตฐ๊ฐ๊ฐ ํจ์ฌ ๋ ๋ช ํํ๋ค๋ฉด PUSH์ ๊ฐ์ ์์ฒด๋ฅผ ์ฐ๋ฆฌ์๊ฒ ๋ณด๋ ๋๋ค).
์ฃผ์, ์ด์ ๊ธฐ์ฌ์ Perl ์์ ๋ง ์์ ๊ฒ์ ๋๋ค! (๊ตฌ๋ฌธ์ ์ต์ํ์ง ์์ ์ฌ๋๋ค์ ์ํด bless์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๊ณ ๋ ๋ฒ์งธ ์ธ์๋ ํด๋์ค์ ๋๋ค):
2019.10.24 12:00:51 $1 = {
'cb' => 'TeleUpd::__ANON__',
'out' => bless( {
'filter' => bless( {}, 'Telegram::ChannelMessagesFilterEmpty' ),
'channel' => bless( {
'access_hash' => '-6698103710539760874',
'channel_id' => '1380524958'
}, 'Telegram::InputPeerChannel' ),
'pts' => '158503',
'flags' => 0,
'limit' => 0
}, 'Telegram::Updates::GetChannelDifference' ),
'req_id' => '6751291954012037292'
};
2019.10.24 12:00:51 $1 = {
'in' => bless( {
'req_msg_id' => '6751291954012037292',
'result' => bless( {
'pts' => 158508,
'flags' => 3,
'final' => 1,
'new_messages' => [],
'users' => [],
'chats' => [
bless( {
'title' => 'ะฅัะปะธะฝะพะผะธะบะฐ',
'username' => 'hoolinomics',
'flags' => 8288,
'id' => 1380524958,
'access_hash' => '-6698103710539760874',
'broadcast' => 1,
'version' => 0,
'photo' => bless( {
'photo_small' => bless( {
'volume_id' => 246933270,
'file_reference' => '
'secret' => '1854156056801727328',
'local_id' => 228648,
'dc_id' => 2
}, 'Telegram::FileLocation' ),
'photo_big' => bless( {
'dc_id' => 2,
'local_id' => 228650,
'file_reference' => '
'secret' => '1275570353387113110',
'volume_id' => 246933270
}, 'Telegram::FileLocation' )
}, 'Telegram::ChatPhoto' ),
'date' => 1531221081
}, 'Telegram::Channel' )
],
'timeout' => 300,
'other_updates' => [
bless( {
'pts_count' => 0,
'message' => bless( {
'post' => 1,
'id' => 852,
'flags' => 50368,
'views' => 8013,
'entities' => [
bless( {
'length' => 20,
'offset' => 0
}, 'Telegram::MessageEntityBold' ),
bless( {
'length' => 18,
'offset' => 480,
'url' => 'https://alexeymarkov.livejournal.com/[url_ะฒััะตะทะฐะฝ].html'
}, 'Telegram::MessageEntityTextUrl' )
],
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'text' => '???? 165',
'data' => 'send_reaction_0'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 9'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'message' => 'ะ ะฒะพั ะธ ะฝะพะฒะฐั ะบะฝะธะณะฐ!
// [ัะตะบัั ัะพะพะฑัะตะฝะธั ะฒััะตะทะฐะฝ ััะพะฑ ะฝะต ะฝะฐัััะฐัั ะฟัะฐะฒะธะป ะฅะฐะฑัะฐ ะพ ัะตะบะปะฐะผะต]
ะฝะฐะฟะตัะฐัะฐั.',
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'date' => 1571724559,
'edit_date' => 1571907562
}, 'Telegram::Message' ),
'pts' => 158508
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'pts' => 158508,
'message' => bless( {
'edit_date' => 1571907589,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'date' => 1571807301,
'message' => 'ะะพัะตะผั ะั ััะธัะฐะตัะต Facebook ะฟะปะพั
ะพะน ะบะพะผะฟะฐะฝะธะตะน? ะะพะถะตัะต ะฟัะพะบะพะผะผะตะฝัะธัะพะฒะฐัั? ะะพ-ะผะพะตะผั, ััะพ ัะธะบะฐัะฝะฐั ะบะพะผะฟะฐะฝะธั. ะะตะท ะดะพะปะณะพะฒ, ั ั
ะพัะพัะตะน ะฟัะธะฑัะปัั, ะฐ ะตัะปะธ ัะตัะฐั ะดะธะฒั ะฟะปะฐัะธัั, ัะพ ะธ ะตัะต ะผะพะณัั ะฝะตั
ะธะปะพ ะฟะพะดะพัะพะถะฐัั.
ะะปั ะผะตะฝั ะพัะฒะตั ัะพะฒะตััะตะฝะฝะพ ะพัะตะฒะธะดะตะฝ: ะฟะพัะพะผั ััะพ Facebook ะดะตะปะฐะตั ัะถะฐัะฝัะน ะฟะพ ะบะฐัะตััะฒั ะฟัะพะดัะบั. ะะฐ, ั ะฝะตะณะพ ะผะพะฝะพะฟะพะปัะฝะพะต ะฟะพะปะพะถะตะฝะธะต ะธ ะดะฐ, ะธะผ ะฟะพะปัะทัะตััั ะพะณัะพะผะฝะพะต ะบะพะปะธัะตััะฒะพ ะปัะดะตะน. ะะพ ะผะธั ะฝะต ััะพะธั ะฝะฐ ะผะตััะต. ะะพะณะดะฐ-ัะพ ะฒะปะฐะดะตะปััะฐะผ ะะพะบะธะธ ะฑัะปะพ ัะผะตัะฝะพ ะพั ะฟะตัะฒะพะณะพ ะะนัะพะฝะฐ. ะะฝะธ ะดัะผะฐะปะธ, ััะพ ะปัััะต ะะพะบะธะธ ะฝะธัะตะณะพ ะฑััั ะฝะต ะผะพะถะตั ะธ ะพะฝะฐ ะฝะฐะฒัะตะณะดะฐ ะพััะฐะฝะตััั ัะฐะผัะผ ัะดะพะฑะฝัะผ, ะบัะฐัะธะฒัะผ ะธ ัะฒััะดัะผ ัะตะปะตัะพะฝะพะผ - ะธ ะดะพะปั ััะฝะบะฐ ััะพ ะบัะฐัะฝะพัะตัะธะฒะพ ะดะตะผะพะฝัััะธัะพะฒะฐะปะฐ. ะขะตะฟะตัั ะธะผ ะฝะต ัะผะตัะฝะพ.
ะะพะฝะตัะฝะพ, ัะตะฟัะธะปะพะธะดั ัะพะฟัะพัะธะฒะปััััั ะฝะฐะฟะพัั ะผะพะปะพะดัั
ะณะตะฝะธะตะฒ: ัะฐะบ ะฆัะบะตัะฑะตัะณะพะผ ะฑัะป ะฟะพะถัะฐะฝ Whatsapp, ะฟะพัะพะผ Instagram. ะะพ ะฒัั ะธะผ ะฝะต ะฟะพะถัะฐัั, ะะฐัะฐ ะััะพะฒ ะฝะต ะฟัะพะดะฐัััั!
ะขะฐะบ ะฑัะดะตั ะธ ั ะคะตะนัะฑัะบะพะผ. ะะตะปัะทั ะฒัั ะฒัะตะผั ะดะตะปะฐัั ะณะพะฒะฝะพ. ะัะพ-ัะพ ะบะพะณะดะฐ-ัะพ ัะดะตะปะฐะตั ั
ะพัะพัะธะน ะฟัะพะดัะบั, ะบัะดะฐ ะฒัั ะธ ัะนะดัั.
#ัะพััะตัะธ #facebook #ะฐะบัะธะธ #ัะตะฟัะธะปะพะธะดั',
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 452'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'text' => '???? 21',
'data' => 'send_reaction_1'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'entities' => [
bless( {
'length' => 199,
'offset' => 0
}, 'Telegram::MessageEntityBold' ),
bless( {
'length' => 8,
'offset' => 919
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'offset' => 928,
'length' => 9
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 6,
'offset' => 938
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 11,
'offset' => 945
}, 'Telegram::MessageEntityHashtag' )
],
'views' => 6964,
'flags' => 50368,
'id' => 854,
'post' => 1
}, 'Telegram::Message' ),
'pts_count' => 0
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'message' => bless( {
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 213'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 8'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'views' => 2940,
'entities' => [
bless( {
'length' => 609,
'offset' => 348
}, 'Telegram::MessageEntityItalic' )
],
'flags' => 50368,
'post' => 1,
'id' => 857,
'edit_date' => 1571907636,
'date' => 1571902479,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'message' => 'ะะพัั ะฟัะพ 1ะก ะฒัะทะฒะฐะป ะฑััะฝัั ะฟะพะปะตะผะธะบั. ะงะตะปะพะฒะตะบ 10 (ะฒะธะดะธะผะพ, 1ั-ะฟัะพะณัะฐะผะผะธััะพะฒ) ะตะดะธะฝะพะดััะฝะพ ะฝะฐะฟะธัะฐะปะธ:
// [ัะตะบัั ัะพะพะฑัะตะฝะธั ะฒััะตะทะฐะฝ ััะพะฑ ะฝะต ะฝะฐัััะฐัั ะฟัะฐะฒะธะป ะฅะฐะฑัะฐ ะพ ัะตะบะปะฐะผะต]
ะฏ ะฑั ะดะพะฑะฐะฒะธะป, ััะพ ะฑะปะตััััะฐั ั 1ะก ะดะธัััะธะฑััะธั, ะฐ ะผะฐัะบะตัะธะฝะณ... ะฝั, ัะฐะบะพะต.'
}, 'Telegram::Message' ),
'pts_count' => 0,
'pts' => 158508
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'pts' => 158508,
'pts_count' => 0,
'message' => bless( {
'message' => 'ะะดัะฐะฒััะฒัะนัะต, ัะฐััะบะฐะถะธัะต, ะฟะพะถะฐะปัะนััะฐ, ัะตะผ ะฒัะตะดะธั ัะบะพะฝะพะผะธะบะต 1ะก?
// [ัะตะบัั ัะพะพะฑัะตะฝะธั ะฒััะตะทะฐะฝ ััะพะฑ ะฝะต ะฝะฐัััะฐัั ะฟัะฐะฒะธะป ะฅะฐะฑัะฐ ะพ ัะตะบะปะฐะผะต]
#ัะพัั #it #ัะบะพะฝะพะผะธะบะฐ',
'edit_date' => 1571907650,
'date' => 1571893707,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'flags' => 50368,
'post' => 1,
'id' => 856,
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 360'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 32'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'views' => 4416,
'entities' => [
bless( {
'offset' => 0,
'length' => 64
}, 'Telegram::MessageEntityBold' ),
bless( {
'offset' => 1551,
'length' => 5
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 3,
'offset' => 1557
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'offset' => 1561,
'length' => 10
}, 'Telegram::MessageEntityHashtag' )
]
}, 'Telegram::Message' )
}, 'Telegram::UpdateEditChannelMessage' )
]
}, 'Telegram::Updates::ChannelDifference' )
}, 'MTProto::RpcResult' )
};
2019.10.24 12:00:51 $1 = {
'in' => bless( {
'update' => bless( {
'user_id' => 2507460,
'status' => bless( {
'was_online' => 1571907651
}, 'Telegram::UserStatusOffline' )
}, 'Telegram::UpdateUserStatus' ),
'date' => 1571907650
}, 'Telegram::UpdateShort' )
};
2019.10.24 12:05:46 $1 = {
'in' => bless( {
'chats' => [],
'date' => 1571907946,
'seq' => 0,
'updates' => [
bless( {
'max_id' => 141719,
'channel_id' => 1295963795
}, 'Telegram::UpdateReadChannelInbox' )
],
'users' => []
}, 'Telegram::Updates' )
};
2019.10.24 13:01:23 $1 = {
'in' => bless( {
'server_salt' => '4914425622822907323',
'unique_id' => '5297282355827493819',
'first_msg_id' => '6751307555044380692'
}, 'MTProto::NewSessionCreated' )
};
2019.10.24 13:24:21 $1 = {
'in' => bless( {
'chats' => [
bless( {
'username' => 'freebsd_ru',
'version' => 0,
'flags' => 5440,
'title' => 'freebsd_ru',
'min' => 1,
'photo' => bless( {
'photo_small' => bless( {
'local_id' => 328733,
'volume_id' => 235140688,
'dc_id' => 2,
'file_reference' => '
'secret' => '4426006807282303416'
}, 'Telegram::FileLocation' ),
'photo_big' => bless( {
'dc_id' => 2,
'file_reference' => '
'volume_id' => 235140688,
'local_id' => 328735,
'secret' => '71251192991540083'
}, 'Telegram::FileLocation' )
}, 'Telegram::ChatPhoto' ),
'date' => 1461248502,
'id' => 1038300508,
'democracy' => 1,
'megagroup' => 1
}, 'Telegram::Channel' )
],
'users' => [
bless( {
'last_name' => 'Panov',
'flags' => 1048646,
'min' => 1,
'id' => 82234609,
'status' => bless( {}, 'Telegram::UserStatusRecently' ),
'first_name' => 'Dima'
}, 'Telegram::User' )
],
'seq' => 0,
'date' => 1571912647,
'updates' => [
bless( {
'pts' => 137596,
'message' => bless( {
'flags' => 256,
'message' => 'ะกะพะทะดะฐัั ะดะถะตะนะป ั ะธะผะตะฝะตะผ ะฟะพะบะพัะพัะต ??',
'to_id' => bless( {
'channel_id' => 1038300508
}, 'Telegram::PeerChannel' ),
'id' => 119634,
'date' => 1571912647,
'from_id' => 82234609
}, 'Telegram::Message' ),
'pts_count' => 1
}, 'Telegram::UpdateNewChannelMessage' )
]
}, 'Telegram::Updates' )
};
์, ํนํ ์คํฌ์ผ๋ฌ ์๋์ ์์ง ์์ต๋๋ค. ์ฝ์ง ์์๋ค๋ฉด ๊ฐ์ ํด๋ณด์ธ์!
์ค์์ด~~... ์ด๋์? ๋งค์ฐ ์น์ํ ๊ฒโฆ ์๋ง๋ ํด๋์ค๊ฐ ๊ฐ์ฒด์ ์ฒจ๋ถ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ JSON์ ์ผ๋ฐ์ ์ธ ์น API์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ผ๊น์?..
๊ทธ๋์ ๋ฐํ์ก์ต๋๋ค ... ๊ทธ๊ฒ ๋ญ์ผ, ๋์ง๋ค? .. ๋๋ฌด ๋ง์ ๋ ธ๋ ฅ-๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์น ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ๋ ๊ณณ์์ ๋ฉ์ท์ต๋๋ค. ๋ง ์์?.. HTTPS๋ฅผ ํตํ JSON์ด ๋ ์ฌ์ธ๊น์?! ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ ๋๊ฐ๋ก ๋ฌด์์ ์ป์์ต๋๊น? ์ด๋ฌํ ๋ ธ๋ ฅ์ด ๊ฐ์น๊ฐ ์์์ต๋๊น?
TL+MTProto๊ฐ ์ฐ๋ฆฌ์๊ฒ ์ ๊ณตํ ๊ฒ๊ณผ ๊ฐ๋ฅํ ๋์์ด ๋ฌด์์ธ์ง ํ๊ฐํด ๋ด ์๋ค. ๊ธ์, HTTP ์์ฒญ-์๋ต์ ์ ํฉํ์ง ์์ง๋ง ์ ์ด๋ TLS ์์ ๋ญ๊ฐ ์์ต๋๊น?
์ปดํฉํธ ์ง๋ ฌํ. JSON๊ณผ ์ ์ฌํ ์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋ฐ์ด๋๋ฆฌ ๋ณํ์ด ์์์ ๊ธฐ์ตํฉ๋๋ค. MsgPack์ ํ์ฅ์ฑ์ด ์ถฉ๋ถํ์ง ์์ ๊ฒ์ผ๋ก ํ์ํ์ง๋ง ์๋ฅผ ๋ค์ด CBOR์ด ์์ต๋๋ค.
- 25 + 256 - ์ ๋ ดํ ์์ถ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ ์ค๋ณต ํ์ ํ ๋ฒํธ ์ฐธ์กฐ๋ก ๊ต์ฒด
- 26 - ํด๋์ค ์ด๋ฆ๊ณผ ์์ฑ์ ์ธ์๊ฐ ์๋ ์ง๋ ฌํ๋ Perl ๊ฐ์ฒด
- 27 - ์ ํ ์ด๋ฆ ๋ฐ ์์ฑ์ ์ธ์๊ฐ ์๋ ์ง๋ ฌํ๋ ์ธ์ด ๋ ๋ฆฝ ๊ฐ์ฒด
๊ธ์, ๋๋ ๋ฌธ์์ด๊ณผ ๊ฐ์ฒด์ ํจํน์ด ํ์ฑํ๋ ์ํ์์ TL๊ณผ CBOR์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๋ ค๊ณ ํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๋ฉ๊ฐ๋ฐ์ดํธ ์ด๋๊ฐ์์ CBOR์ ์ ๋ฆฌํ๊ฒ ๋ฌ๋ผ์ง๊ธฐ ์์ํ์ต๋๋ค.
cborlen=1039673 tl_len=1095092
๋ฐ๋ผ์, ๊ฒฐ๋ก : ๋๊ธฐํ ์คํจ ๋๋ ์ ์ ์๋ ์๋ณ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๊ณ ํจ์จ์ฑ์ด ๋น์ทํ ํจ์ฌ ๊ฐ๋จํ ํ์์ด ์์ต๋๋ค.
๋น ๋ฅธ ์ฐ๊ฒฐ ์ค์ . ์ฆ, ์ฌ์ฐ๊ฒฐ ํ(ํค๊ฐ ์ด๋ฏธ ํ ๋ฒ ์์ฑ๋ ๊ฒฝ์ฐ) RTT๊ฐ XNUMX์์ ์๋ฏธํฉ๋๋ค. ์ฒซ ๋ฒ์งธ MTProto ๋ฉ์์ง์์ ์ ์ฉํ ์ ์์ง๋ง ์ผ๋ถ ์์ฝ์ด ์๋ ๊ฒฝ์ฐ ๋์ผํ ์ํธ์ ๋ค์ด๊ฐ๊ณ ์ธ์ ์ด ์ฉ์ง ์์์ต๋๋ค. TLS๋ ๊ทธ ๋๊ฐ๋ก ๋ฌด์์ ์ ๊ณตํฉ๋๊น? ๊ด๋ จ ์ธ์ฉ๋ฌธ:
TLS์์ PFS๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ TLS ์ธ์ ํฐ์ผ(
RFC 5077 ) ํค๋ฅผ ์ฌํ์ํ์ง ์๊ณ ์๋ฒ์ ํค ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๊ณ ์ํธํ๋ ์ธ์ ์ ์ฌ๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ฐ๊ฒฐ์ ์ด๊ณ ํค๋ฅผ ์์ฑํ ๋ ์๋ฒ๋ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ํธํํ์ฌ ์ธ์ ํฐ์ผ ํ์์ผ๋ก ํด๋ผ์ด์ธํธ์ ๋ณด๋ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๊ฒฐ์ด ์ฌ๊ฐ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ฌด์๋ณด๋ค๋ ์ธ์ ํค๊ฐ ํฌํจ๋ ์ธ์ ํฐ์ผ์ ์๋ฒ๋ก ๋ค์ ๋ณด๋ ๋๋ค. ํฐ์ผ ์์ฒด๋ ์๋ฒ์ ์ ์ฅ๋๋ ์์ ํค(์ธ์ ํฐ์ผ ํค)๋ก ์ํธํ๋๋ฉฐ ํด๋ฌ์คํฐ ์๋ฃจ์ ์์ SSL์ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ํ๋ฐํธ์๋ ์๋ฒ์ ๋ฐฐํฌ๋์ด์ผ ํฉ๋๋ค.[10]. ๋ฐ๋ผ์ ์์ ์๋ฒ ํค๊ฐ ์์๋ ๊ฒฝ์ฐ(์: OpenSSL, nginx, Apache๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์ ์ฒด ์๊ฐ ๋์ ํค๋ฅผ ์ ์ฅํฉ๋๋ค. ์ธ๊ธฐ ์ฌ์ดํธ) ํค๋ฅผ ๋ช ์๊ฐ, ์ต๋ ๋ฉฐ์น ๋์ ์ฌ์ฉ).
์ฌ๊ธฐ์ RTT๋ XNUMX์ด ์๋๋ฏ๋ก ์ ์ด๋ ClientHello์ ServerHello๋ฅผ ๊ตํํด์ผ ํฉ๋๋ค. ๊ทธ ํ์ Finished์ ํจ๊ป ํด๋ผ์ด์ธํธ๋ ์ด๋ฏธ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๋ ์๋ก ์ด๋ฆฐ ์ฐ๊ฒฐ์ด ๋ง์ ์น์ด ์๋๋ผ ์ฐ๊ฒฐ์ด ์ข ์ข ํ๋ ์ด์์ ์๋ช ์ด ๊ธธ๊ณ ์๋์ ์ผ๋ก ์งง์ ์น ํ์ด์ง ์์ฒญ ์ธ ๋ฉ์ ์ ๋ฅผ ๊ฐ์ง๊ณ ์์์ ๊ธฐ์ตํด์ผํฉ๋๋ค. ๋ด๋ถ์ ๋ค์คํ. ์ฆ, ๋งค์ฐ ๋์ ์งํ์ฒ ๊ตฌ๊ฐ์ ๋ง๋์ง ์์๋ค๋ฉด ์๋นํ ์์ฉ ๊ฐ๋ฅํฉ๋๋ค.
๋ค๋ฅธ ๊ฒ์ ์์ผ์ จ์ต๋๊น? ์๊ฒฌ์ ์์ฑํ์ญ์์ค.
๊ณ์!
์ด ๊ฒ์๋ฌผ ์๋ฆฌ์ฆ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์์๋ ์ ๊ทผ ๋ฐฉ์, ์ด๋ฐ์ฌ๋ก๊ธฐ, ์ธํฐํ์ด์ค, ์ฌ์ฉ์์ ๋ํ ํ๋ ๋ฑ ๊ธฐ์ ์ ๋ฌธ์ ๊ฐ ์๋ ์กฐ์ง์ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ์ ์๋ ๊ธฐ์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
์ธ ๋ฒ์งธ ๋ถ๋ถ์์๋ ๊ธฐ์ ๊ตฌ์ฑ ์์/๊ฐ๋ฐ ๊ฒฝํ์ ๋ํ ๋ถ์์ ๊ณ์ํฉ๋๋ค. ํนํ ๋ค์์ ๋ฐฐ์ฐ๊ฒ ๋ฉ๋๋ค.
- ๋ค์ํ TL ์ ํ์ผ๋ก ๋์ ํ์ ์ง์
- ์ฑ๋ ๋ฐ ์ํผ๊ทธ๋ฃน์ ๋ํ ์๋ ค์ง์ง ์์ ์ฌํญ
- ๋ํ๋ณด๋ค ๋ช ๋จ๋ณด๋ค ๋์ฉ๋๋ค.
- ์ ๋ ๋ฉ์์ง ์ฃผ์ ์ง์ ๊ณผ ์๋ ๋ฉ์์ง ์ฃผ์ ์ง์ ์ ๋ณด
- ์ฌ์ง๊ณผ ์ด๋ฏธ์ง์ ์ฐจ์ด์ ์ ๋ฌด์์ ๋๊น
- ๊ทธ๋ฆผ ์ด๋ชจํฐ์ฝ์ด ์ดํค๋ฆญ์ฒด ํ ์คํธ๋ฅผ ๋ฐฉํดํ๋ ๋ฐฉ๋ฒ
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ชฉ๋ฐ! ๊ณ์ ์ง์ผ๋ด!
์ถ์ฒ : habr.com