http 响应的最大大小是多少?

What is the maximum size of an http response?

我正在创建一个 HTTP 下载管理器,我在 c# 中使用纯套接字。

我不知道在每个 网络流读取 函数中我应该读取多少 HTTP 数据。

如果我读到大约1024字节,没关系。

但我想知道如何计算出每次读取有多少数据可用?

这是我正在使用的代码

try
{
    if (port == 443)
        sslStream.Read(buffer, current_read, buffer.Length);
    else
        netStream.Read(buffer, current_read, buffer.Length);
}
catch (Exception ex)
{
    Console.WriteLine("disconnected , can't read from stream");
    return;
}

当socket中有数据时stream的read函数才会起作用。但没有提到缓冲区大小。我的意思是我应该将缓冲区长度设置为 tcp 协议最大数据包大小 (64KB) 吗?

HTTP 规范没有对帖子/Get 施加特定的大小限制。它们通常会受到 Web 服务器或用于处理表单提交的编程技术的限制。

TcpClient.Available

https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient.available?view=net-5.0

获取已从网络接收并可供读取的数据量。

Available 属性 是一种确定数据是否排队等待读取的方法。如果数据可用,调用 Read 获取数据。可用数据是网络缓冲区中排队等待读取的数据总量。如果网络缓冲区中没有数据排队,可用 returns 0.

如果远程主机关闭或关闭连接,Available 可能会抛出 SocketException。如果收到 SocketException,请使用 SocketException.ErrorCode 获取特定的错误代码。获取此代码后,您可以参考 Windows Sockets version 2 API 错误代码文档以获得详细的错误描述。

参考是: https://referencesource.microsoft.com/#system/net/system/net/Sockets/Socket.cs

第 345 行

这是对操作系统dll文件的另一个调用,我猜它们是C或C++语言。

这是在c#中实际调用的方法。 UnsafeNclNativeMethods.OSSOCK.ioctlsocket

/// <devdoc>
    ///    <para>
    ///       Gets the amount of data pending in the network's input buffer that can be
    ///       read from the socket.
    ///    </para>
    /// </devdoc>
    public int Available {
        get {
            if (CleanedUp) {
                throw new ObjectDisposedException(this.GetType().FullName);
            }

            int argp = 0;

            // This may throw ObjectDisposedException.
            SocketError errorCode = UnsafeNclNativeMethods.OSSOCK.ioctlsocket(
                m_Handle,
                IoctlSocketConstants.FIONREAD,
                ref argp);

            GlobalLog.Print("Socket#" + ValidationHelper.HashString(this) + "::Available_get() UnsafeNclNativeMethods.OSSOCK.ioctlsocket returns errorCode:" + errorCode);

            //
            // if the native call fails we'll throw a SocketException
            //
            if (errorCode==SocketError.SocketError) {
                //
                // update our internal state after this socket error and throw
                //
                SocketException socketException = new SocketException();
                UpdateStatusAfterSocketError(socketException);
                if(s_LoggingEnabled)Logging.Exception(Logging.Sockets, this, "Available", socketException);
                throw socketException;
            }

            return argp;
        }
     }