{"id":487044,"date":"2026-07-13T06:00:50","date_gmt":"2026-07-13T06:00:50","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=487044"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=487044","title":{"rendered":"\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f TUN GSO \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u043c VPN-\u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0430 Java"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 TUN GSO, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d <code>virtio_net_hdr<\/code>, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438\u0441\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 VPN-\u0441\u0435\u0440\u0432\u0435\u0440. \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c VPN \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 Java, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 Java. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0443 \u043d\u0435\u0451 C-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u043f\u044b\u0442\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u0434\u0435\u044e \u043d\u0430 \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a.<\/p>\n<h3>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435<\/h3>\n<p>\u041c\u043e\u0439 VPN-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Java. \u041e\u0441\u043d\u043e\u0432\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u2014 Java NIO, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043d\u043a\u043e\u0439 \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 (<code>epoll<\/code> \u0432 Linux \u0438 <code>kqueue<\/code> \u0432 BSD\/macOS). \u041c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Reactor: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e I\/O-\u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043e\u0436\u0438\u0434\u0430\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>OP_ACCEPT<\/code>, <code>OP_READ<\/code> \u0438 <code>OP_WRITE<\/code>. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 NGINX.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0414\u0430\u043b\u0435\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a (<code>sslWorker<\/code>) \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 TLS \u0447\u0435\u0440\u0435\u0437 <code>SSLEngine<\/code> \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041e\u0442\u0442\u0443\u0434\u0430 \u043e\u043d\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 <code>\/dev\/net\/tun<\/code>. \u0412 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0443\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439: \u043f\u0430\u043a\u0435\u0442 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 TUN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0443.<\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 TUN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 IP-\u043f\u0430\u043a\u0435\u0442 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 1500 \u0431\u0430\u0439\u0442 (\u0442\u043e\u0447\u043d\u0435\u0435, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d MTU \u043a\u0430\u043d\u0430\u043b\u0430). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 TUN \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 64 \u041a\u0411 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0433\u043e TCP-\u043f\u043e\u0442\u043e\u043a\u0430, \u043e\u043d\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0443\u0436\u0435 \u043d\u0430\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 44 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u2014 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0430\u043a\u0435\u0442, \u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u044d\u0442\u0438\u0445 64 \u041a\u0411 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e:<\/p>\n<ul>\n<li>\n<p>44 \u0432\u044b\u0437\u043e\u0432\u0430 <code>read()<\/code> \u0438\u043b\u0438 <code>write()<\/code>;<\/p>\n<\/li>\n<li>\n<p>44 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c \u0438 \u044f\u0434\u0440\u043e\u043c (<code>user \u2192 kernel \u2192 user<\/code>);<\/p>\n<\/li>\n<li>\n<p>44 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>44 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (<code>skb<\/code>) \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0434\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>44 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/15a\/c5b\/11c\/15ac5b11ce4b9d580fe5d6048ef4290e.png\" alt=\"\u041e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0435\u0437 GSO \u0438 \u0441 TUN GSO\" width=\"1920\" height=\"840\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/15a\/c5b\/11c\/15ac5b11ce4b9d580fe5d6048ef4290e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/15a\/c5b\/11c\/15ac5b11ce4b9d580fe5d6048ef4290e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0435\u0437 GSO \u0438 \u0441 TUN GSO<\/figcaption><\/div>\n<\/figure>\n<p><em>\u0420\u0438\u0441. 2. \u041e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0435\u0437 GSO \u0438 \u0441 TUN GSO: 44 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u043e\u0442\u0438\u0432 \u043e\u0434\u043d\u043e\u0433\u043e.<\/em><\/p>\n<p>\u0421\u0430\u043c\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0440\u043e\u0433\u043e\u0439. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0441\u0447\u0451\u0442 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0434\u0451\u0442 \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b, \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0434 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442 \u043d\u0435 \u043d\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 TLS \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u0430 \u043d\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: <strong>\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 TUN \u043a\u0430\u0436\u0434\u044b\u0439 TCP-\u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438?<\/strong> \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u044d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c?<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043f\u043e \u0441\u0443\u0442\u0438, \u0434\u0432\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430 \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c Linux, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>TUN GSO (Generic Segmentation Offload)<\/strong>. \u0418\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u044f \u0438 \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0430\u043b\u043e. \u0412 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0435\u0451 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442, \u0430 \u0432 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0430\u0431\u0437\u0430\u0446\u0430\u043c\u0438 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0435\u0439 \u00ab\u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c GSO\u00bb. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/elixir.bootlin.com\/linux\/latest\/source\/drivers\/net\/tun.c\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 TUN<\/a>, <a href=\"https:\/\/docs.kernel.org\/networking\/tuntap.html\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u044f\u0434\u0440\u0430<\/a>, <a href=\"https:\/\/docs.oasis-open.org\/virtio\/virtio\/v1.2\/virtio-v1.2.html\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e VirtIO<\/a> \u0438 \u043a\u043e\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 VPN-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u2014 \u0442\u0435\u043c \u0436\u0435 \u043f\u0443\u0442\u0451\u043c \u0432 \u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0448\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/tailscale.com\/blog\/more-throughput\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 wireguard-go \u0438 Tailscale<\/a>.<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 TUN GSO<\/h3>\n<p>\u0418\u0434\u0435\u044f TUN GSO (<strong>Generic Segmentation Offload<\/strong>) \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0431\u0430\u0442\u0447\u0438\u043d\u0433 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435, \u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437 TUN \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0443\u0436\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 TCP-\u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 <strong>\u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 IP-\u043f\u0430\u043a\u0435\u0442<\/strong> \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441 \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0443\u0442\u0438: \u043d\u0430\u0440\u0435\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u043e MSS \u0443\u0436\u0435 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 \u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0442\u043e\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 TUN GSO (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434 Linux), \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442 \u0432 TLS \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 TUN \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0430\u043a\u0435\u0442, <strong>\u043e\u0442\u043a\u0443\u0434\u0430 \u044f\u0434\u0440\u043e \u0443\u0437\u043d\u0430\u0435\u0442<\/strong>, \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c? \u041a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 MSS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c? \u0413\u0434\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a? \u041d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b? \u042d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0442\u043e\u0442 IP-\u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443.<\/p>\n<p>\u041e\u0442\u0432\u0435\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f <strong>\u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c<\/strong>. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043d <code>virtio_net_hdr<\/code>.<\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u0430\u043c \u043e\u043d \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f. \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0435 VirtIO, \u043d\u043e \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c Linux \u0441\u0442\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f offload-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 TUN \u0442\u043e\u0436\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c <code>virtio_net_hdr<\/code>, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 GSO.<\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24f\/6c8\/3de\/24f6c83deef1d81b943ddfaa26e455e2.png\" alt=\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430\" width=\"1920\" height=\"680\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/24f\/6c8\/3de\/24f6c83deef1d81b943ddfaa26e455e2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24f\/6c8\/3de\/24f6c83deef1d81b943ddfaa26e455e2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p><em>\u0420\u0438\u0441. 1. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430: 10-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 virtio_net_hdr, \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 IP-\u043f\u0430\u043a\u0435\u0442.<\/em><\/p>\n<p>\u0421\u0430\u043c IP-\u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0412\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <code>virtio_net_hdr<\/code>: \u0442\u0438\u043f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 10 \u0431\u0430\u0439\u0442 \u2014 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0451\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 IP-\u043f\u0430\u043a\u0435\u0442. \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435\u043c \u043d\u0430 MTU-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043f\u0443\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u044f\u0434\u0440\u043e, \u0430 \u043c\u044b \u0441\u0430\u043c\u0438: \u0441\u0432\u043e\u0438\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u0430 \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0442\u043e\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 TUN GSO \u2014 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0440\u0435\u0437\u0430\u0442\u044c, \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 TLS \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c).<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0443\u0436\u0435 \u043d\u0430\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443. \u0412\u043c\u0435\u0441\u0442\u043e <strong>44 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432<\/strong> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <strong>\u043e\u0434\u0438\u043d<\/strong>, \u0430 \u0441\u043e\u0440\u043e\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 <code>skb<\/code> \u0438 \u0441\u043e\u0440\u043e\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0441\u0442\u0435\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f.<\/p>\n<h3>\u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b virtio_net_hdr<\/h3>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e 10 \u0431\u0430\u0439\u0442 \u0438 \u0441\u0442\u043e\u0438\u0442 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u2014 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u044b\u0447\u043d\u044b\u043c, \u043d\u0435-GSO. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043d, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>IFF_VNET_HDR<\/code> (\u0432 <code>TUNSETIFF<\/code>); \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>TUNSETVNETHDRSZ(10)<\/code>, \u0447\u0442\u043e\u0431\u044b \u044f\u0434\u0440\u043e \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438 \u0432 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435. \u0412\u0441\u0435 \u043c\u043d\u043e\u0433\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f \u044f\u0434\u0440\u043e \u043f\u0438\u0448\u0435\u0442 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0431\u0430\u0439\u0442 \u0445\u043e\u0441\u0442\u0430 \u2014 \u043d\u0430 x86-64 \u0438 ARM \u044d\u0442\u043e <strong>little-endian<\/strong> (\u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>TUNSETVNETLE<\/code>).<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0420\u0430\u0437\u043c\u0435\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u043e\u043b\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>flags<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430: \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0434\u043e\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>gso_type<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u0438\u043f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: NONE \/ TCPv4 \/ TCPv6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>hdr_len<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 IP+TCP (\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430, \u0435\u0451 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>gso_size<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">MSS &#8212; \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0440\u0435\u0437\u043a\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">6<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>csum_start<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 (\u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 IP-\u043f\u0430\u043a\u0435\u0442\u0430), \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>csum_offset<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e <code>csum_start<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u043d\u0435\u0441\u0451\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u0437 \u043e\u0434\u043d\u0438\u0445 \u043d\u0443\u043b\u0435\u0439: <code>gso_type = NONE<\/code>, <code>flags = 0<\/code>.<\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>flags<\/code> (\u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u043c\u044b\u0441\u043b<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>VIRTIO_NET_HDR_F_NEEDS_CSUM<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x01<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 <strong>\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f<\/strong> (\u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a), \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u043e\u0431\u044f\u0437\u0430\u043d \u0435\u0451 \u0434\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>VIRTIO_NET_HDR_F_DATA_VALID<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x02<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438: \u044f\u0434\u0440\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u0441\u0443\u043c\u043c\u0430 \u0443\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430, \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u00bb<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>gso_type<\/code> (\u0442\u0438\u043f \u0432 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u0431\u0438\u0442\u0430\u0445, <code>0x80<\/code> \u2014 ECN-\u0444\u043b\u0430\u0433 \u043f\u043e\u0432\u0435\u0440\u0445):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0421\u043c\u044b\u0441\u043b<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>VIRTIO_NET_HDR_GSO_NONE<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>VIRTIO_NET_HDR_GSO_TCPV4<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>1<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">TCP\/IPv4 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>VIRTIO_NET_HDR_GSO_TCPV6<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>4<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">TCP\/IPv6 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>VIRTIO_NET_HDR_GSO_ECN<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>0x80<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">OR-\u0444\u043b\u0430\u0433: \u0432 TCP \u0431\u044b\u043b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d CWR (ECN)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0430\u0440\u0430 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043b\u0435\u0433\u043a\u043e \u0441\u043f\u043e\u0442\u043a\u043d\u0443\u0442\u044c\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <strong>\u0432\u0441\u0435\u0433\u0434\u0430<\/strong> \u0438 \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u00bb, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 10 \u0431\u0430\u0439\u0442, \u0434\u0430\u043b\u044c\u0448\u0435 <code>position = 10<\/code>\u00bb, \u0438 \u043e\u0442\u0442\u0443\u0434\u0430 \u0438\u0434\u0451\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 IP-\u043f\u0430\u043a\u0435\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><code>ByteBuffer<\/code> \u0432 Java \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e big-endian, \u0430 \u043f\u043e\u043b\u044f \u0437\u0434\u0435\u0441\u044c little-endian \u2014 \u0442\u0440\u0438 <code>u16<\/code>-\u043f\u043e\u043b\u044f \u043d\u0430\u0434\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u044f\u0432\u043d\u044b\u043c <code>LITTLE_ENDIAN<\/code> (\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 <code>Short.reverseBytes<\/code>), \u0438\u043d\u0430\u0447\u0435 <code>gso_size<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043c\u0443\u0441\u043e\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u043b\u0438\u043b\u043e\u0441\u044c \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 allocation-free \u043a\u043b\u0430\u0441\u0441 <code>VnetHdr<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 10 \u0431\u0430\u0439\u0442 \u043f\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u043c\u0443 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0432 \u0431\u0443\u0444\u0435\u0440\u0435. \u0412\u0441\u044e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0443 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0448\u0435 \u0432\u0438\u0434\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u0445, \u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<pre><code class=\"java\">public final class VnetHdr {    \/** \u0420\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u2014 \u0435\u0433\u043e \u0436\u0435 \u043e\u0442\u0434\u0430\u0451\u043c \u0432 TUNSETVNETHDRSZ(10). *\/    public static final int LEN = 10;    \/\/ \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.    private static final int FLAGS_OFF = 0;        \/\/ u8    private static final int GSO_TYPE_OFF = 1;     \/\/ u8    private static final int HDR_LEN_OFF = 2;      \/\/ u16 LE \u2014 \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 IP+TCP (\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430)    private static final int GSO_SIZE_OFF = 4;     \/\/ u16 LE \u2014 MSS    private static final int CSUM_START_OFF = 6;   \/\/ u16 LE \u2014 \u043e\u0442\u043a\u0443\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 (\u043e\u0442 IP)    private static final int CSUM_OFFSET_OFF = 8;  \/\/ u16 LE \u2014 \u043f\u043e\u043b\u0435 \u0441\u0443\u043c\u043c\u044b, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e csum_start    public static final int F_NEEDS_CSUM = 0x01;   \/\/ \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442    public static final int F_DATA_VALID = 0x02;   \/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438: \u0441\u0443\u043c\u043c\u0430 \u0443\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430    public static final int GSO_NONE = 0;    public static final int GSO_TCPV4 = 1;    public static final int GSO_TCPV6 = 4;    public static final int GSO_ECN = 0x80;        \/\/ OR-\u0444\u043b\u0430\u0433 \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0438\u043f\u0430    private VnetHdr() {    }    \/** gso_type \u0441 \u0432\u044b\u0447\u0442\u0435\u043d\u043d\u044b\u043c ECN-\u0444\u043b\u0430\u0433\u043e\u043c. *\/    public static int gsoType(ByteBuffer b, int off) {        return b.get(off + GSO_TYPE_OFF) &amp; ~GSO_ECN &amp; 0xFF;    }    public static int gsoSize(ByteBuffer b, int off) {        return u16le(b, off + GSO_SIZE_OFF);    }    \/\/ \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e ByteBuffer.getShort(): \u0443 \u043d\u0435\u0433\u043e big-endian \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0430 \u043f\u043e\u043b\u044f \u0437\u0434\u0435\u0441\u044c little-endian.    private static int u16le(ByteBuffer b, int off) {        return (b.get(off) &amp; 0xFF) | ((b.get(off + 1) &amp; 0xFF) &lt;&lt; 8);    }    private static void putU16le(ByteBuffer b, int off, int v) {        b.put(off, (byte) (v &amp; 0xFF));        b.put(off + 1, (byte) ((v &gt;&gt;&gt; 8) &amp; 0xFF));    }    \/**     * \u041f\u0438\u0448\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c NEEDS_CSUM: \u044f\u0434\u0440\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u043f\u043e gsoSize     * \u0438 \u0434\u043e\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0443\u043c\u043c\u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430. csum_start = \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 TCP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (ipHdrLen),     * csum_offset = 16 (\u043f\u043e\u043b\u0435 \u0441\u0443\u043c\u043c\u044b \u0432 TCP). \u0412 \u043f\u043e\u043b\u0435 \u0441\u0443\u043c\u043c\u044b TCP \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043b\u0435\u0436\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430     * \u043f\u0441\u0435\u0432\u0434\u043e\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.     *\/    public static void writeSuperpacketHeader(ByteBuffer b, int off, int gsoType, int gsoSize,                                              int ipHdrLen, int tcpHdrLen) {        b.put(off + FLAGS_OFF, (byte) F_NEEDS_CSUM);        b.put(off + GSO_TYPE_OFF, (byte) gsoType);        putU16le(b, off + HDR_LEN_OFF, ipHdrLen + tcpHdrLen);        putU16le(b, off + GSO_SIZE_OFF, gsoSize);        putU16le(b, off + CSUM_START_OFF, ipHdrLen);        putU16le(b, off + CSUM_OFFSET_OFF, 16);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 TUN: \u0442\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b (<code>TUNSETOFFLOAD(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6)<\/code>), \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0442\u0440\u0438 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u043f\u043e \u043f\u0430\u0440\u0435 <code>(gso_type, flags)<\/code>:<\/p>\n<ul>\n<li>\n<p><strong>\u0421\u043b\u0443\u0447\u0430\u0439 1 \u2014 <\/strong><code><strong>gso_type = NONE, flags = 0<\/strong><\/code> (\u0438\u043b\u0438 <code>DATA_VALID<\/code>). \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0441 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0443\u043c\u043c\u0430\u043c\u0438. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c 10 \u0431\u0430\u0439\u0442 \u0438 \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0441\u0442\u0430\u0440\u043e\u043c\u0443 \u043f\u0443\u0442\u0438. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0430\u0437\u0435 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f (\u0442\u043e\u043b\u044c\u043a\u043e <code>IFF_VNET_HDR<\/code> + <code>TUN_F_CSUM<\/code>, \u0431\u0435\u0437 TSO) \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 100% \u0442\u0440\u0430\u0444\u0438\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043b\u0443\u0447\u0430\u0439 2 \u2014 <\/strong><code><strong>gso_type = NONE, flags = NEEDS_CSUM<\/strong><\/code>. \u041f\u0430\u043a\u0435\u0442 \u0441 <em>\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439<\/em> \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u043e\u0439: \u044f\u0434\u0440\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u0436\u0434\u0451\u0442, \u0447\u0442\u043e \u0441\u0443\u043c\u043c\u0443 \u0434\u043e\u0441\u0447\u0438\u0442\u0430\u044e\u0442. \u041c\u044b \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u043d\u0430\u0448 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043d\u0446\u0435 TLS-\u0442\u0443\u043d\u043d\u0435\u043b\u044f, \u0430 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u043c\u0438 \u0438 <em>\u043d\u0430\u0448\u0438\u043c<\/em> \u044f\u0434\u0440\u043e\u043c. \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u043a\u0435\u0442 \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u2014 \u044d\u0442\u043e \u0442\u0438\u0445\u0438\u0439 \u0434\u0440\u043e\u043f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043b\u0443\u0447\u0430\u0439 3 \u2014 <\/strong><code><strong>gso_type = TCPV4<\/strong><\/code><strong> \u0438\u043b\u0438 <\/strong><code><strong>TCPV6<\/strong><\/code>. \u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442: IP- \u0438 TCP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435, \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 TCP \u2014 \u0434\u043e ~64 \u041a\u0411, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 MSS. \u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <code>NEEDS_CSUM<\/code>. \u041f\u043e\u043b\u0435 <code>gso_size<\/code> \u2014 \u044d\u0442\u043e MSS, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u043d\u0430\u0440\u0435\u0437\u0430\u0442\u044c (\u044f\u0434\u0440\u043e \u0432\u0437\u044f\u043b\u043e \u0435\u0433\u043e \u0438\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043e\u0431\u044b\u0447\u043d\u043e 1460; <strong>\u0434\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0435\u043c\u0443, \u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438\u0437 MTU<\/strong>). \u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0438 \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0434\u0435\u043b\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bbc\/bb8\/d41\/bbcbb8d41a6129a884dfddc5e114a768.png\" alt=\"\u0422\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 TUN\" width=\"1920\" height=\"860\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bbc\/bb8\/d41\/bbcbb8d41a6129a884dfddc5e114a768.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bbc\/bb8\/d41\/bbcbb8d41a6129a884dfddc5e114a768.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 TUN<\/figcaption><\/div>\n<\/figure>\n<p><em>\u0420\u0438\u0441. 3. \u0422\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 TUN \u2014 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u0430\u0440\u0435 (gso_type, flags).<\/em><\/p>\n<p>\u041e\u0434\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u043c\u0435\u0440\u0442\u044c: \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b (<code>NEEDS_CSUM<\/code>) \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430 <strong>\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u0448\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0438 \u043d\u0430\u0448\u0438\u043c \u044f\u0434\u0440\u043e\u043c<\/strong>. \u0412\u0441\u0451, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u2014 TLS-\u0442\u0443\u043d\u043d\u0435\u043b\u044c \u0434\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043d\u0430\u0440\u0435\u0437\u0430\u043b\u0438 \u0441\u0430\u043c\u0438, \u2014 \u043e\u0431\u044f\u0437\u0430\u043d\u043e \u043d\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b. \u041b\u044e\u0431\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 <strong>\u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442<\/strong>: \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0438\u0437 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u0447\u0438\u0442\u0430\u043b\u0430\u0441\u044c \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043b\u0438\u043d\u044b \u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430.<\/p>\n<h3>\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430\u0440\u0435\u0437\u043a\u0430. \u0421\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440 \u2014 \u0447\u0438\u0441\u0442\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f: \u043d\u0430 \u0432\u0445\u043e\u0434 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 <code>n<\/code> \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 MTU-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438, \u0437\u0430\u043d\u043e\u0432\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0443\u043c\u043c\u0430\u043c\u0438 IP \u0438 TCP. \u0421\u0430\u043c \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f; \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u043f\u0443\u043b\u0430 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0442\u0434\u0430\u044e\u0442\u0441\u044f \u0432 <code>sink<\/code>.<\/p>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e <code>ceil(payload \/ gso_size)<\/code>, \u0433\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u043e\u0440\u043e\u0447\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445:<\/p>\n<pre><code class=\"java\">@Overridepublic int segment(ByteBuffer superpacket, int gsoSize, Consumer&lt;ByteBuffer&gt; sink) {    int ipOff = superpacket.position();        ByteBuffer ipHdrBuf = pool.get().clear();    ByteBuffer tcpHdrBuf = pool.get().clear();    try {        IpTcpHdr hdr = IpTcpHdr.getIpTcpHeader(superpacket, ipOff, ipHdrBuf, tcpHdrBuf);        int count = hdr.payloadLength() \/ gsoSize;        int lastLen = hdr.payloadLength() % gsoSize;        int total = count + (lastLen &gt; 0 ? 1 : 0);        for (int i = 0; i &lt; count; i++) {            emit(sink, superpacket, ipOff, hdr, i, gsoSize, gsoSize, i == total - 1);        }        if (lastLen &gt; 0) {            emit(sink, superpacket, ipOff, hdr, count, gsoSize, lastLen, true);        }        return total;    } finally {        pool.release(ipHdrBuf);        pool.release(tcpHdrBuf);    }}\/\/ \u0421\u0435\u0433\u043c\u0435\u043d\u0442 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 sink, \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0434\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u0435\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442private void emit(Consumer&lt;ByteBuffer&gt; sink, ByteBuffer superpacket, int ipOff, IpTcpHdr hdr,                  int i, int mss, int chunk, boolean last) {    sink.accept(fillSegment(superpacket, ipOff, hdr, i, mss, chunk, last));}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u2014 \u0432 <code>fillSegment<\/code>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 IP+TCP \u0438 \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043c \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u043a \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443:<\/p>\n<ul>\n<li>\n<p><code>tcp.seq<\/code> += <code>i * gso_size<\/code> \u2014 \u0441 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u043e\u0439 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e 2\u00b3\u00b2, \u0442\u043e \u0435\u0441\u0442\u044c \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f u32;<\/p>\n<\/li>\n<li>\n<p><code>FIN<\/code> \u0438 <code>PSH<\/code> \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 <strong>\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c<\/strong> \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 (\u0438\u043d\u0430\u0447\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 \u043a\u0443\u0441\u043a\u0435), \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0441 ECN \u2014 \u043a\u043e\u0433\u0434\u0430 \u0432 <code>gso_type<\/code> \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d <code>GSO_ECN<\/code> \u0438 <code>CWR<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u2014 \u0432 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f: <code>TUN_F_TSO_ECN<\/code> \u043c\u044b \u0432 <code>TUNSETOFFLOAD<\/code> \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u044b \u0441 ECN-\u0431\u0438\u0442\u043e\u043c \u044f\u0434\u0440\u043e \u043d\u0435 \u043e\u0442\u0434\u0430\u0451\u0442, \u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0441\u0430\u043c\u043e, \u043d\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f IPv4 \u2014 <code>id<\/code> += <code>i<\/code> \u0438 <code>tot_len<\/code>; \u0434\u043b\u044f IPv6 \u2014 <code>payload_len<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c <strong>\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e<\/strong>: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a IPv4, \u043f\u043e\u0442\u043e\u043c TCP (\u043f\u0441\u0435\u0432\u0434\u043e\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a + \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a + \u043a\u0443\u0441\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445).<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"java\">\/** * \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 i: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 IP+TCP \u0438 chunk-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, * \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0435\u0440-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f (seq, id\/tot_len \u0438\u043b\u0438 payload_len, FIN\/PSH-\u043d\u0430-\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c) * \u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b. mss \u2014 \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 * chunk \u2014 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 (== mss \u0443 \u0432\u0441\u0435\u0445, \u043a\u0440\u043e\u043c\u0435, * \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e). *\/private ByteBuffer fillSegment(ByteBuffer superpacket, int ipOff, IpTcpHdr hdr,                               int i, int mss, int chunk, boolean last) {    int ipHdrLen = hdr.ipHeaderLength();    int tcpOff = ipHdrLen;    int hdrLen = hdr.headerLength();    int segEnd = hdrLen + chunk;    ByteBuffer seg = pool.get().clear();    seg.put(0, hdr.ipHeader(), 0, ipHdrLen);    seg.put(ipHdrLen, hdr.tcpHeader(), 0, hdr.tcpHeaderLength());    seg.put(hdrLen, superpacket, ipOff + hdrLen + i * mss, chunk);    \/\/ \u041f\u043e\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f TCP (\u043f\u043e\u0440\u0442\u044b\/ack\/window\/\u043e\u043f\u0446\u0438\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b).    setTcpSeq(seg, tcpOff, hdr.tcpSeq() + i * mss);    int flags = last ? hdr.tcpFlags() : (hdr.tcpFlags() &amp; ~(TCP_FIN | TCP_PSH));    setTcpFlags(seg, tcpOff, flags);    \/\/ \u041f\u043e\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f IP + \u0441\u0443\u043c\u043c\u044b (\u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442; \u043f\u043e\u0440\u044f\u0434\u043e\u043a: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u044f, \u043f\u043e\u0442\u043e\u043c \u0441\u0443\u043c\u043c\u044b).    if (hdr.ipVersion() == 4) {        setIpv4Id(seg, 0, hdr.ipv4Id() + i);        setIpv4TotalLength(seg, 0, segEnd);        InetChecksum.writeIpv4HeaderChecksum(seg, 0);        InetChecksum.writeTransportChecksumV4(seg, 0, tcpOff, segEnd);    } else {        setIpv6PayloadLength(seg, 0, segEnd - ipHdrLen);   \/\/ TCP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a + chunk; \u0443 IPv6 \u043d\u0435\u0442 \u0441\u0443\u043c\u043c\u044b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430        InetChecksum.writeTransportChecksumV6(seg, 0, tcpOff, segEnd);    }    seg.position(0).limit(segEnd);    return seg;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u0435\u043d: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u044b \u2014 \u0438\u043d\u0430\u0447\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u043f\u043e \u0435\u0449\u0451 \u043d\u0435 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443. \u0418 <code>mss<\/code> (\u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430, \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438 seq \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439) \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u0451\u043d \u043e\u0442 <code>chunk<\/code> (\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430).<\/p>\n<h3>\u041f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438<\/h3>\n<p>\u0418\u0445 \u043d\u0430\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u2014 \u043d\u0435 \u043f\u0440\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u0443\u044e, \u0430 \u043f\u0440\u043e \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438.<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u2014 \u044d\u0442\u043e 90% \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.<\/strong> \u0421\u0438\u043c\u043f\u0442\u043e\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435: \u0442\u0440\u0430\u0444\u0438\u043a \u00ab\u0438\u0434\u0451\u0442\u00bb, <code>speedtest<\/code> \u0434\u0430\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043d\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u043b\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u0430\u044e\u0442. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u0441\u0443\u043c\u043c\u044b \u043f\u0435\u0440\u0432\u044b\u043c\u0438, \u0434\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0447\u0451\u0442 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/strong> RED, \u0442\u043e\u043a\u0435\u043d-\u0431\u0430\u043a\u0435\u0442 \u0448\u0435\u0439\u043f\u0435\u0440\u0430 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442 \u043a\u0430\u043a <code>gso_segs = ceil(payload \/ gso_size)<\/code> \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 \u2014 \u0430 \u043d\u0435 \u043a\u0430\u043a \u00ab1 \u043f\u0430\u043a\u0435\u0442\u00bb. \u0418\u043d\u0430\u0447\u0435 RED \u0434\u0440\u043e\u043f\u0430\u0435\u0442 \u043f\u043e 64 \u041a\u0411 \u0437\u0430 \u0440\u0430\u0437 (\u044d\u0442\u043e \u0446\u0435\u043b\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u2014 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0442\u043e\u0440\u043c \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043c\u0438\u0442\u043e\u0432), \u0448\u0435\u0439\u043f\u0435\u0440 \u043d\u0435\u0434\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0430\u0437 \u0432 40, \u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432\u0440\u0443\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>Little-endian \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.<\/strong> \u041f\u0440\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044e: \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e <code>order(LITTLE_ENDIAN)<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u043e\u043c\u0435\u0440 ioctl <\/strong><code><strong>TUNSETOFFLOAD<\/strong><\/code><strong> \u2014 \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0431\u0430\u0439\u0442\u0435.<\/strong> \u0412 Java \u043d\u0435\u0442 \u0445\u0435\u0434\u0435\u0440\u043e\u0432 \u0438\u0437 \u044f\u0434\u0440\u0430 \u043b\u0438\u043d\u0443\u043a\u0441, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439: \u0432 32 \u0431\u0438\u0442\u0430 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u043e\u043b\u044f \u2014 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u043c\u0435\u043d\u0430, \u0440\u0430\u0437\u043c\u0435\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u00ab\u0442\u0438\u043f\u00bb (\u0431\u0443\u043a\u0432\u0430 <code>'T'<\/code>, \u0435\u044e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b TUN) \u0438 \u0432 \u043c\u043b\u0430\u0434\u0448\u0435\u043c \u0431\u0430\u0439\u0442\u0435 \u043d\u043e\u043c\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u0414\u043b\u044f <code>TUNSETOFFLOAD = 0x400454D0<\/code> \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c \u044d\u0442\u043e <code>40<\/code> (\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <code>_IOW<\/code> \u2014 \u00ab\u043f\u0438\u0448\u0435\u043c \u0432 \u044f\u0434\u0440\u043e\u00bb) \u00b7 <code>04<\/code> (\u0440\u0430\u0437\u043c\u0435\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430) \u00b7 <code>54<\/code> (<code>'T'<\/code>) \u00b7 <code>D0<\/code> (\u043d\u043e\u043c\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u2014 208).<\/p>\n<\/li>\n<\/ul>\n<h3>\u0427\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0437\u0430\u043c\u0435\u0440\u044b<\/h3>\n<p>\u0424\u0438\u0447\u0430 \u0443\u0436\u0435 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435 (\u043e\u0434\u043d\u043e \u044f\u0434\u0440\u043e, GraalVM, ZGC), \u0430 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Prometheus \u0438 Grafana. \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c \u0447\u0435\u0441\u0442\u043d\u043e: \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u00ab\u0434\u043e\/\u043f\u043e\u0441\u043b\u0435\u00bb \u043f\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u044f \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u0441 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c <code>TUN_GSO<\/code> \u043d\u0430 \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u043c \u0436\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0435, \u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e baseline-\u0441\u043d\u0438\u043c\u043a\u0430 \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u043d\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c. \u0417\u0430\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e \u0442\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u0432\u0441\u0451 \u0438 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u2014 \u0430\u043c\u043e\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<p>\u0417\u0430 \u0441\u0435\u0441\u0441\u0438\u044e \u043f\u043e\u0434 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 (\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430 \u043f\u0430\u0440\u0443 \u0441\u043e\u0442\u0435\u043d \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u0433\u0434\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u044b \u0442\u044f\u0436\u0451\u043b\u044b\u0435 \u00ab\u0442\u043e\u0440\u0440\u0435\u043d\u0442\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435\u00bb \u043f\u043e\u0442\u043e\u043a\u0438 \u0438 \u043b\u0451\u0433\u043a\u0438\u0439 \u0432\u0435\u0431-\u0441\u0451\u0440\u0444\u0438\u043d\u0433) \u0447\u0435\u0440\u0435\u0437 download-\u043f\u0443\u0442\u044c \u043f\u0440\u043e\u0448\u043b\u043e \u043e\u043a\u043e\u043b\u043e 2,4 \u043c\u043b\u043d \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 TUN. \u041e\u0434\u0438\u043d <code>read()<\/code> \u043e\u0442\u0434\u0430\u0451\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u043f\u0430\u043a\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u0436\u0435 \u0438 2,4 \u043c\u043b\u043d \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u0418\u0437 \u043d\u0438\u0445 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c\u0438 TCP-\u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 (\u0441\u043b\u0443\u0447\u0430\u0439 3), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0437\u0430\u0442\u044c, \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 805 \u0442\u044b\u0441\u044f\u0447; \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 ~1,6 \u043c\u043b\u043d \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0435 ACK-\u0438 (\u0441\u043b\u0443\u0447\u0430\u0438 1\/2), \u0438\u0445 \u0440\u0435\u0437\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0418 \u0432\u043e\u0442 \u044d\u0442\u0438 805 \u0442\u044b\u0441\u044f\u0447 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b \u0432 ~2,8 \u043c\u043b\u043d \u043f\u0440\u043e\u0432\u043e\u0434\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u043e\u0434\u0438\u043d <code>read()<\/code> \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0442\u0440\u0451\u0445 \u0441 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043e\u0439, \u0430 \u043d\u0430 \u0445\u0432\u043e\u0441\u0442\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u2014 \u0434\u0432\u0443\u0445-\u0442\u0440\u0451\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432. \u0412 \u043f\u0438\u043a\u043e\u0432\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443 \u0441\u0442\u0435\u043d\u0434 \u0447\u0438\u0442\u0430\u043b \u0438\u0437 TUN \u043e\u043a\u043e\u043b\u043e 2900 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u043d\u0430\u0440\u0443\u0436\u0443 ~5900 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432; \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0430\u043c\u043e\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043e\u0434\u0438\u043d \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442 \u2014 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u0434\u043e\u0445\u043e\u0434\u0438\u043b \u0434\u043e ~7,8.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0430 (download-\u043f\u0443\u0442\u044c)<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0437 TUN (= \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>read()<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\">~2,4 \u043c\u043b\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2014 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u043e\u0432 (\u0441\u043b\u0443\u0447\u0430\u0439 3, \u0440\u0435\u0437\u0430\u043b\u0438\u0441\u044c)<\/p>\n<\/td>\n<td>\n<p align=\"left\">~805 \u0442\u044b\u0441.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u2014 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (\u0441\u043b\u0443\u0447\u0430\u0438 1\/2)<\/p>\n<\/td>\n<td>\n<p align=\"left\">~1,6 \u043c\u043b\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 (\u0438\u0437 \u0442\u0435\u0445 805 \u0442\u044b\u0441. \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u043e\u0432)<\/p>\n<\/td>\n<td>\n<p align=\"left\">~2,8 \u043c\u043b\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 TUN (\u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u0430\u043c)<\/p>\n<\/td>\n<td>\n<p align=\"left\">~2,3 \u041a\u0411 (p50 ~1,3 \u041a\u0411, p99 ~15 \u041a\u0411)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0440\u0435\u0434\u043d\u0435\u0435 3,5; p99 ~24<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0438\u043a: \u0447\u0442\u0435\u043d\u0438\u0439\/\u0441 \u2192 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432\/\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">~2 900 \u2192 ~5 900<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (<code>tun_gso_drops<\/code>)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f9b\/76f\/677\/f9b76f677ad43cc6f0e7d08265fcc005.png\" alt=\"\u0417\u0430\u043c\u0435\u0440\u044b \u0441\u043e \u0441\u0442\u0435\u043d\u0434\u0430\" width=\"1920\" height=\"880\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f9b\/76f\/677\/f9b76f677ad43cc6f0e7d08265fcc005.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f9b\/76f\/677\/f9b76f677ad43cc6f0e7d08265fcc005.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0417\u0430\u043c\u0435\u0440\u044b \u0441\u043e \u0441\u0442\u0435\u043d\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<p><em>\u0420\u0438\u0441. 4. \u0417\u0430\u043c\u0435\u0440\u044b \u0441\u043e \u0441\u0442\u0435\u043d\u0434\u0430: \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0430\u043c\u043e\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/em><\/p>\n<p>\u0414\u0432\u0435 \u0432\u0435\u0449\u0438 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u043e.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 TUN \u0437\u0434\u0435\u0441\u044c \u2014 \u0432\u0441\u0435\u0433\u043e \u043f\u0430\u0440\u0430 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442, \u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0442\u043d\u044b\u0435 64. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438: \u0432 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435 \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0447\u0435\u0433\u043e \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0442\u044c. \u041d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c bulk-\u043f\u043e\u0442\u043e\u043a\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0434\u0440\u0443\u0433\u0430\u044f \u2014 \u0441\u0430\u043c\u044b\u0439 \u043a\u0440\u0443\u043f\u043d\u044b\u0439 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442, \u0447\u0442\u043e \u0441\u0442\u0435\u043d\u0434 \u0432\u0438\u0434\u0435\u043b \u0437\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439, \u0434\u043e\u0440\u043e\u0441 \u0434\u043e ~65 \u041a\u0411, \u0440\u043e\u0432\u043d\u043e \u0434\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043b\u043a\u0430, \u0438 \u0432\u043e\u0442 \u0442\u0430\u043c \u0430\u043c\u043e\u0440\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 ~44 \u043a \u043e\u0434\u043d\u043e\u043c\u0443.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, upload-\u043f\u0443\u0442\u044c (GRO-\u0441\u043a\u043b\u0435\u0439\u043a\u0430) \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b: \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432 TUN \u2014 360 \u0431\u0430\u0439\u0442, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0443\u043f\u0438\u0440\u0430\u043b\u0441\u044f \u0432 MTU. \u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0432 \u0442\u0435\u0441\u0442\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043b \u0438\u0437 \u043c\u0435\u043b\u043a\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0445 ACK-\u043e\u0432, \u0430 \u0438\u0445 \u043a\u043e\u0430\u043b\u0435\u0441\u0435\u0440 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442 \u2014 \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e. \u041d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0430\u043f\u043b\u043e\u0430\u0434\u0435 \u0441 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u043c\u0438 \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u043e \u0447\u0435\u0441\u0442\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u043f\u043e \u043d\u0435\u043c\u0443 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0443\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u043c\u0435\u0440\u043e\u043c.<\/p>\n<p>\u0418, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435: \u043d\u043e\u043b\u044c \u0434\u0440\u043e\u043f\u043e\u0432 \u043d\u0430 <code>tun_gso_drops<\/code> \u0437\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u0417\u043d\u0430\u0447\u0438\u0442, \u0440\u0430\u0437\u0431\u043e\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043f\u043e\u0441\u044b\u043f\u0430\u043b\u0438\u0441\u044c \u2014 \u0430 \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c \u0436\u0438\u0432\u0451\u0442 90% \u0432\u0441\u0435\u0445 \u0431\u0430\u0433\u043e\u0432 GSO.<\/p>\n<h3>\u0418\u0442\u043e\u0433: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043c\u044b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b\u0438<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0451 \u043a \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u0435, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u0441\u044f TUN GSO, \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043d\u0430 TUN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435.<\/p>\n<p>\u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e \u0442\u043e\u0439 \u0436\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u0430 \u0441\u0442\u0435\u043d\u0434\u0435. \u041d\u0430 download-\u043f\u0443\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0432\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043a\u0435\u0442 \u0431\u0435\u0437 GSO \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 <code>read()<\/code>. \u0412\u0441\u0435\u0433\u043e \u0442\u0430\u043a\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0437\u0430 \u0441\u0435\u0441\u0441\u0438\u044e \u043d\u0430\u0431\u0440\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u043a\u043e\u043b\u043e <strong>4,4 \u043c\u043b\u043d<\/strong> (\u22481,6 \u043c\u043b\u043d \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043b\u044e\u0441 \u22482,8 \u043c\u043b\u043d \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0434\u0440\u043e \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u043e \u0431\u044b \u043f\u043e\u0448\u0442\u0443\u0447\u043d\u043e). \u0421 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c GSO \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u043c\u0435\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u0432 <strong>2,4 \u043c\u043b\u043d<\/strong> \u0447\u0442\u0435\u043d\u0438\u0439 \u2014 \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 1,6 \u043c\u043b\u043d \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043b\u044e\u0441 805 \u0442\u044b\u0441. \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e 2,8 \u043c\u043b\u043d \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u2014 <strong>\u043e\u043a\u043e\u043b\u043e 2 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432<\/strong>: download-\u043f\u0443\u0442\u044c \u043f\u043e\u0445\u0443\u0434\u0435\u043b \u043d\u0430 <strong>~45%<\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 <code>user \u2194 kernel<\/code> \u0441\u0442\u0430\u043b\u043e \u0432 <strong>1,8 \u0440\u0430\u0437\u0430<\/strong> \u043c\u0435\u043d\u044c\u0448\u0435. \u0418 \u044d\u0442\u043e \u043d\u0430 \u00ab\u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e\u043c\u00bb \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u0435, \u0433\u0434\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u2014 \u043c\u0435\u043b\u043e\u0447\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u0447\u0435\u0433\u043e \u0443\u043a\u0440\u0443\u043f\u043d\u044f\u0442\u044c. \u041d\u0430 \u0442\u043e\u0439 \u0434\u043e\u043b\u0435, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u0447\u0435\u0441\u0442\u043d\u0435\u0435 \u2014 <strong>\u0432 3,5 \u0440\u0430\u0437\u0430<\/strong> (805 \u0442\u044b\u0441. \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e 2,8 \u043c\u043b\u043d), \u0430 \u043d\u0430 \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u043c \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u043e\u043c bulk-\u043f\u043e\u0442\u043e\u043a\u0435, \u0433\u0434\u0435 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442 \u0434\u043e\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0434\u043e 64 \u041a\u0411, \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 <\/p>\n<p>\u0418 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u0438 \u0441\u0438\u0441\u043a\u043e\u043b\u043b\u044b. \u0417\u0430 \u043a\u0430\u0436\u0434\u044b\u043c \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u044b\u043c <code>read()<\/code> \u0441\u0442\u043e\u0438\u0442 \u0435\u0449\u0451 \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 <code>skb<\/code>, \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043a, \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043f\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438. \u0418 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0442\u043e\u0436\u0435: \u043e\u0434\u0438\u043d, \u0430 \u043d\u0435 \u0441\u043e\u0440\u043e\u043a, \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u043f\u043e\u0438\u0441\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0430-\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u043f\u043e IP \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0448\u0435\u0439\u043f\u0435\u0440, \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0440\u0430\u0434\u0438 \u044d\u0442\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438 \u0432\u0441\u0451 \u0438 \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u043e\u0441\u044c.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1058404\/\">https:\/\/habr.com\/ru\/articles\/1058404\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 TUN GSO, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d virtio_net_hdr, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438\u0441\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 VPN-\u0441\u0435\u0440\u0432\u0435\u0440. \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c VPN \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 Java, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 Java. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0443 \u043d\u0435\u0451 C-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u043f\u044b\u0442\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u0434\u0435\u044e \u043d\u0430 \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a.\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e\u0431 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435\u041c\u043e\u0439 VPN-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Java. \u041e\u0441\u043d\u043e\u0432\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u2014 Java NIO, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043d\u043a\u043e\u0439 \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 (epoll \u0432 Linux \u0438 kqueue \u0432 BSD\/macOS). \u041c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Reactor: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e I\/O-\u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043e\u0436\u0438\u0434\u0430\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f OP_ACCEPT, OP_READ \u0438 OP_WRITE. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 NGINX.\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0414\u0430\u043b\u0435\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a (sslWorker) \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 TLS \u0447\u0435\u0440\u0435\u0437 SSLEngine \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0443\u0436\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041e\u0442\u0442\u0443\u0434\u0430 \u043e\u043d\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \/dev\/net\/tun. \u0412 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0443\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439: \u043f\u0430\u043a\u0435\u0442 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437 TUN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0443.\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 TUN-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c.\u041e\u0431\u044b\u0447\u043d\u044b\u0439 IP-\u043f\u0430\u043a\u0435\u0442 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 1500 \u0431\u0430\u0439\u0442 (\u0442\u043e\u0447\u043d\u0435\u0435, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d MTU \u043a\u0430\u043d\u0430\u043b\u0430). \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 TUN \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 64 \u041a\u0411 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0434\u043d\u043e\u0433\u043e TCP-\u043f\u043e\u0442\u043e\u043a\u0430, \u043e\u043d\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0443\u0436\u0435 \u043d\u0430\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 44 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u2014 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0430\u043a\u0435\u0442, \u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445.\u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u044d\u0442\u0438\u0445 64 \u041a\u0411 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e:44 \u0432\u044b\u0437\u043e\u0432\u0430 read() \u0438\u043b\u0438 write();44 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c \u0438 \u044f\u0434\u0440\u043e\u043c (user \u2192 kernel \u2192 user);44 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438;44 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (skb) \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0434\u0440\u0430;44 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430.\u041e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0435\u0437 GSO \u0438 \u0441 TUN GSO\u0420\u0438\u0441. 2. \u041e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0431\u0435\u0437 GSO \u0438 \u0441 TUN GSO: 44 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u0440\u043e\u0442\u0438\u0432 \u043e\u0434\u043d\u043e\u0433\u043e.\u0421\u0430\u043c\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0440\u043e\u0433\u043e\u0439. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0441\u0447\u0451\u0442 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0434\u0451\u0442 \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b, \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0434 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442 \u043d\u0435 \u043d\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 TLS \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u0430 \u043d\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.\u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 TUN \u043a\u0430\u0436\u0434\u044b\u0439 TCP-\u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438? \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u044d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c?\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043f\u043e \u0441\u0443\u0442\u0438, \u0434\u0432\u0430.\u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430 \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u044b\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c Linux, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f TUN GSO (Generic Segmentation Offload). \u0418\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u044f \u0438 \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0430\u043b\u043e. \u0412 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0435\u0451 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442, \u0430 \u0432 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0430\u0431\u0437\u0430\u0446\u0430\u043c\u0438 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0435\u0439 \u00ab\u043f\u0440\u043e\u0441\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c GSO\u00bb. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 TUN, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u044f\u0434\u0440\u0430, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e VirtIO \u0438 \u043a\u043e\u0434 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 VPN-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u2014 \u0442\u0435\u043c \u0436\u0435 \u043f\u0443\u0442\u0451\u043c \u0432 \u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0448\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 wireguard-go \u0438 Tailscale.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 TUN GSO\u0418\u0434\u0435\u044f TUN GSO (Generic Segmentation Offload) \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0431\u0430\u0442\u0447\u0438\u043d\u0433 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435, \u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e.\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437 TUN \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0443\u0436\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 TCP-\u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 IP-\u043f\u0430\u043a\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442. \u0414\u0430\u043b\u044c\u0448\u0435 \u0441 \u043d\u0438\u043c \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0443\u0442\u0438: \u043d\u0430\u0440\u0435\u0437\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u043e MSS \u0443\u0436\u0435 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 \u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0442\u043e\u0436\u0435 \u0443\u043c\u0435\u0435\u0442 TUN GSO (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434 Linux), \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442 \u0432 TLS \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c.\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441.\u0415\u0441\u043b\u0438 \u0432 TUN \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0430\u043a\u0435\u0442, \u043e\u0442\u043a\u0443\u0434\u0430 \u044f\u0434\u0440\u043e \u0443\u0437\u043d\u0430\u0435\u0442, \u043d\u0430 \u043a\u0430\u043a\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0442\u044c? \u041a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 MSS \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c? \u0413\u0434\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a? \u041d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b? \u042d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0442\u043e\u0442 IP-\u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443.\u041e\u0442\u0432\u0435\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043d virtio_net_hdr.\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u0430\u043c \u043e\u043d \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f. \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0435 VirtIO, \u043d\u043e \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c Linux \u0441\u0442\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f offload-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 TUN \u0442\u043e\u0436\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c virtio_net_hdr, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 GSO.\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430\u0420\u0438\u0441. 1. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430: 10-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 virtio_net_hdr, \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 IP-\u043f\u0430\u043a\u0435\u0442.\u0421\u0430\u043c IP-\u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0412\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 virtio_net_hdr: \u0442\u0438\u043f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.\u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0435 10 \u0431\u0430\u0439\u0442 \u2014 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0451\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 IP-\u043f\u0430\u043a\u0435\u0442. \u0420\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435\u043c \u043d\u0430 MTU-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043f\u0443\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u044f\u0434\u0440\u043e, \u0430 \u043c\u044b \u0441\u0430\u043c\u0438: \u0441\u0432\u043e\u0438\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 (\u0430 \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0442\u043e\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 TUN GSO \u2014 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0440\u0435\u0437\u0430\u0442\u044c, \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 TLS \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0435\u0441\u0442\u044c).\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0443\u0436\u0435 \u043d\u0430\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443. \u0412\u043c\u0435\u0441\u0442\u043e 44 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0434\u0438\u043d, \u0430 \u0441\u043e\u0440\u043e\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 skb \u0438 \u0441\u043e\u0440\u043e\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0441\u0442\u0435\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f.\u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b virtio_net_hdr\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u043e\u0432\u043d\u043e 10 \u0431\u0430\u0439\u0442 \u0438 \u0441\u0442\u043e\u0438\u0442 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u2014 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u044b\u0447\u043d\u044b\u043c, \u043d\u0435-GSO. \u041f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043d, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u0444\u043b\u0430\u0433\u043e\u043c IFF_VNET_HDR (\u0432 TUNSETIFF); \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c TUNSETVNETHDRSZ(10), \u0447\u0442\u043e\u0431\u044b \u044f\u0434\u0440\u043e \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438 \u0432 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435. \u0412\u0441\u0435 \u043c\u043d\u043e\u0433\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f \u044f\u0434\u0440\u043e \u043f\u0438\u0448\u0435\u0442 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0431\u0430\u0439\u0442 \u0445\u043e\u0441\u0442\u0430 \u2014 \u043d\u0430 x86-64 \u0438 ARM \u044d\u0442\u043e little-endian (\u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437 TUNSETVNETLE).\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u0420\u0430\u0437\u043c\u0435\u0440\u041f\u043e\u043b\u0435\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u043501flags\u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430: \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0434\u043e\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u044311gso_type\u0442\u0438\u043f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: NONE \/ TCPv4 \/ TCPv622hdr_len\u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0430\u044f \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 IP+TCP (\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430, \u0435\u0451 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c)42gso_sizeMSS &#8212; \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0440\u0435\u0437\u043a\u043862csum_start\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 (\u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 IP-\u043f\u0430\u043a\u0435\u0442\u0430), \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u043082csum_offset\u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e csum_start\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u043d\u0435\u0441\u0451\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u0437 \u043e\u0434\u043d\u0438\u0445 \u043d\u0443\u043b\u0435\u0439: gso_type = NONE, flags = 0.\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f flags (\u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430):\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0421\u043c\u044b\u0441\u043bVIRTIO_NET_HDR_F_NEEDS_CSUM0x01\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f (\u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a), \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u043e\u0431\u044f\u0437\u0430\u043d \u0435\u0451 \u0434\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044cVIRTIO_NET_HDR_F_DATA_VALID0x02\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438: \u044f\u0434\u0440\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u0441\u0443\u043c\u043c\u0430 \u0443\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430, \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u00bb\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f gso_type (\u0442\u0438\u043f \u0432 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u0431\u0438\u0442\u0430\u0445, 0x80 \u2014 ECN-\u0444\u043b\u0430\u0433 \u043f\u043e\u0432\u0435\u0440\u0445):\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0421\u043c\u044b\u0441\u043bVIRTIO_NET_HDR_GSO_NONE0\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442VIRTIO_NET_HDR_GSO_TCPV41TCP\/IPv4 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442VIRTIO_NET_HDR_GSO_TCPV64TCP\/IPv6 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442VIRTIO_NET_HDR_GSO_ECN0x80OR-\u0444\u043b\u0430\u0433: \u0432 TCP \u0431\u044b\u043b \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d CWR (ECN)\u041f\u0430\u0440\u0430 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043b\u0435\u0433\u043a\u043e \u0441\u043f\u043e\u0442\u043a\u043d\u0443\u0442\u044c\u0441\u044f:\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\u00bb, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0435 10 \u0431\u0430\u0439\u0442, \u0434\u0430\u043b\u044c\u0448\u0435 position = 10\u00bb, \u0438 \u043e\u0442\u0442\u0443\u0434\u0430 \u0438\u0434\u0451\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 IP-\u043f\u0430\u043a\u0435\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0435\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.ByteBuffer \u0432 Java \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e big-endian, \u0430 \u043f\u043e\u043b\u044f \u0437\u0434\u0435\u0441\u044c little-endian \u2014 \u0442\u0440\u0438 u16-\u043f\u043e\u043b\u044f \u043d\u0430\u0434\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u044f\u0432\u043d\u044b\u043c LITTLE_ENDIAN (\u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 Short.reverseBytes), \u0438\u043d\u0430\u0447\u0435 gso_size \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043c\u0443\u0441\u043e\u0440.\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u043b\u0438\u043b\u043e\u0441\u044c \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 allocation-free \u043a\u043b\u0430\u0441\u0441 VnetHdr, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 10 \u0431\u0430\u0439\u0442 \u043f\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u043c\u0443 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0432 \u0431\u0443\u0444\u0435\u0440\u0435. \u0412\u0441\u044e \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0443 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0448\u0435 \u0432\u0438\u0434\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u0445, \u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0441\u0443\u043f\u0435\u0440\u043f\u0430\u043a\u0435\u0442\u0430 \u2014 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:public final class VnetHdr {    \/** \u0420\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u2014 \u0435\u0433\u043e \u0436\u0435 \u043e\u0442\u0434\u0430\u0451\u043c \u0432 TUNSETVNETHDRSZ(10). *\/    public static final int LEN = 10;    \/\/ \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.    private static final int FLAGS_OFF = 0;        \/\/ u8    private static final int GSO_TYPE_OFF = 1;     \/\/ u8    private static final int HDR_LEN_OFF = 2;      \/\/ u16 LE \u2014 \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 IP+TCP (\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430)    private static final int GSO_SIZE_OFF = 4;     \/\/ u16 LE \u2014 MSS    private static final int CSUM_START_OFF = 6;   \/\/ u16 LE \u2014 \u043e\u0442\u043a\u0443\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 (\u043e\u0442 IP)    private static final int CSUM_OFFSET_OFF = 8;  \/\/ u16 LE \u2014 \u043f\u043e\u043b\u0435 \u0441\u0443\u043c\u043c\u044b, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e csum_start    public static final int F_NEEDS_CSUM = 0x01;   \/\/ \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442    public static final int F_DATA_VALID = 0x02;   \/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438: \u0441\u0443\u043c\u043c\u0430 \u0443\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430    public static final int GSO_NONE = 0;    public static final int GSO_TCPV4 = 1;    public static final int GSO_TCPV6 = 4;    public static final int GSO_ECN = 0x80;        \/\/ OR-\u0444\u043b\u0430\u0433 \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0438\u043f\u0430    private VnetHdr() {    }    \/** gso_type \u0441 \u0432\u044b\u0447\u0442\u0435\u043d\u043d\u044b\u043c ECN-\u0444\u043b\u0430\u0433\u043e\u043c. *\/    public static int gsoType(ByteBuffer b, int off) {        return b.get(off + GSO_TYPE_OFF) &amp; ~GSO_ECN &amp; 0xFF;    }    public static int gsoSize(ByteBuffer b, int off) {        return u16le(b, off + GSO_SIZE_OFF);    }    \/\/ \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e ByteBuffer.getShort(): \u0443 \u043d\u0435\u0433\u043e big-endian \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0430 \u043f\u043e\u043b\u044f \u0437\u0434\u0435\u0441\u044c little-endian.    private static int u16le(ByteBuffer b, int off) {        return (b.get(off) &amp; 0xFF) | ((b.get(off + 1) &amp; 0xFF) &lt;&lt; 8);    }    private static void putU16le(ByteBuffer b, int off, int v) {        b.put(off, (byte) (v &amp; 0xFF));        b.put(off + 1, (byte) ((v &gt;&gt;&gt; 8) &amp; 0xFF));    }    \/**     * \u041f\u0438\u0448\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-487044","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/487044","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=487044"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/487044\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=487044"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=487044"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=487044"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}