рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА / рдЖрджрд┐ рд╣реЗрдбрд░ред рдЙрдирдореЗрдВ, рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди - рдСрдлрд╝рд╕реЗрдЯ, рдХрд╛рдЙрдВрдЯрд░рд░реНрд╕, рдПрдбреНрд░реЗрд╕ - рдиреЗрдЯрд╡рд░реНрдХ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ (рдмрд┐рдЧ-рдПрдВрдбрд┐рдпрди) рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ; рд╣рдо x86 (рдереЛрдбрд╝рд╛-рд╕рд╛ рдПрдВрдбрд┐рдпрди) рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣реЗрдбрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдирдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ, рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕рд░рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ (
uint32_t
,
uint16_t
) рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдо рдмрд╛рдЗрдЯ рдХреНрд░рдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдП, рд╣рдордиреЗ рдХрдИ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рдж, рдлрд╝реАрд▓реНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред рдХрдЯ рдХреЗ рддрд╣рдд рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рдХреЛрдб рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рд╕рдЦреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИред
рдмрд╛рдЗрдЯ рдХреНрд░рдо
рдЬреЛ рд▓реЛрдЧ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ (рдПрдВрдбрд┐рдпрдирдиреЗрд╕, рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдХрдмреЗрдЬрд╝ред
рдкрд╣рд▓реЗ рд╕реЗ
рд╣реА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ
"рд╣реИрдмреЗ" рдкрд░ рдерд╛ ред
рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЕрдВрдХрди рдореЗрдВ, рд╡реЗ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ (рдмрд╛рдПрдВ) рд╕реЗ рд╕рдмрд╕реЗ рдпреБрд╡рд╛ (рджрд╛рдПрдВ) рд╕реЗ рдмрд╛рдИрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВ: 432
10 = 4 ├Ч 10
2 + 3 ├Ч 10
1 + 2 ├Ч 10
0 ред рдкреВрд░реНрдгрд╛рдВрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 16 рдмрд┐рдЯреНрд╕ (0 рд╕реЗ 65535 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛)ред рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 432
10 = 01b0
16 , рдпрд╛рдиреА рдмрд╛рдЗрдЯреНрд╕ 01 рдФрд░ b0ред
рдЗрд╕ рдирдВрдмрд░ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ:
#include <cstdio> // printf() #include <cstdint> // uint8_t, uint16_t int main() { uint16_t value = 0x01b0; printf("%04x\n", value); const auto bytes = reinterpret_cast<const uint8_t*>(&value); for (auto i = 0; i < sizeof(value); i++) { printf("%02x ", bytes[i]); } }
рд╕рд╛рдзрд╛рд░рдг рдЗрдВрдЯреЗрд▓ рдпрд╛ AMD (x86) рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:
01b0 b0 01
рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рд╕рдмрд╕реЗ рдХрдо рдЙрдореНрд░ рд╕реЗ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ рддрдХ рд╕реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рд╕рдВрдЦреНрдпрд╛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдирд╣реАрдВред рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ
рд▓рд┐рдЯрд┐рд▓-рдПрдВрдбрд┐рдпрди (LE) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
ред 4-рдмрд╛рдЗрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИред рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП "рджреЗрд╢реА" рдСрд░реНрдбрд░
рдХреЛ рд╕реАрдкреАрдпреВ рдпрд╛ рд╣реЛрд╕реНрдЯ (рд╕реАрдкреАрдпреВ / рд╣реЛрд╕реНрдЯ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░) рдХрд╛
рдЖрджреЗрд╢ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрдЬрдмрд╛рди рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдереЛрдбрд╝рд╛-рд╕рд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрдВрдЯрд░рдиреЗрдЯ x86 рдкрд░ рдкреИрджрд╛ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рдФрд░ рд╡рд╣рд╛рдБ рдмрд╛рдЗрдЯ рдХреНрд░рдо рдЕрд▓рдЧ рдерд╛ -
рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ рд╕реЗ рд╕рдмрд╕реЗ рдХрдо рдЙрдореНрд░ (рдмрдбрд╝рд╛-рдПрдВрдбрд┐рдпрди, рдмреАрдИ) рд╕реЗред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рдЖрдИрдкреА, рдЯреАрд╕реАрдкреА, рдпреВрдбреАрдкреА) рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдмрдбрд╝реЗ-рдПрдВрдбрд┐рдпрди рдХреЛ
рдиреЗрдЯрд╡рд░реНрдХ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
редрдЙрджрд╛рд╣рд░рдг: рдкреЛрд░реНрдЯ 443 (1bb
16 ), рдЬреЛ HTTPS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЯреАрд╕реАрдкреА рд╣реЗрдбрд░ рдмрд╛рдЗрдЯреНрд╕ 01 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдкрдврд╝рдиреЗ рдкрд░ bb01
16 = 47873 рджреЗрдЧрд╛ред
рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдЗрдЯ рдХреНрд░рдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
uint16_t
рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди
htons()
(
h ost
рд╕реЗ n etwork for
s hort рдкреВрд░реНрдгрд╛рдВрдХ - рд╢реЙрд░реНрдЯ рдСрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП рд╣реЛрд╕реНрдЯ рдСрд░реНрдбрд░ рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдСрд░реНрдбрд░ рддрдХ) рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд░реНрд╕
ntohs()
ред рдЗрд╕реА рддрд░рд╣,
uint32_t
рд▓рд┐рдП
htonl()
рдФрд░
ntohl()
(рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИ)ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐
uint32_t
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рди рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ
рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ?
- рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ред рдпрд╣ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рднреА рдкрд░реАрдХреНрд╖рдХ рдХрдо рд╕реЗ рдХрдо рдЙрд╕ рдХреЛрдб рдореЗрдВ рддрд▓реНрд▓реАрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддрд╛ рд╣реИ: "рдореИрдВ
htons()
рджреЗрдЦрддрд╛ htons()
- рд╢рд╛рдпрдж, рд▓реЗрдЦрдХ рдиреЗ рд╕рдм рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛"ред - рдЕрдиреБрд╢рд╛рд╕рди, рдирд┐рдпрдо рдЬреИрд╕реЗ: рд╕рдВрдХреБрд▓ рдореЗрдВ рдХреЗрд╡рд▓ BE, LE рдореЗрдВ рд╕рднреА рдЪрд░ред рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдмрд╛рдЗрдЯ рдХреНрд░рдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдФрд░ "рдЬреИрд╕рд╛ рд╣реИ" рдЦреЛрдЬрдирд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИред
- рдЯреЗрд╕реНрдЯред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╡реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛ рдЦрд░рд╛рдм рд░реВрдк рд╕реЗ рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╕рдордп 1.1.1.1 рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ) рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреАрдИ рдореЗрдВ рдПрдХ рдирдВрдмрд░ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдПрдХ рдкреЛрд░реНрдЯ рдирдВрдмрд░, рдЖрдИрдкреА рдПрдбреНрд░реЗрд╕, рдЯреАрд╕реАрдкреА рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛, рдЪреЗрдХрд╕рдо рд╣реИред рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рдХреЛ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрд▓ рдЦрд╛рддреА рд╣реЛред
рд╕рдорд╛рдзрд╛рди рдЬреНрдЮрд╛рдд рд╣реИ - рд╕рдЦреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ, рдЕрд░реНрдерд╛рддреН, рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ, рдкрддреЗ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ BE / LE рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
Boost.Endian рд╣рдореЗрдВ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Boost рдирд╣реАрдВ рд╣реИред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ C ++ 17 рдореЗрдВ рд▓рдЧрднрдЧ 40 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╡рд░рдг рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдкрд░ рд╣реЗрдбрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмреАрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕реНрдерд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рди рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗред рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдмрд╛рд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдирдпрд╛ рдХреЛрдб рдХреЗрд╡рд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛ред
рдмрд┐рдЧ-рдПрдВрдбрд┐рдпрди рд╡рд░реНрдЧ рд╕рдВрдЦреНрдпрд╛ #include <cstdint> #include <iosfwd> #define PACKED __attribute__((packed)) constexpr auto bswap(uint16_t value) noexcept { return __builtin_bswap16(value); } constexpr auto bswap(uint32_t value) noexcept { return __builtin_bswap32(value); } template<typename T> struct Raw { T value; }; template<typename T> Raw(T) -> Raw<T>; template<typename T> struct BigEndian { using Underlying = T; using Native = T; constexpr BigEndian() noexcept = default; constexpr explicit BigEndian(Native value) noexcept : _value{bswap(value)} {} constexpr BigEndian(Raw<Underlying> raw) noexcept : _value{raw.value} {} constexpr Underlying raw() const { return _value; } constexpr Native native() const { return bswap(_value); } explicit operator bool() const { return static_cast<bool>(_value); } bool operator==(const BigEndian& other) const { return raw() == other.raw(); } bool operator!=(const BigEndian& other) const { return raw() != other.raw(); } friend std::ostream& operator<<(std::ostream& out, const BigEndian& value) { return out << value.native(); } private: Underlying _value{}; } PACKED;
- рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рд░ рдЬрдЧрд╣ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рднрд╛рд░реА
<iostream>
рдмрдЬрд╛рдп рдПрдХ рд╣рд▓реНрдХрд╛ <iosfwd>
ред htons()
, рдЖрджрд┐ рдХреЗ рдмрдЬрд╛рдп - рдлрд╛рд╕реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ htons()
ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╡реЗ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рд╕рд╛рд░ рд╕реЗ constexpr
рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП constexpr
рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред- рдХрднреА-рдХрднреА
uint16_t
рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ uint16_t
/ uint32_t
рдорд╛рди рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИред рдХрдЯреМрддреА рдЧрд╛рдЗрдб рдХреЗ рд╕рд╛рде Raw<T>
рд╕рдВрд░рдЪрдирд╛ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ BigEndian<T>
рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рдпрд╣рд╛рдВ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдмрд┐рдВрджреБ
PACKED
: рдкреИрдХ рдХрд┐рдП рдЧрдП рдврд╛рдВрдЪреЗ рдХреЛ рдХрдо рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЙрддреНрддрд░ рдХреЛ рдорд╛рдкрдирд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдХреЛрдб рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдиреЗ рдХреЛрдИ рдордВрджреА рдирд╣реАрдВ рджрд┐рдЦрд╛рдИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣реЗрдбрд░ рдореЗрдВ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдЕрднреА рднреА рддрдп рд╣реИред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдмреАрдИ рдХреЛ рддреБрд▓рдирд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдХреЛ LE рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдореЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
using BE16 = BigEndian<uint16_t>; using BE32 = BigEndian<uint32_t>; struct Seqnum : BE32 { using BE32::BE32; template<typename Integral> Seqnum operator+(Integral increment) const { static_assert(std::is_integral_v<Integral>); return Seqnum{static_cast<uint32_t>(native() + increment)}; } } PACKED; struct IP : BE32 { using BE32::BE32; } PACKED; struct L4Port : BE16 { using BE16::BE16; } PACKED;
рд╕реБрд░рдХреНрд╖рд┐рдд рдЯреАрд╕реАрдкреА рд╣реИрдбрд░ рд╕рдВрд░рдЪрдирд╛ enum TCPFlag : uint8_t { TH_FIN = 0x01, TH_SYN = 0x02, TH_RST = 0x04, TH_PUSH = 0x08, TH_ACK = 0x10, TH_URG = 0x20, TH_ECE = 0x40, TH_CWR = 0x80, }; using TCPFlags = std::underlying_type_t<TCPFlag>; struct TCPHeader { L4Port th_sport; L4Port th_dport; Seqnum th_seq; Seqnum th_ack; uint32_t th_flags2 : 4; uint32_t th_off : 4; TCPFlags th_flags; BE16 th_win; uint16_t th_sum; BE16 th_urp; uint16_t header_length() const { return th_off << 2; } void set_header_length(uint16_t len) { th_off = len >> 2; } uint8_t* payload() { return reinterpret_cast<uint8_t*>(this) + header_length(); } const uint8_t* payload() const { return reinterpret_cast<const uint8_t*>(this) + header_length(); } }; static_assert(sizeof(TCPHeader) == 20);
TCPFlag
рдХреЛ TCPFlag
enum class
рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЭрдВрдбреЗ рдкрд░ рдХреЗрд╡рд▓ рджреЛ рдСрдкрд░реЗрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ ( &
) рдпрд╛ рдЭрдВрдбреЗ рдХреЛ рдПрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ ( |
) - рдХреЛрдИ рднреНрд░рдо рдирд╣реАрдВ рд╣реИред- рдмрд┐рдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрджрд┐рдо рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдХреЗ рддрд░реАрдХреЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
- рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреНрд▓рд╛рд╕рд┐рдХ рдЫреЛрдбрд╝ рджрд┐рдП рдЧрдП рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо
рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдкрд╛рджрди рддреБрдЪреНрдЫ рдереЗред рдХреЛрдб рдХреНрд▓реАрдирд░ рд╣реИ:
auto tcp = packet->tcp_header(); - return make_response(packet, - cookie_make(packet, rte_be_to_cpu_32(tcp->th_seq)), - rte_cpu_to_be_32(rte_be_to_cpu_32(tcp->th_seq) + 1), - TH_SYN | TH_ACK); + return make_response(packet, cookie_make(packet, tcp->th_seq.native()), + tcp->th_seq + 1, TH_SYN | TH_ACK); }
рднрд╛рдЧ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рдиреЗ рдХреЛрдб рдХреЛ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛:
- void check_packet(int64_t, int64_t, uint8_t, bool); + void check_packet(std::optional<Seqnum>, std::optional<Seqnum>, TCPFlags, bool);
рдЕрдЪрд╛рдирдХ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдк рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЯреАрд╕реАрдкреА рд╡рд┐рдВрдбреЛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯреНрд░реИрдлрд┐рдХ рдХреЛ рднреА рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
// window size auto wscale_ratio = options().wscale_dst - options().wscale_src; if (wscale_ratio < 0) { - auto window_size = header.window_size() / (1 << (-wscale_ratio)); + auto window_size = header.window_size().native() / (1 << (-wscale_ratio)); if (header.window_size() && window_size < 1) { window_size = WINDOW_SIZE_MIN; } header_out.window_size(window_size); } else { - auto window_size = header.window_size() * (1 << (wscale_ratio)); + auto window_size = header.window_size().native() * (1 << (wscale_ratio)); if (window_size > WINDOW_SIZE_MAX) { window_size = WINDOW_SIZE_MAX; }
рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрджрд╛рд╣рд░рдг: рдореВрд▓ рдХреЛрдб рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдмреАрдИ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдЬрдм
0
рдмрдЬрд╛рдп
Raw{}
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ
0
рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╕ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ (рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИ)ред рддреБрд░рдВрдд рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЕрд╕рдлрд▓ рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ 0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рддреНрд░реБрдЯрд┐ рдЬрд▓реНрдж рд╣реА рдорд┐рд▓ рдЬрд╛рдПрдЧреА, рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдмрд╛рдЗрдЯ рдХреНрд░рдо рдореЗрдВ рд╕рдорд╛рди рд╣реИред
- auto cookie = cookie_make_inner(tuple, rte_be_to_cpu_32(0)); + auto cookie = cookie_make_inner(tuple, 0);
рдПрдХ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ
def_seq
рдФрд░
cookie
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдмреЗрдореЗрд▓ рдХреЛ
def_seq
, рдлрд┐рд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд╣рд▓реЗ рдХреНрдпреЛрдВ рдкрд╛рд░рд┐рдд рд╣реБрдЖ - рдРрд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХред
- const uint32_t def_seq = 0xA7A7A7A7; - const uint32_t def_ack = 0xA8A8A8A8; + const Seqnum def_seq{0x12345678}; + const Seqnum def_ack{0x90abcdef}; ... - auto cookie = rte_be_to_cpu_32(_tcph->th_ack); + auto cookie = _tcph->th_ack; ASSERT_NE(def_seq, cookie);
рдкрд░рд┐рдгрд╛рдо
рдиреАрдЪреЗ рдкрдВрдХреНрддрд┐ рд╣реИ:
- рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдХ рдмрдЧ рдФрд░ рдХрдИ рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реАрдВред
- рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдиреЗ рдореБрдЭреЗ рд╕рдВрджрд┐рдЧреНрдз рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЫрд╛рдВрдЯрд╛, рдкрдардиреАрдпрддрд╛ рдмрдврд╝реАред
- рдкреНрд░рджрд░реНрд╢рди рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рддреАрдиреЛрдВ рдмрд┐рдВрджреБ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдерд╛ред
рдХреНрдпрд╛ рдЖрдк рд╕рдЦреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЦреБрдж рдХрд╛ рдмреАрдорд╛ рдХрд░рддреЗ рд╣реИрдВ?