{"id":483352,"date":"2026-06-11T14:08:04","date_gmt":"2026-06-11T14:08:04","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=483352"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=483352","title":{"rendered":"\u041a\u0430\u043a \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b BGP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u043d\u0435 \u0441\u043e\u0448\u0451\u043b \u0441 \u0443\u043c\u0430"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4c\/a6\/56\/4ca656362d67b0e7324de2974d48817d.jpg\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/4c\/a6\/56\/4ca656362d67b0e7324de2974d48817d.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/4c\/a6\/56\/4ca656362d67b0e7324de2974d48817d.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><em>BGPLite \u2014 open-source BGP route-server \u043d\u0430 C# \u0438 .NET 10 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0438\u0437 2500 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c BGP-\u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u0447\u0435\u0440\u0435\u0437 RIPE Stat \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 HTTP API. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <\/em><a href=\"https:\/\/github.com\/ruhex\/BGPLite\" rel=\"noopener noreferrer nofollow\"><em>GitHub<\/em><\/a><em>.<\/em><\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043e\u0442\u043a\u0440\u044b\u043b <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc4271\" rel=\"noopener noreferrer nofollow\">RFC 4271<\/a>, \u043c\u043d\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e BGP \u2014 \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0447\u0451\u0440\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \u0438\u0437 \u043c\u0438\u0440\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u0435\u043b\u044c \u044f \u0443\u0436\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 BGP-\u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u0440\u0438\u043d\u0433\u0438 \u0438 \u0441\u043f\u043e\u0440\u0438\u043b \u0441 MikroTik \u043e 4-\u0431\u0430\u0439\u0442\u043d\u044b\u0445 ASN.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f BGPLite, \u043a\u0430\u043a\u0438\u0435 \u0433\u0440\u0430\u0431\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438\u0441\u044c \u043f\u043e \u043f\u0443\u0442\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 BGP-\u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434.<\/p>\n<h3>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h3>\n<ol>\n<li>\n<p><a href=\"#%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B2%D1%81%D1%91-%D1%8D%D1%82%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0447\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BD%D0%B5-bird-frr-%D0%B8-gobgp\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 BIRD, FRR \u0438 GoBGP<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-net\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 .NET<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD-bgp-%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d BGP (\u043a\u0440\u0430\u0442\u043a\u043e)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-bgplite\" rel=\"noopener noreferrer nofollow\">\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 BGPLite<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%81%D0%B0%D0%BC%D1%8B%D0%B5-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%B5-%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B\" rel=\"noopener noreferrer nofollow\">\u0421\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/a> <\/p>\n<ul>\n<li>\n<p><a href=\"#tcp-%D1%84%D1%80%D0%B0%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF-%D1%81%D0%BB%D0%BE%D0%BC%D0%B0%D0%BB%D1%81%D1%8F-%D0%B2-%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D1%81%D0%B5%D1%82%D0%B8\" rel=\"noopener noreferrer nofollow\">TCP-\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#asn32-%D0%B4%D0%B2%D0%B0-%D0%B4%D0%BD%D1%8F-%D0%B4%D0%B5%D0%B1%D0%B0%D0%B3%D0%B0\" rel=\"noopener noreferrer nofollow\">ASN32 \u0438 \u0434\u0432\u0430 \u0434\u043d\u044f \u0434\u0435\u0431\u0430\u0433\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#capability-negotiation-%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-mikrotik-%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%B0%D0%BB-%D1%81%D0%B5%D1%81%D1%81%D0%B8%D1%8E\" rel=\"noopener noreferrer nofollow\">Capability negotiation \u0438 Mikrotik<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%B3%D0%BE%D0%BD%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8-%D0%B2-%D1%81%D0%BE%D0%BA%D0%B5%D1%82-%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B1%D0%B0%D0%B3-%D0%B2-%D0%BF%D1%80%D0%BE%D0%B4%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0413\u043e\u043d\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043e\u043a\u0435\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#update-%D0%B1%D0%B0%D1%82%D1%87%D0%B8%D0%BD%D0%B3-%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0-8000-%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%D0%BE%D0%B2-%D0%BD%D0%B5-%D0%B2%D0%BB%D0%B5%D0%B7%D0%B0%D1%8E%D1%82-%D0%B2-%D0%BE%D0%B4%D0%B8%D0%BD-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82\" rel=\"noopener noreferrer nofollow\">UPDATE-\u0431\u0430\u0442\u0447\u0438\u043d\u0433<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#ripe-stat-caching-50-%D0%BF%D0%B8%D1%80%D0%BE%D0%B2--1-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81\" rel=\"noopener noreferrer nofollow\">RIPE Stat caching<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D1%8D%D1%82%D0%BE-%D1%83%D0%B6%D0%B5-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82\" rel=\"noopener noreferrer nofollow\">\u042d\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%87%D0%B5%D0%B3%D0%BE-%D0%BF%D0%BE%D0%BA%D0%B0-%D0%BD%D0%B5%D1%82\" rel=\"noopener noreferrer nofollow\">\u0427\u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%87%D1%82%D0%BE-%D0%B4%D0%B0%D0%BB%D1%8C%D1%88%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%B2%D1%81%D1%91-%D1%8D%D1%82%D0%BE\" id=\"\u0437\u0430\u0447\u0435\u043c-\u0432\u0441\u0451-\u044d\u0442\u043e\"><\/a><\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0443 \u0441 \u0447\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u0438\u044f: \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043d\u044f\u0442\u044c BGP \u0438\u0437\u043d\u0443\u0442\u0440\u0438.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0448\u044c \u0441 \u0441\u0435\u0442\u044f\u043c\u0438, BGP \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0447\u0435\u043c-\u0442\u043e \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u044b\u043c: RFC \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439, \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 BIRD, FRR, Cisco \u0438 Juniper. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0448\u044c neighbor X.X.X.X remote-as 65444, \u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u2014 \u0447\u0430\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0433\u0430\u0434\u043a\u043e\u0439.<\/p>\n<p>\u041a\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u044b? \u041a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439? \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f? \u0427\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 OPEN, KEEPALIVE \u0438 UPDATE \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438?<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u043d\u0435 \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e BGP.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430: \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b route-server, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0434\u0430\u0451\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c. \u041d\u0435 full BGP router, \u043d\u0435 policy engine \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043f\u043e BGP, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u0432\u043e\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b, \u0440\u0430\u0431\u043e\u0442\u0430\u0439\u00bb. \u041f\u0440\u0438\u0447\u0451\u043c \u043d\u0430\u0431\u043e\u0440 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0432\u043e\u0439: \u043e\u0434\u0438\u043d \u0445\u043e\u0447\u0435\u0442 Cloudflare + Google, \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b, \u0442\u0440\u0435\u0442\u0438\u0439 \u2014 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 HTTP API, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 CLI \u0432 2026 \u0433\u043e\u0434\u0443 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0432\u0435\u043a.<\/p>\n<p><a class=\"anchor\" name=\"%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BD%D0%B5-bird-frr-%D0%B8-gobgp\" id=\"\u043f\u043e\u0447\u0435\u043c\u0443-\u043d\u0435-bird-frr-\u0438-gobgp\"><\/a><\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 BIRD, FRR \u0438 GoBGP<\/h3>\n<p>\u042f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><strong>BIRD<\/strong> \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0434\u0435\u043c\u043e\u043d, \u043d\u043e \u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0425\u043e\u0447\u0435\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 API? \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439 \u043a\u043e\u043d\u0444\u0438\u0433, \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0439 <code>birdc configure<\/code>, \u043c\u043e\u043b\u0438\u0441\u044c \u0447\u0442\u043e \u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u043f\u043e\u0434\u0430\u0432\u0438\u043b\u0441\u044f. \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432? \u041d\u0435\u0442, \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>FRR<\/strong> (\u0431\u044b\u0432\u0448\u0438\u0439 Quagga) \u2014 \u0442\u044f\u0436\u0451\u043b\u044b\u0439, \u0441 legacy-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 overengineering.<\/p>\n<\/li>\n<li>\n<p><strong>GoBGP<\/strong> \u2014 \u043c\u043e\u0449\u043d\u044b\u0439, \u043d\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439. \u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0451.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0431\u0449\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432\u0441\u0435 \u043e\u043d\u0438 \u2014 <em>full BGP speakers<\/em>. \u041e\u043d\u0438 \u0443\u043c\u0435\u044e\u0442 \u0432\u0441\u0451 (policy routing, route reflection, MPLS, EVPN), \u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044d\u0442\u043e 90% \u043b\u0438\u0448\u043d\u0435\u0433\u043e.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b: \u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u043d\u0443\u043b\u044f. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, .NET 10 \u0441 \u0435\u0433\u043e <code>Span&lt;byte&gt;<\/code>, async\/await \u0438 EF Core \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, ~2500 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u0438\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435.<\/p>\n<p>\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u043e\u0434\u0438\u043d \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439. \u041d\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u044f \u043e\u0436\u0438\u0434\u0430\u043b.<\/p>\n<p><a class=\"anchor\" name=\"%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-net\" id=\"\u043f\u043e\u0447\u0435\u043c\u0443-net\"><\/a><\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 .NET<\/h3>\n<p>\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u00ab\u043c\u043e\u0434\u043d\u044b\u0439\u00bb. \u041d\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u044b:<\/p>\n<p><code><strong>Span&lt;byte&gt;<\/strong><\/code><strong> \u0438 <\/strong><code><strong>Memory&lt;byte&gt;<\/strong><\/code><strong>.<\/strong> BGP \u2014 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 <code>ReadOnlySpan&lt;byte&gt;<\/code> \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u2014 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0412 Go \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 <code>io.Reader<\/code> \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438, \u0432 Rust \u2014 \u0431\u043e\u0440\u043e\u0442\u044c\u0441\u044f \u0441 borrow checker\u2019\u043e\u043c (\u0445\u043e\u0442\u044f \u0442\u0430\u043c \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435\u0435). \u0412 .NET \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p><strong>Async I\/O \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/strong> \u041a\u0430\u0436\u0434\u0430\u044f BGP-\u0441\u0435\u0441\u0441\u0438\u044f \u2014 \u044d\u0442\u043e \u0434\u0432\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b (\u0447\u0442\u0435\u043d\u0438\u0435 \u0438 keepalive). <code>async\/await<\/code> + <code>CancellationToken<\/code> \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0431\u0435\u0437 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u043e\u0432 \u0438 state machine \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p><strong>EF Core \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430.<\/strong> \u041f\u0438\u0440\u044b, \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438, \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c. <code>DbContextFactory<\/code> + SQLite \u2014 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<p><strong>\u041d\u0443 \u0438 \u0447\u0435\u0441\u0442\u043d\u043e \u2014 \u044f \u043f\u0440\u043e\u0441\u0442\u043e C#-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.<\/strong> \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Go, Rust \u0438\u043b\u0438 C. \u041d\u043e \u0437\u0430\u0447\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u0437\u043d\u0430\u0435\u0448\u044c \u0441\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u043c\u043e\u0436\u0435\u0448\u044c \u043d\u0430 \u043d\u0451\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435? \u041b\u0443\u0447\u0448\u0438\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u044b \u0437\u043d\u0430\u0435\u0448\u044c.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD-bgp-%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE\" id=\"\u043a\u0430\u043a-\u0443\u0441\u0442\u0440\u043e\u0435\u043d-bgp-\u043a\u0440\u0430\u0442\u043a\u043e\"><\/a><\/p>\n<h3>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d BGP (\u043a\u0440\u0430\u0442\u043a\u043e)<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043b\u0438 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442 BGP \u2014 \u0432\u043e\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>BGP \u0438\u043c\u0435\u0435\u0442 \u0440\u043e\u0432\u043d\u043e <strong>4 \u0442\u0438\u043f\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439<\/strong>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0422\u0438\u043f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u043e\u0434<\/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\">OPEN<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u0435: ASN, Hold Time, capabilities<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">UPDATE<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0410\u043d\u043e\u043d\u0441\/\u043e\u0442\u0437\u044b\u0432 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">NOTIFICATION<\/p>\n<\/td>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e \u0441\u0435\u0441\u0441\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">KEEPALIVE<\/p>\n<\/td>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u00ab\u042f \u0436\u0438\u0432\u00bb, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 OPEN<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 19-\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430: 16 \u0431\u0430\u0439\u0442 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 (<code>0xFF<\/code>), 2 \u0431\u0430\u0439\u0442\u0430 \u0434\u043b\u0438\u043d\u044b, 1 \u0431\u0430\u0439\u0442 \u0442\u0438\u043f\u0430. \u0424\u043e\u0440\u043c\u0430\u0442 \u2014 \u0436\u0451\u0441\u0442\u043a\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439, \u0431\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p><strong>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0435\u0441\u0441\u0438\u0438<\/strong> \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 (FSM). \u0414\u043b\u044f route-server \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439:<\/p>\n<pre><code>Idle \u2192 Connect \u2192 OpenSent \u2192 OpenConfirm \u2192 Established<\/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<p>\u0412 Established \u0441\u0435\u0441\u0441\u0438\u044f \u0436\u0438\u0432\u0451\u0442: \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f UPDATE (\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b) \u0438 KEEPALIVE (\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0438). \u0415\u0441\u043b\u0438 HOLD Timer \u0438\u0441\u0442\u0451\u043a \u0438\u043b\u0438 \u043f\u0440\u0438\u0448\u0451\u043b NOTIFICATION \u2014 \u0441\u0435\u0441\u0441\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p><strong>UPDATE<\/strong> \u2014 \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0440\u0438 \u0441\u0435\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p>Withdrawn Routes \u2014 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0438\u0440 \u043e\u0442\u0437\u044b\u0432\u0430\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>Path Attributes \u2014 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 (Origin, AS_PATH, Next Hop, Communities)<\/p>\n<\/li>\n<li>\n<p>NLRI (Network Layer Reachability Information) \u2014 \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e: \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0430\u0449\u0438\u0435 \u0431\u0430\u0439\u0442\u044b. <code>192.168.0.0\/16<\/code> \u2014 \u044d\u0442\u043e 3 \u0431\u0430\u0439\u0442\u0430, \u0430 \u043d\u0435 5. <code>\/24<\/code> \u2014 4 \u0431\u0430\u0439\u0442\u0430. <code>\/0<\/code> \u2014 1 \u0431\u0430\u0439\u0442 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u0438\u043d\u0430).<\/p>\n<p>\u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (capabilities, communities, MP-BGP) \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430. \u0411\u0430\u0437\u043e\u0432\u044b\u0439 BGP \u043f\u043e\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0-bgplite\" id=\"\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430-bgplite\"><\/a><\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 BGPLite<\/h3>\n<pre><code>  \u041a\u043b\u0438\u0435\u043d\u0442 (BIRD\/Cisco\/Mikrotik)         \u2502         \u2502 BGP (TCP :179)         \u25bc\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502   BGP Server    \u2502    \u2502    HTTP API      \u2502\u2502  (BgpSession)   \u2502    \u2502  (:5000)         \u2502\u2502  (BgpMetrics)   \u2502    \u2502                  \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518         \u2502                      \u2502         \u25bc                      \u25bc\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502              Peer Store                 \u2502\u2502         (EF Core + SQLite)              \u2502\u2502  Peer \u2192 Subscription \u2192 CustomPrefix     \u2502\u2502  Peer \u2192 Community                       \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                 \u2502         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u25bc               \u25bc\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502  Route Table   \u2502 \u2502  Prefix      \u2502\u2502  (Community    \u2502 \u2502  Service     \u2502\u2502   Filters)     \u2502 \u2502  (Cache)     \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                          \u2502                   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                   \u25bc              \u25bc            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510            \u2502 RIPE Stat  \u2502 \u2502 nets.txt  \u2502            \u2502 API        \u2502 \u2502 (local)   \u2502            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/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\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 7 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438:<\/p>\n<pre><code>BGPLite\/               # Entry point, DI, host setupBGPLite.Protocol\/      # \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\/\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 BGP-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (0 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439)BGPLite.Server\/        # TCP listener, BGP session FSMBGPLite.Routing\/       # Route table, community filtersBGPLite.Providers\/     # RIPE Stat \u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u0435\u0448, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044bBGPLite.Api\/           # HTTP API, EF Core, PeerStoreBGPLite.Configuration\/ # YAML-\u043a\u043e\u043d\u0444\u0438\u0433<\/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><code>Protocol<\/code> \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u0441\u0435\u0442\u044c. <code>Server<\/code> \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u0431\u0430\u0437\u0443. <code>Routing<\/code> \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HTTP. \u0427\u0438\u0441\u0442\u044b\u0439 modular monolith \u0431\u0435\u0437 \u043e\u0432\u0435\u0440-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430.<\/p>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0438\u0440\u0430:<\/p>\n<pre><code class=\"cs\">public class Peer{    public string Id { get; set; } = Guid.NewGuid().ToString();    public string Ip { get; set; } = \"\";    public uint? Asn { get; set; }    public string? Description { get; set; }    public string Status { get; set; } = \"inactive\";    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;    public DateTime? LastSessionAt { get; set; }    public List&lt;PeerCommunity&gt; Communities { get; set; } = [];    public List&lt;PeerSubscription&gt; Subscriptions { get; set; } = [];    public List&lt;PeerCustomPrefix&gt; CustomPrefixes { get; set; } = [];}<\/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>\u041a\u043e\u0433\u0434\u0430 \u043f\u0438\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e BGP, \u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0449\u0435\u0442 \u0435\u0433\u043e \u0432 \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e IP-\u0430\u0434\u0440\u0435\u0441\u0443 \u2014 \u0438 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u043e\u0442\u0434\u0430\u0442\u044c. \u0423 \u043f\u0438\u0440\u0430 \u0442\u0440\u0438 \u0432\u0438\u0434\u0430 \u0441\u0432\u044f\u0437\u0435\u0439: community-\u0444\u0438\u043b\u044c\u0442\u0440\u044b (\u043a\u0430\u043a\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c), \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043d\u0430 AS-\u043b\u0438\u0441\u0442\u044b (\u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c) \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b (\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435).<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D1%81%D0%B0%D0%BC%D1%8B%D0%B5-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%B5-%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B\" id=\"\u0441\u0430\u043c\u044b\u0435-\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435-\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\"><\/a><\/p>\n<h3>\u0421\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/h3>\n<p><a class=\"anchor\" name=\"tcp-%D1%84%D1%80%D0%B0%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF-%D1%81%D0%BB%D0%BE%D0%BC%D0%B0%D0%BB%D1%81%D1%8F-%D0%B2-%D1%80%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D1%81%D0%B5%D1%82%D0%B8\" id=\"tcp-\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f-\u043f\u043e\u0447\u0435\u043c\u0443-\u043f\u0435\u0440\u0432\u044b\u0439-\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f-\u0441\u043b\u043e\u043c\u0430\u043b\u0441\u044f-\u0432-\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439-\u0441\u0435\u0442\u0438\"><\/a><\/p>\n<h4>TCP-\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0441\u043b\u043e\u043c\u0430\u043b\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438<\/h4>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0437\u0430 \u0432\u0435\u0447\u0435\u0440. \u041e\u0442\u043a\u0440\u044b\u043b TCP-\u0441\u043e\u043a\u0435\u0442, \u0447\u0438\u0442\u0430\u044e \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 <code>NetworkStream.ReadAsync()<\/code>, \u043f\u0430\u0440\u0441\u044e BGP-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0421 BIRD \u043d\u0430 localhost \u2014 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c. \u0418 \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p><code>ReadAsync<\/code> \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d BGP-\u043f\u0430\u043a\u0435\u0442. TCP \u2014 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u041e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 <code>ReadAsync<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (TCP-\u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0448\u0451\u043b \u043d\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c)<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0434\u0432\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043a\u043b\u0435\u0438\u043b\u0438\u0441\u044c \u0432 \u0431\u0443\u0444\u0435\u0440\u0435)<\/p>\n<\/li>\n<li>\n<p>0 \u0431\u0430\u0439\u0442 (\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u043e)<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0439 \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"cs\">\/\/ \u041d\u0415 \u0414\u0415\u041b\u0410\u0419\u0422\u0415 \u0422\u0410\u041avar buffer = new byte[4096];var read = await stream.ReadAsync(buffer, ct);var message = BgpMessageReader.ReadMessage(buffer.AsSpan(0, read));<\/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>\u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043d\u0430 localhost, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u041d\u043e \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u2014 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0441 \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u044b\u043c\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u00abInvalid BGP marker\u00bb \u0438\u043b\u0438 \u00abMessage too short\u00bb.<\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>ReadExactAsync<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442:<\/p>\n<pre><code class=\"cs\">private async Task ReadExactAsync(Memory&lt;byte&gt; buffer, CancellationToken ct){    var totalRead = 0;    while (totalRead &lt; buffer.Length)    {        var read = await _stream.ReadAsync(buffer[totalRead..], ct);        if (read == 0)            throw new IOException(\"Connection closed by peer\");        totalRead += read;    }}<\/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>\u0418 \u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0434\u0432\u0430 \u043f\u0440\u0438\u0451\u043c\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 19 \u0431\u0430\u0439\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (\u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443), \u0437\u0430\u0442\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0447\u0430\u0441\u0442\u044c. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f <code>ArrayPool&lt;byte&gt;<\/code> \u2014 \u0432\u043c\u0435\u0441\u0442\u043e <code>new byte[4096]<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u044b \u0430\u0440\u0435\u043d\u0434\u0443\u0435\u043c \u0431\u0443\u0444\u0435\u0440 \u0438\u0437 \u043f\u0443\u043b\u0430. \u041f\u0440\u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 GC pressure \u0437\u0430\u043c\u0435\u0442\u043d\u0430.<\/p>\n<p><a class=\"anchor\" name=\"asn32-%D0%B4%D0%B2%D0%B0-%D0%B4%D0%BD%D1%8F-%D0%B4%D0%B5%D0%B1%D0%B0%D0%B3%D0%B0\" id=\"asn32-\u0434\u0432\u0430-\u0434\u043d\u044f-\u0434\u0435\u0431\u0430\u0433\u0430\"><\/a><\/p>\n<h4>ASN32: \u0434\u0432\u0430 \u0434\u043d\u044f \u0434\u0435\u0431\u0430\u0433\u0430<\/h4>\n<p>\u042f \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e ASN \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e 16-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 OPEN-\u043f\u0430\u043a\u0435\u0442\u0435. \u041f\u0435\u0440\u0432\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0441 BIRD (ASN 65444) \u043f\u0440\u043e\u0448\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u041f\u043e\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 ASN 397143 \u2014 \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430\u0441\u044c.<\/p>\n<p>\u0414\u0432\u0430 \u0434\u043d\u044f \u044f \u0438\u0441\u043a\u0430\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0435\u0440\u043d\u044b\u0439, \u0431\u0430\u0439\u0442\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435, \u043d\u043e \u043f\u0438\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 ASN. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 ASN \u0432 OPEN-\u043f\u0430\u043a\u0435\u0442\u0435 \u2014 16 \u0431\u0438\u0442, \u0430 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f 4-\u0431\u0430\u0439\u0442\u043d\u044b\u0435 ASN (AS &gt; 65535). \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f &gt; 65535 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc4893\" rel=\"noopener noreferrer nofollow\">RFC 4893<\/a>: capability \u0441 \u043a\u043e\u0434\u043e\u043c 65 (Four-Octet ASN), \u0430 \u0432 16-\u0431\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u043b\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0441\u044f <code>AS_TRANS<\/code> (23456) \u2014 reserved-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 capabilities\u00bb:<\/p>\n<pre><code class=\"cs\">var asn16 = _bgpConfig.Asn &gt; ushort.MaxValue ? (ushort)23456 : (ushort)_bgpConfig.Asn;<\/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\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 capabilities, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 capability 65 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u2014 \u0431\u0440\u0430\u0442\u044c 16-\u0431\u0438\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0435. \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 backward-compatible \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438\u0437 RFC.<\/p>\n<p>\u041d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 4-\u0431\u0430\u0439\u0442\u043d\u043e\u0433\u043e ASN \u0432 \u0441\u0432\u043e\u0451\u043c OPEN, \u043d\u043e \u0437\u0430\u0431\u044b\u043b \u0435\u0433\u043e <em>\u043f\u0430\u0440\u0441\u0438\u0442\u044c<\/em> \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 OPEN \u043e\u0442 \u043f\u0438\u0440\u0430. \u041a\u043b\u0438\u0435\u043d\u0442 \u0441 ASN 397143 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0441\u044f, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0438\u0434\u0435\u043b \u0443 \u043d\u0435\u0433\u043e ASN 23456. \u0418\u0442\u043e\u0433 \u2014 \u0435\u0449\u0451 \u043f\u043e\u043b\u0434\u043d\u044f \u0434\u0435\u0431\u0430\u0433\u0430.<\/p>\n<p><a class=\"anchor\" name=\"capability-negotiation-%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-mikrotik-%D1%80%D0%B0%D0%B7%D1%80%D1%8B%D0%B2%D0%B0%D0%BB-%D1%81%D0%B5%D1%81%D1%81%D0%B8%D1%8E\" id=\"capability-negotiation-\u043f\u043e\u0447\u0435\u043c\u0443-mikrotik-\u0440\u0430\u0437\u0440\u044b\u0432\u0430\u043b-\u0441\u0435\u0441\u0441\u0438\u044e\"><\/a><\/p>\n<h4>Capability negotiation: \u043f\u043e\u0447\u0435\u043c\u0443 Mikrotik \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u043b \u0441\u0435\u0441\u0441\u0438\u044e<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0443 \u0442\u0435\u0431\u044f \u043e\u0434\u0438\u043d \u0442\u0438\u043f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2014 BIRD \u043d\u0430 Linux \u2014 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043a route server\u2019\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430: BIRD, FRR, Mikrotik RouterOS, Cisco IOS, Juniper JunOS. \u0418 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u0439 \u00ab\u0434\u0438\u0430\u043b\u0435\u043a\u0442\u00bb BGP.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0441 Mikrotik. \u0421\u0435\u0441\u0441\u0438\u044f \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b\u0430\u0441\u044c \u2014 Mikrotik \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b NOTIFICATION \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043c\u043e\u0435\u0433\u043e OPEN. \u0414\u0430\u043c\u043f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043b: Mikrotik \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b capability MP-BGP (Multiprotocol Extensions), \u0430 \u043c\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u043e\u0442\u0432\u0435\u0442 \u0448\u043b\u0451\u043c \u0435\u043c\u0443 MP-BGP IPv4\/Unicast. Mikrotik \u044d\u0442\u043e \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u043b \u0438 \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u043b \u0441\u0435\u0441\u0441\u0438\u044e.<\/p>\n<p>\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044e capabilities: \u043d\u0430\u0448 OPEN \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 capabilities, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0438\u0440:<\/p>\n<pre><code class=\"cs\">var capabilities = new List&lt;BgpCapabilityInfo&gt;{    BgpCapabilityInfo.FourOctetAsn(_bgpConfig.Asn)};\/\/ \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0438\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 MP IPv4\/Unicastif (PeerHasMpIpv4Unicast(remoteOpen.Capabilities))    capabilities.Add(BgpCapabilityInfo.MultiprotocolIpv4Unicast());\/\/ \u0422\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043f\u0438\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Route Refreshif (remoteOpen.Capabilities.Any(c =&gt; c.Code == BgpConstants.Capability.RouteRefresh))    capabilities.Add(BgpCapabilityInfo.RouteRefresh());<\/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>\u041c\u043e\u0440\u0430\u043b\u044c: capability negotiation \u2014 \u044d\u0442\u043e \u043d\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0438\u0447\u0430, \u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c BGP. \u0411\u0435\u0437 \u043d\u0435\u0451 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0442\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e.<\/p>\n<p><a class=\"anchor\" name=\"%D0%B3%D0%BE%D0%BD%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8-%D0%B2-%D1%81%D0%BE%D0%BA%D0%B5%D1%82-%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B1%D0%B0%D0%B3-%D0%B2-%D0%BF%D1%80%D0%BE%D0%B4%D0%B5\" id=\"\u0433\u043e\u043d\u043a\u0430-\u043f\u0440\u0438-\u0437\u0430\u043f\u0438\u0441\u0438-\u0432-\u0441\u043e\u043a\u0435\u0442-\u043f\u0435\u0440\u0432\u044b\u0439-\u0431\u0430\u0433-\u0432-\u043f\u0440\u043e\u0434\u0435\"><\/a><\/p>\n<h4>\u0413\u043e\u043d\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043e\u043a\u0435\u0442: \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0430\u0433 \u0432 \u043f\u0440\u043e\u0434\u0435<\/h4>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 BGP-\u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u0432\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438: <code>ReadLoopAsync<\/code> (\u0447\u0442\u0435\u043d\u0438\u0435) \u0438 <code>KeepAliveLoopAsync<\/code> (\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 keepalive). \u041a\u043e\u0433\u0434\u0430 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b <code>RefreshRoutesAsync<\/code> \u2014 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0447\u0435\u0440\u0435\u0437 API \u2014 \u0434\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043e\u043a\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<p>\u0414\u0432\u0430 <code>WriteAsync<\/code> \u043d\u0430 \u043e\u0434\u0438\u043d <code>NetworkStream<\/code> \u0432 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. TCP-\u0431\u0443\u0444\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0443\u0441\u043a\u0438 \u0434\u0432\u0443\u0445 BGP-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0441\u043a\u043b\u0435\u0435\u043d\u043d\u044b\u0435 \u0432\u043c\u0435\u0441\u0442\u0435. \u041f\u0438\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u0443\u0441\u043e\u0440 \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e.<\/p>\n<p>BGP \u2014 \u043d\u0435 framing-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u041d\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u0414\u043b\u0438\u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430, \u0438 \u0435\u0441\u043b\u0438 \u0431\u0430\u0439\u0442\u044b \u0434\u0432\u0443\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043b\u0438\u0441\u044c \u2014 \u043f\u0438\u0440 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043d\u0438 \u043e\u0434\u043d\u043e.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 <code>SemaphoreSlim(1, 1)<\/code> \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439:<\/p>\n<pre><code class=\"cs\">private readonly SemaphoreSlim _sendLock = new(1, 1);public async Task RefreshRoutesAsync(){    if (!IsEstablished) return;    await _sendLock.WaitAsync();    try    {        await WithdrawAllAsync();        await SendAllRoutesAsync();    }    finally    {        _sendLock.Release();    }}<\/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\u0447\u0435\u043c\u0443 \u043d\u0435 <code>lock<\/code>? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>lock<\/code> \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 <code>async<\/code>. \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 <code>Monitor.Enter<\/code>? \u0422\u0430 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0430. <code>SemaphoreSlim<\/code> \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0432 .NET, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 async\/await.<\/p>\n<p><a class=\"anchor\" name=\"update-%D0%B1%D0%B0%D1%82%D1%87%D0%B8%D0%BD%D0%B3-%D0%BA%D0%BE%D0%B3%D0%B4%D0%B0-8000-%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%D0%BE%D0%B2-%D0%BD%D0%B5-%D0%B2%D0%BB%D0%B5%D0%B7%D0%B0%D1%8E%D1%82-%D0%B2-%D0%BE%D0%B4%D0%B8%D0%BD-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82\" id=\"update-\u0431\u0430\u0442\u0447\u0438\u043d\u0433-\u043a\u043e\u0433\u0434\u0430-8000-\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432-\u043d\u0435-\u0432\u043b\u0435\u0437\u0430\u044e\u0442-\u0432-\u043e\u0434\u0438\u043d-\u043f\u0430\u043a\u0435\u0442\"><\/a><\/p>\n<h4>UPDATE-\u0431\u0430\u0442\u0447\u0438\u043d\u0433: \u043a\u043e\u0433\u0434\u0430 8000 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u043d\u0435 \u0432\u043b\u0435\u0437\u0430\u044e\u0442 \u0432 \u043e\u0434\u0438\u043d \u043f\u0430\u043a\u0435\u0442<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432, \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c ~8000 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u043e\u0434\u043d\u0438\u043c UPDATE-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c. \u041f\u0438\u0440 \u043c\u043e\u043b\u0447\u0430 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u2014 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430.<\/p>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 BGP-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 4096 \u0431\u0430\u0439\u0442 (<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc4271#section-4.1\" rel=\"noopener noreferrer nofollow\">RFC 4271, \u00a74.1<\/a>). \u0412 \u043e\u0434\u0438\u043d UPDATE \u0432\u043b\u0435\u0437\u0430\u0435\u0442 ~120-130 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 path attributes.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0431\u0430\u0442\u0447\u0438\u043d\u0433 \u043f\u043e 100:<\/p>\n<pre><code class=\"cs\">const int maxNlriPerUpdate = 100;foreach (var route in routes){    batch.Add(route);    if (batch.Count &gt;= maxNlriPerUpdate)    {        await SendRouteBatchAsync(nextHop, batch);        batch.Clear();    }}<\/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>\u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u0442\u0447 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 UPDATE \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c path attributes (Origin, AS_PATH, Next Hop). \u042d\u0442\u043e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e (\u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b), \u043d\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435.<\/p>\n<p><a class=\"anchor\" name=\"ripe-stat-caching-50-%D0%BF%D0%B8%D1%80%D0%BE%D0%B2--1-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81\" id=\"ripe-stat-caching-50-\u043f\u0438\u0440\u043e\u0432--1-\u0437\u0430\u043f\u0440\u043e\u0441\"><\/a><\/p>\n<h4>RIPE Stat caching: 50 \u043f\u0438\u0440\u043e\u0432 \u2192 1 \u0437\u0430\u043f\u0440\u043e\u0441<\/h4>\n<p>RIPE NCC \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 API, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0451\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b, \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c ASN:<\/p>\n<pre><code>GET https:\/\/stat.ripe.net\/data\/ris-prefixes\/data.json?resource=AS13335&amp;list_prefixes=true<\/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\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0443 RIPE \u0435\u0441\u0442\u044c rate limits, \u0430 \u0443 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 AS\u2019\u043e\u043a (Cloudflare, Google) \u2014 \u0441\u043e\u0442\u043d\u0438 \u0438 \u0442\u044b\u0441\u044f\u0447\u0438 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 50 \u043f\u0438\u0440\u043e\u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Cloudflare, \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u043b\u0430\u0442\u044c 50 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a RIPE Stat.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043a\u0435\u0448 \u043d\u0430 1 \u0447\u0430\u0441 \u0432 <code>ConcurrentDictionary<\/code>:<\/p>\n<pre><code class=\"cs\">private readonly ConcurrentDictionary&lt;uint, (IReadOnlyList&lt;(uint, byte)&gt; Data, DateTime CachedAt)&gt; _cache = new();private readonly TimeSpan _cacheTtl = TimeSpan.FromHours(1);<\/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\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a AS13335 \u0438\u0434\u0451\u0442 \u0432 RIPE Stat, \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 49 \u2014 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u043a\u0435\u0448\u0430. \u0427\u0435\u0440\u0435\u0437 \u0447\u0430\u0441 \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0435\u0442\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b <code>nets.txt<\/code> \u2014 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435, \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D1%8D%D1%82%D0%BE-%D1%83%D0%B6%D0%B5-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82\" id=\"\u044d\u0442\u043e-\u0443\u0436\u0435-\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\"><\/a><\/p>\n<h3>\u042d\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e BGP-\u043f\u0438\u0440\u043e\u0432: <a href=\"https:\/\/bgp.vhex.dev\/\" rel=\"noopener noreferrer nofollow\"><strong>bgp.vhex.dev<\/strong><\/a><\/p>\n<h4>HTTP API<\/h4>\n<p>API \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 <code>HttpListener<\/code> \u2014 \u0431\u0435\u0437 ASP.NET Core. \u0417\u0430\u0447\u0435\u043c \u0442\u044f\u043d\u0443\u0442\u044c Kestrel, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u0435\u043d \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u043d\u0430 10 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432?<\/p>\n<p>\u0424\u0438\u0448\u043a\u0430 <code>GET \/api\/server<\/code> \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0434\u043b\u044f BIRD, Cisco IOS \u0438 Mikrotik RouterOS \u0441 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 ASN \u0438 Router ID. \u041a\u043b\u0438\u0435\u043d\u0442\u0443 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0441\u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 IP:<\/p>\n<pre><code class=\"json\">{  \"bird\": [    \"protocol bgp bgplite {\",    \"  local as &lt;YOUR_ASN&gt;;\",    \"  neighbor 10.0.0.1 as 65444;\",    \"  multihop;\",    \"  hold time 180;\",    \"  ipv4 {\",    \"    import filter bgplite_in;\",    \"    export none;\",    \"  };\",    \"}\"  ]}<\/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<hr\/>\n<p><a class=\"anchor\" name=\"%D1%87%D0%B5%D0%B3%D0%BE-%D0%BF%D0%BE%D0%BA%D0%B0-%D0%BD%D0%B5%D1%82\" id=\"\u0447\u0435\u0433\u043e-\u043f\u043e\u043a\u0430-\u043d\u0435\u0442\"><\/a><\/p>\n<h3>\u0427\u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442<\/h3>\n<p>\u0411\u0443\u0434\u0443 \u0447\u0435\u0441\u0442\u0435\u043d \u2014 BGPLite \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u0435\u0442 \u043d\u0430 \u0437\u0430\u043c\u0435\u043d\u0443 BIRD \u0438\u043b\u0438 FRR. \u041f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e:<\/p>\n<ul>\n<li>\n<p><strong>IPv6 \/ MP-BGP<\/strong> \u2014 \u0442\u043e\u043b\u044c\u043a\u043e IPv4 unicast<\/p>\n<\/li>\n<li>\n<p><strong>RPKI-\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f<\/strong> \u2014 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/li>\n<li>\n<p><strong>BGP MD5 Authentication<\/strong> \u2014 \u043d\u0435\u0442 \u0437\u0430\u0449\u0438\u0442\u044b \u0441\u0435\u0441\u0441\u0438\u0438 \u043e\u0442 \u043f\u043e\u0434\u0434\u0435\u043b\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><strong>Route Refresh<\/strong> \u2014 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0437\u044b\u0432\u0430 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u0441\u0435\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>Graceful Restart<\/strong> \u2014 \u043f\u0440\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0438\u0440\u044b \u0442\u0435\u0440\u044f\u044e\u0442 \u0432\u0441\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b<\/p>\n<\/li>\n<li>\n<p><strong>BFD<\/strong> \u2014 \u043d\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u044b\u0432\u0430 \u0441\u0432\u044f\u0437\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e BGP keepalive)<\/p>\n<\/li>\n<li>\n<p><strong>BMP<\/strong> \u2014 \u043d\u0435\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 BGP-\u0441\u0435\u0441\u0441\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><strong>Full Table<\/strong> \u2014 \u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u0438\u0451\u043c\u0430 \u043f\u043e\u043b\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 (~900K \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432)<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. BGPLite \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u0434\u0430\u0447\u0430 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u043f\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430\u043c. \u0414\u043b\u044f full BGP routing \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 BIRD \u0438\u043b\u0438 FRR. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u2014 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"%D1%87%D1%82%D0%BE-%D0%B4%D0%B0%D0%BB%D1%8C%D1%88%D0%B5\" id=\"\u0447\u0442\u043e-\u0434\u0430\u043b\u044c\u0448\u0435\"><\/a><\/p>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<p>BGPLite \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443. \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>Route Refresh (soft reconfig \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u044b\u0432\u0430 \u0441\u0435\u0441\u0441\u0438\u0438)<\/p>\n<\/li>\n<li>\n<p>RPKI-\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>MP-BGP \u0434\u043b\u044f IPv6<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043d\u043e\u0441 <code>BGPLite.Protocol<\/code> \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 NuGet-\u043f\u0430\u043a\u0435\u0442 \u2014 \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e BGP-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a route-server\u2019\u0443<\/p>\n<\/li>\n<li>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445: \u043f\u043e\u043c\u0438\u043c\u043e RIPE Stat \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Hurricane Electric (HE) BGP Toolkit \u0438 \u0434\u0440\u0443\u0433\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c \u0432 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430\u0445<\/p>\n<\/li>\n<li>\n<p>Prometheus\/Grafana \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>Web UI \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0438\u0440\u0430\u043c\u0438<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0432\u0430\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043a\u043e\u0433\u0434\u0430-\u043b\u0438\u0431\u043e. CDN, edge computing, multi-cloud, \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438. BGP \u2014 \u043d\u0435 \u043c\u0430\u0433\u0438\u044f \u0432\u0435\u043d\u0434\u043e\u0440\u043e\u0432, \u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c\u0430 \u2014 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0439\u0442\u0435\u0441\u044c: <a href=\"https:\/\/github.com\/ruhex\/BGPLite\" rel=\"noopener noreferrer nofollow\">github.com\/ruhex\/BGPLite<\/a>. \u0417\u0432\u0451\u0437\u0434\u043e\u0447\u043a\u0438, issue \u0438 pull request\u2019\u044b \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f.<\/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\/1046544\/\">https:\/\/habr.com\/ru\/articles\/1046544\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>BGPLite \u2014 open-source BGP route-server \u043d\u0430 C# \u0438 .NET 10 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0438\u0437 2500 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c BGP-\u0441\u0435\u0441\u0441\u0438\u0438, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u0447\u0435\u0440\u0435\u0437 RIPE Stat \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 HTTP API. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 GitHub.\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043e\u0442\u043a\u0440\u044b\u043b RFC 4271, \u043c\u043d\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e BGP \u2014 \u044d\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0447\u0451\u0440\u043d\u0430\u044f \u043c\u0430\u0433\u0438\u044f \u0438\u0437 \u043c\u0438\u0440\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u0432\u044f\u0437\u0438. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u0435\u043b\u044c \u044f \u0443\u0436\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 BGP-\u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0438\u0440\u0438\u043d\u0433\u0438 \u0438 \u0441\u043f\u043e\u0440\u0438\u043b \u0441 MikroTik \u043e 4-\u0431\u0430\u0439\u0442\u043d\u044b\u0445 ASN.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f BGPLite, \u043a\u0430\u043a\u0438\u0435 \u0433\u0440\u0430\u0431\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438\u0441\u044c \u043f\u043e \u043f\u0443\u0442\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 BGP-\u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434.\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u0417\u0430\u0447\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 BIRD, FRR \u0438 GoBGP\u041f\u043e\u0447\u0435\u043c\u0443 .NET\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d BGP (\u043a\u0440\u0430\u0442\u043a\u043e)\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 BGPLite\u0421\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b TCP-\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044fASN32 \u0438 \u0434\u0432\u0430 \u0434\u043d\u044f \u0434\u0435\u0431\u0430\u0433\u0430Capability negotiation \u0438 Mikrotik\u0413\u043e\u043d\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043e\u043a\u0435\u0442UPDATE-\u0431\u0430\u0442\u0447\u0438\u043d\u0433RIPE Stat caching\u042d\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0427\u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435\u0417\u0430\u0447\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e\u041d\u0430\u0447\u043d\u0443 \u0441 \u0447\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u0438\u044f: \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043d\u044f\u0442\u044c BGP \u0438\u0437\u043d\u0443\u0442\u0440\u0438.\u041a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0448\u044c \u0441 \u0441\u0435\u0442\u044f\u043c\u0438, BGP \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0447\u0435\u043c-\u0442\u043e \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u044b\u043c: RFC \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439, \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432 BIRD, FRR, Cisco \u0438 Juniper. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0448\u044c neighbor X.X.X.X remote-as 65444, \u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u2014 \u0447\u0430\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0433\u0430\u0434\u043a\u043e\u0439.\u041a\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u044b? \u041a\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439? \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f? \u0427\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 OPEN, KEEPALIVE \u0438 UPDATE \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438?\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u043d\u0435 \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e BGP.\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430: \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b route-server, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0434\u0430\u0451\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c. \u041d\u0435 full BGP router, \u043d\u0435 policy engine \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043f\u043e BGP, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u0432\u043e\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b, \u0440\u0430\u0431\u043e\u0442\u0430\u0439\u00bb. \u041f\u0440\u0438\u0447\u0451\u043c \u043d\u0430\u0431\u043e\u0440 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441\u0432\u043e\u0439: \u043e\u0434\u0438\u043d \u0445\u043e\u0447\u0435\u0442 Cloudflare + Google, \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u044b, \u0442\u0440\u0435\u0442\u0438\u0439 \u2014 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 HTTP API, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 CLI \u0432 2026 \u0433\u043e\u0434\u0443 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0432\u0435\u043a.\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 BIRD, FRR \u0438 GoBGP\u042f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:BIRD \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0434\u0435\u043c\u043e\u043d, \u043d\u043e \u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0425\u043e\u0447\u0435\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 API? \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439 \u043a\u043e\u043d\u0444\u0438\u0433, \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0439 birdc configure, \u043c\u043e\u043b\u0438\u0441\u044c \u0447\u0442\u043e \u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u043f\u043e\u0434\u0430\u0432\u0438\u043b\u0441\u044f. \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432? \u041d\u0435\u0442, \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.FRR (\u0431\u044b\u0432\u0448\u0438\u0439 Quagga) \u2014 \u0442\u044f\u0436\u0451\u043b\u044b\u0439, \u0441 legacy-\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 overengineering.GoBGP \u2014 \u043c\u043e\u0449\u043d\u044b\u0439, \u043d\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439. \u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0451.\u041e\u0431\u0449\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432\u0441\u0435 \u043e\u043d\u0438 \u2014 full BGP speakers. \u041e\u043d\u0438 \u0443\u043c\u0435\u044e\u0442 \u0432\u0441\u0451 (policy routing, route reflection, MPLS, EVPN), \u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044d\u0442\u043e 90% \u043b\u0438\u0448\u043d\u0435\u0433\u043e.\u0418 \u0442\u0443\u0442 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b: \u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439? \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u043d\u0443\u043b\u044f. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, .NET 10 \u0441 \u0435\u0433\u043e Span&lt;byte&gt;, async\/await \u0438 EF Core \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, ~2500 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u0438\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435.\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u043e\u0434\u0438\u043d \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439. \u041d\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u044f \u043e\u0436\u0438\u0434\u0430\u043b.\u041f\u043e\u0447\u0435\u043c\u0443 .NET\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u00ab\u043c\u043e\u0434\u043d\u044b\u0439\u00bb. \u041d\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u044b:Span&lt;byte&gt; \u0438 Memory&lt;byte&gt;. BGP \u2014 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 ReadOnlySpan&lt;byte&gt; \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u2014 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0412 Go \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 io.Reader \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438, \u0432 Rust \u2014 \u0431\u043e\u0440\u043e\u0442\u044c\u0441\u044f \u0441 borrow checker\u2019\u043e\u043c (\u0445\u043e\u0442\u044f \u0442\u0430\u043c \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u0435\u0435). \u0412 .NET \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e.Async I\/O \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u041a\u0430\u0436\u0434\u0430\u044f BGP-\u0441\u0435\u0441\u0441\u0438\u044f \u2014 \u044d\u0442\u043e \u0434\u0432\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b (\u0447\u0442\u0435\u043d\u0438\u0435 \u0438 keepalive). async\/await + CancellationToken \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0431\u0435\u0437 \u043a\u043e\u043b\u043b\u0431\u044d\u043a\u043e\u0432 \u0438 state machine \u0432\u0440\u0443\u0447\u043d\u0443\u044e.EF Core \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u041f\u0438\u0440\u044b, \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438, \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c. DbContextFactory + SQLite \u2014 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.\u041d\u0443 \u0438 \u0447\u0435\u0441\u0442\u043d\u043e \u2014 \u044f \u043f\u0440\u043e\u0441\u0442\u043e C#-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Go, Rust \u0438\u043b\u0438 C. \u041d\u043e \u0437\u0430\u0447\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u0437\u043d\u0430\u0435\u0448\u044c \u0441\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438 \u043c\u043e\u0436\u0435\u0448\u044c \u043d\u0430 \u043d\u0451\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435? \u041b\u0443\u0447\u0448\u0438\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u044b \u0437\u043d\u0430\u0435\u0448\u044c.\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d BGP (\u043a\u0440\u0430\u0442\u043a\u043e)\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u043b\u0438 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442 BGP \u2014 \u0432\u043e\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438.BGP \u0438\u043c\u0435\u0435\u0442 \u0440\u043e\u0432\u043d\u043e 4 \u0442\u0438\u043f\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:\u0422\u0438\u043f\u041a\u043e\u0434\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435OPEN1\u0420\u0443\u043a\u043e\u043f\u043e\u0436\u0430\u0442\u0438\u0435: ASN, Hold Time, capabilitiesUPDATE2\u0410\u043d\u043e\u043d\u0441\/\u043e\u0442\u0437\u044b\u0432 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438NOTIFICATION3\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e \u0441\u0435\u0441\u0441\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044fKEEPALIVE4\u00ab\u042f \u0436\u0438\u0432\u00bb, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 OPEN\u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 19-\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430: 16 \u0431\u0430\u0439\u0442 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 (0xFF), 2 \u0431\u0430\u0439\u0442\u0430 \u0434\u043b\u0438\u043d\u044b, 1 \u0431\u0430\u0439\u0442 \u0442\u0438\u043f\u0430. \u0424\u043e\u0440\u043c\u0430\u0442 \u2014 \u0436\u0451\u0441\u0442\u043a\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439, \u0431\u0435\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 (FSM). \u0414\u043b\u044f route-server \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439:Idle \u2192 Connect \u2192 OpenSent \u2192 OpenConfirm \u2192 Established\u0412 Established \u0441\u0435\u0441\u0441\u0438\u044f \u0436\u0438\u0432\u0451\u0442: \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f UPDATE (\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b) \u0438 KEEPALIVE (\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0438). \u0415\u0441\u043b\u0438 HOLD Timer \u0438\u0441\u0442\u0451\u043a \u0438\u043b\u0438 \u043f\u0440\u0438\u0448\u0451\u043b NOTIFICATION \u2014 \u0441\u0435\u0441\u0441\u0438\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.UPDATE \u2014 \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0440\u0438 \u0441\u0435\u043a\u0446\u0438\u0438:Withdrawn Routes \u2014 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0438\u0440 \u043e\u0442\u0437\u044b\u0432\u0430\u0435\u0442Path Attributes \u2014 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 (Origin, AS_PATH, Next Hop, Communities)NLRI (Network Layer Reachability Information) \u2014 \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b\u041f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e: \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0430\u0449\u0438\u0435 \u0431\u0430\u0439\u0442\u044b. 192.168.0.0\/16 \u2014 \u044d\u0442\u043e 3 \u0431\u0430\u0439\u0442\u0430, \u0430 \u043d\u0435 5. \/24 \u2014 4 \u0431\u0430\u0439\u0442\u0430. \/0 \u2014 1 \u0431\u0430\u0439\u0442 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u0438\u043d\u0430).\u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (capabilities, communities, MP-BGP) \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u044d\u0442\u043e\u0433\u043e \u0431\u0430\u0437\u0438\u0441\u0430. \u0411\u0430\u0437\u043e\u0432\u044b\u0439 BGP \u043f\u043e\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 BGPLite  \u041a\u043b\u0438\u0435\u043d\u0442 (BIRD\/Cisco\/Mikrotik)         \u2502         \u2502 BGP (TCP :179)         \u25bc\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502   BGP Server    \u2502    \u2502    HTTP API      \u2502\u2502  (BgpSession)   \u2502    \u2502  (:5000)         \u2502\u2502  (BgpMetrics)   \u2502    \u2502                  \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518         \u2502                      \u2502         \u25bc                      \u25bc\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502              Peer Store                 \u2502\u2502         (EF Core + SQLite)              \u2502\u2502  Peer \u2192 Subscription \u2192 CustomPrefix     \u2502\u2502  Peer \u2192 Community                       \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                 \u2502         \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510         \u25bc               \u25bc\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502  Route Table   \u2502 \u2502  Prefix      \u2502\u2502  (Community    \u2502 \u2502  Service     \u2502\u2502   Filters)     \u2502 \u2502  (Cache)     \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518                          \u2502                   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                   \u25bc              \u25bc            \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510            \u2502 RIPE Stat  \u2502 \u2502 nets.txt  \u2502            \u2502 API        \u2502 \u2502 (local)   \u2502            \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u041f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 7 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043f\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438:BGPLite\/               # Entry point, DI, host setupBGPLite.Protocol\/      # \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\/\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 BGP-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (0 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439)BGPLite.Server\/        # TCP listener, BGP session FSMBGPLite.Routing\/       # Route table, community filtersBGPLite.Providers\/     # RIPE Stat \u043a\u043b\u0438\u0435\u043d\u0442, \u043a\u0435\u0448, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044bBGPLite.Api\/           # HTTP API, EF Core, PeerStoreBGPLite.Configuration\/ # YAML-\u043a\u043e\u043d\u0444\u0438\u0433Protocol \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u0441\u0435\u0442\u044c. Server \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e \u0431\u0430\u0437\u0443. Routing \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e HTTP. \u0427\u0438\u0441\u0442\u044b\u0439 modular monolith \u0431\u0435\u0437 \u043e\u0432\u0435\u0440-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430.\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0438\u0440\u0430:public class Peer{    public string Id { get; set; } = Guid.NewGuid().ToString();    public string Ip { get; set; } = &#171;&#187;;    public uint? Asn { get; set; }    public string? Description { get; set; }    public string Status { get; set; } = &#171;inactive&#187;;    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;    public DateTime? LastSessionAt { get; set; }    public List&lt;PeerCommunity&gt; Communities { get; set; } = [];    public List&lt;PeerSubscription&gt; Subscriptions { get; set; } = [];    public List&lt;PeerCustomPrefix&gt; CustomPrefixes { get; set; } = [];}\u041a\u043e\u0433\u0434\u0430 \u043f\u0438\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e BGP, \u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0449\u0435\u0442 \u0435\u0433\u043e \u0432 \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e IP-\u0430\u0434\u0440\u0435\u0441\u0443 \u2014 \u0438 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u043e\u0442\u0434\u0430\u0442\u044c. \u0423 \u043f\u0438\u0440\u0430 \u0442\u0440\u0438 \u0432\u0438\u0434\u0430 \u0441\u0432\u044f\u0437\u0435\u0439: community-\u0444\u0438\u043b\u044c\u0442\u0440\u044b (\u043a\u0430\u043a\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c), \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043d\u0430 AS-\u043b\u0438\u0441\u0442\u044b (\u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c) \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b (\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435).\u0421\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044bTCP-\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0441\u043b\u043e\u043c\u0430\u043b\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0437\u0430 \u0432\u0435\u0447\u0435\u0440. \u041e\u0442\u043a\u0440\u044b\u043b TCP-\u0441\u043e\u043a\u0435\u0442, \u0447\u0438\u0442\u0430\u044e \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 NetworkStream.ReadAsync(), \u043f\u0430\u0440\u0441\u044e BGP-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0421 BIRD \u043d\u0430 localhost \u2014 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e.\u041f\u043e\u0442\u043e\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c. \u0418 \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c.ReadAsync \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d BGP-\u043f\u0430\u043a\u0435\u0442. TCP \u2014 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u041e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432 ReadAsync \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c:\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (TCP-\u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0448\u0451\u043b \u043d\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c)\u041f\u043e\u043b\u0442\u043e\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u0434\u0432\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441\u043a\u043b\u0435\u0438\u043b\u0438\u0441\u044c \u0432 \u0431\u0443\u0444\u0435\u0440\u0435)0 \u0431\u0430\u0439\u0442 (\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u043e)\u041c\u043e\u0439 \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434:\/\/ \u041d\u0415 \u0414\u0415\u041b\u0410\u0419\u0422\u0415 \u0422\u0410\u041avar buffer = new byte[4096];var read = await stream.ReadAsync(buffer, ct);var message = BgpMessageReader.ReadMessage(buffer.AsSpan(0, read));\u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043d\u0430 localhost, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u041d\u043e \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u2014 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0441 \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u044b\u043c\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u00abInvalid BGP marker\u00bb \u0438\u043b\u0438 \u00abMessage too short\u00bb.\u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c ReadExactAsync, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442:private async Task ReadExactAsync(Memory&lt;byte&gt; buffer, CancellationToken ct){    var totalRead = 0;    while (totalRead &lt; buffer.Length)    {        var read = await _stream.ReadAsync(buffer[totalRead..], ct);        if (read == 0)            throw new IOException(&#171;Connection closed by peer&#187;);        totalRead += read;    }}\u0418 \u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0434\u0432\u0430 \u043f\u0440\u0438\u0451\u043c\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 19 \u0431\u0430\u0439\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (\u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443), \u0437\u0430\u0442\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0447\u0430\u0441\u0442\u044c. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f ArrayPool&lt;byte&gt; \u2014 \u0432\u043c\u0435\u0441\u0442\u043e new byte[4096] \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u044b \u0430\u0440\u0435\u043d\u0434\u0443\u0435\u043c \u0431\u0443\u0444\u0435\u0440 \u0438\u0437 \u043f\u0443\u043b\u0430. \u041f\u0440\u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0441\u0441\u0438\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 GC pressure \u0437\u0430\u043c\u0435\u0442\u043d\u0430.ASN32: \u0434\u0432\u0430 \u0434\u043d\u044f \u0434\u0435\u0431\u0430\u0433\u0430\u042f \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e ASN \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e 16-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 OPEN-\u043f\u0430\u043a\u0435\u0442\u0435. \u041f\u0435\u0440\u0432\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0441 BIRD (ASN 65444) \u043f\u0440\u043e\u0448\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u041f\u043e\u0442\u043e\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0441 ASN 397143 \u2014 \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430\u0441\u044c.\u0414\u0432\u0430 \u0434\u043d\u044f \u044f \u0438\u0441\u043a\u0430\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0435\u0440\u043d\u044b\u0439, \u0431\u0430\u0439\u0442\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435, \u043d\u043e \u043f\u0438\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439&#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-483352","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483352","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=483352"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/483352\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=483352"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=483352"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=483352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}