TCP Listener
Trên trang này
- Nguồn mã#
- Pipeline accept và khởi tạo#
- Hàm dựng và API công khai#
- Số liệu (TcpListenerBase.LMetrics)#
- Các hệ thống con chính#
- 1. Bind và tinh chỉnh socket (TcpListener.SocketConfig.cs)#
- 2. PROXY Protocol v1/v2 (TcpListener.ProxyProtocol.cs)#
- 3. Kênh xử lý accept có giới hạn (TcpListener.ProcessChannel.cs)#
- API liên quan#
Namespace: Nalix.Network.Listeners.Tcp
Assembly: Nalix.Network
TcpListenerBase (public abstract partial class TcpListenerBase : IListener) là listener TCP cơ sở của Nalix.Network (và là lớp cơ sở của WebSocketListenerBase). Nó quản lý việc bind socket, các vòng accept SocketAsyncEventArgs đa worker, trích xuất IP thật qua PROXY Protocol v1/v2 (tùy chọn), kiểm soát chấp nhận bằng ConnectionGuard, một kênh xử lý accept có giới hạn, và đăng ký với TimingWheel.
Nguồn mã
src/Nalix.Abstractions/Networking/IListener.cssrc/Nalix.Network/Listeners/TcpListener/TcpListener.Core.cssrc/Nalix.Network/Listeners/TcpListener/TcpListener.PublicMethods.cssrc/Nalix.Network/Listeners/TcpListener/TcpListener.Handle.cssrc/Nalix.Network/Listeners/TcpListener/TcpListener.ProcessChannel.cssrc/Nalix.Network/Listeners/TcpListener/TcpListener.ProxyProtocol.cssrc/Nalix.Network/Listeners/TcpListener/TcpListener.SocketConfig.cssrc/Nalix.Network/Listeners/TcpListener/TcpListener.Synchronization.cssrc/Nalix.Network/Listeners/TcpListener/TcpListener.Metrics.cssrc/Nalix.Network/Options/NetworkSocketOptions.cssrc/Nalix.Network/Options/ProxyProtocolOptions.cs
Pipeline accept và khởi tạo
flowchart TD
Sock["Listening Socket (Port)"] --> Acc["SAEA Accept Worker (MaxParallel)"]
Acc --> Proxy{"ProxyProtocolOptions.Enabled?"}
Proxy -->|No| Guard["ConnectionGuard.TryAccept(remoteEndPoint)"]
Proxy -->|Yes| ProxyGate["RequireTrustedProxy Check + Async PROXY v1/v2 Header Read"]
ProxyGate -->|Valid Header| GuardReal["ConnectionGuard.TryAccept(realEndPoint)"]
ProxyGate -->|Timeout / Invalid| Close["Close Socket"]
Guard -->|Rejected| Close
Guard -->|Accepted| Enq["Bounded ProcessChannel.Writer.TryWrite"]
GuardReal -->|Accepted| Enq
GuardReal -->|Rejected| Close
Enq -->|Channel Full| Release["Limiter.Release + Close Socket"]
Enq -->|Queued| Drain["ProcessChannel Consumer Worker"]
Drain --> Init["InitializeAcceptedSocket (Connection + FramePipeline + TimingWheel)"]
Init --> Proto["IProtocol.OnAccept(connection, ct)"]Hàm dựng và API công khai
namespace Nalix.Network.Listeners.Tcp;
public abstract partial class TcpListenerBase : IListener
{
protected TcpListenerBase(ushort port, IProtocol protocol, IConnectionHub hub, IConnectionGuard guard);
protected TcpListenerBase(IProtocol protocol, IConnectionHub hub, IConnectionGuard guard);
public int ProcessChannelCount { get; }
public LMetrics Metrics { get; }
protected internal IConnectionGuard Limiter { get; }
public virtual void Activate(CancellationToken cancellationToken = default);
public virtual void Deactivate(CancellationToken cancellationToken = default);
public virtual string GenerateReport();
public virtual void WriteReportData(Utf8JsonWriter writer);
public void Dispose();
protected virtual void Dispose(bool disposing);
}
Số liệu (TcpListenerBase.LMetrics)
TcpListenerBase.LMetrics (Nalix.Network.Listeners.Tcp, TcpListener.Metrics.cs) là lớp lồng public sealed được lộ ra qua TcpListenerBase.Metrics. Nó theo dõi các bộ đếm vòng đời kết nối bằng các lần đọc atomic không khóa. Tất cả thành phần đều là thuộc tính long chỉ đọc:
| Thuộc tính | Ý nghĩa |
|---|---|
TotalAccepted | Số kết nối đã chấp nhận. |
TotalErrors | Số lỗi khi accept. |
TotalRejected | Số kết nối bị từ chối, gồm cả từ chối do hàng đợi đầy và do limiter/guard. |
TotalProxyProtocolErrors | Số lỗi handshake PROXY protocol. |
TotalQueueFullRejections | Số lần từ chối do hàng đợi đầy. |
TotalLimiterRejections | Số lần bị limiter/guard từ chối. |
Các hệ thống con chính
1. Bind và tinh chỉnh socket (TcpListener.SocketConfig.cs)
- Dual-stack IPv6 / IPv4 dự phòng: Khi
NetworkSocketOptions.EnableDualStacklàtrue(mặc định),TcpListenerBasebind một socketInterNetworkV6vớiDualMode = _config.DualMode(true), và chuyển sangInterNetwork(IPv4) nếu hệ điều hành không hỗ trợ dual-stack IPv6. - Tùy chọn socket: Cấu hình
ReuseAddress,ReusePort,TcpFastOpen,Backlog(512),NoDelay(true),SendBufferSize/ReceiveBufferSize(BufferSize = 65536), và các probe TCP Keep-Alive đa nền tảng (3sthời gian,1skhoảng cách,3lần thử lại).
2. PROXY Protocol v1/v2 (TcpListener.ProxyProtocol.cs)
Khi ProxyProtocolOptions.Enabled là true:
- Nếu
ProxyProtocolOptions.RequireTrustedProxylàtrue, chỉ những peer vật lý khớp vớiTrustedProxyOptionsmới được phép gửi header PROXY. - Giới hạn số lần đọc header PROXY đang xử lý đồng thời ở
ProxyProtocolOptions.MaxPendingProxyConnections(1024), với thời gian chờHeaderTimeoutMs(2000ms). - Phân tích header PROXY v1 hoặc v2 qua
ProxyProtocolParser, lấyEndPointclient thật, truyền vàoConnectionGuard.TryAccept, và chèn các byte còn thừa vàoConnectionquaInjectPreReadBytes.
3. Kênh xử lý accept có giới hạn (TcpListener.ProcessChannel.cs)
- Các kết nối đã accept được ghi vào một
Channel.CreateBounded<AcceptConnectionResult>có kích thướcNetworkSocketOptions.ProcessChannelCapacity(256). - Nếu luồng tiêu thụ bị quá tải và
TryWritetrả vềfalse, listener gọi_limiter.Release(remoteEndPoint)và đóng socket ngay. - Trong
Deactivate, listener chờ tối đaNetworkSocketOptions.ProcessChannelDrainTimeout(5000ms) để các accept trong hàng đợi được xử lý nốt một cách nhẹ nhàng. - Hỗ trợ ghim CPU tùy chọn cho luồng tiêu thụ dispatch qua
NetworkSocketOptions.DispatchProcessorAffinity(mặc định-1).