C# 网络编程-关于HTTP/HTTPS的基础(一)

发布于:2025-06-25 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、HTTP基础概念

1. 请求-响应模型

HTTP是基于客户端-服务器的无状态协议,流程如下:

  1. 客户端(如浏览器)发起请求。
  2. 服务器接收请求并处理。
  3. 服务器返回响应,包含状态码、Header和响应体。
  4. 连接关闭,后续请求需重新建立。
链接
后续请求需重新建立连接
客户端发起HTTP请求
服务器接收并处理请求
服务器返回HTTP响应
服务器返回HTTP响应
关闭连接
客户端发起新请求

A → B → C → D → E 表示一次完整的HTTP请求-响应流程。
E → F 表示后续请求需重新建立连接(可选循环)。

  1. 客户端发起请求 :客户端(如浏览器)向服务器发送HTTP请求。
  2. 服务器接收并处理请求 :服务器接收请求并执行相应的处理逻辑(如查询数据库、生成内容等)。
  3. 服务器返回响应 :服务器将处理结果打包成HTTP响应,包含状态码、Header和响应体。
  4. 连接关闭 :HTTP协议默认为无状态,响应完成后关闭连接。
  5. 后续请求需重新建立 :如果客户端需要发起新请求,必须重新建立TCP连接(如HTTP/1.0),或可复用连接(HTTP/1.1的Keep-Alive)。
2. HTTP状态码分类
  • 1xx(信息性状态码):请求已接收,继续处理。
    • 100 Continue:服务器已收到请求头,客户端可继续发送正文。
  • 2xx(成功状态码)
    • 200 OK:请求成功。
    • 201 Created:资源创建成功。
  • 3xx(重定向)
    • 301 Moved Permanently:资源永久移动。
    • 302 Found:临时重定向。
  • 4xx(客户端错误)
    • 400 Bad Request:请求格式错误。
    • 401 Unauthorized:未授权。
    • 403 Forbidden:服务器拒绝访问。
    • 404 Not Found:资源不存在。
  • 5xx(服务器错误)
    • 500 Internal Server Error:服务器内部错误。
    • 503 Service Unavailable:服务器过载或维护。
3. HTTP Headers
  • 请求头(Request Headers):
    • User-Agent:客户端标识(如浏览器类型)。
    • Content-Type:请求体的MIME类型(如application/json)。
    • Accept:客户端可接受的响应类型。
    • Authorization:认证信息(如Bearer Token)。
  • 响应头(Response Headers):
    • Content-Type:响应体的MIME类型。
    • Set-Cookie:设置客户端Cookie。
    • Location:重定向的URL(3xx状态码时使用)。
    • Cache-Control:缓存策略(如no-cache)。
4. Cookie/Session机制
  • Cookie
    • 存储在客户端(浏览器),用于传递会话标识。
    • Set-Cookie:服务器设置Cookie(如Set-Cookie: sessionId=abc123; Path=/)。
    • Cookie:客户端在后续请求中自动携带Cookie。
  • Session
    • 服务端存储会话数据,通过Cookie传递Session ID(如JSESSIONID)。
    • 无状态协议下,通过Cookie关联客户端与服务端Session。

二、HTTPS加密原理(SSL/TLS)

1. SSL/TLS协议概述

HTTPS = HTTP + SSL/TLS,通过加密通信保护数据传输。TLS是SSL的升级版,当前主流为TLS 1.2/1.3。

2. 握手过程(TLS 1.2为例)
  1. ClientHello:客户端发送支持的加密套件(如TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)、协议版本、随机数。
  2. ServerHello:服务器选择加密套件和协议版本,发送自己的随机数。
  3. 证书交换
    • 服务器发送SSL证书(含公钥)。
    • 客户端验证证书有效性(CA签名、域名匹配等)。
  4. 密钥交换
    • 客户端生成预主密钥(Pre-Master Secret),用服务器公钥加密后发送。
    • 双方协商主密钥(Master Secret),用于生成对称加密密钥。
  5. 加密通信: 使用对称加密(如AES)加密后续数据,MAC(如HMAC)验证完整性。
3. 加密与认证机制
  • 非对称加密(如RSA/ECDH):用于初始密钥交换,确保密钥安全。
  • 对称加密(如AES):用于高效加密应用数据。
  • 证书认证:通过CA(证书颁发机构)验证服务器身份。
  • 前向保密(PFS):使用ECDHE等算法,确保单个密钥泄露不影响其他会话。

三、C#实现方案

1. 使用HttpClient发送HTTP/HTTPS请求
using System.Net.Http;
using System.Threading.Tasks;

public class HttpClientExample
{
    public async Task<string> SendGetRequest(string url)
    {
        using var client = new HttpClient();
        HttpResponseMessage response = await client.GetAsync(url);
        response.EnsureSuccessStatusCode(); // 抛出异常(如404/500)
        return await response.Content.ReadAsStringAsync();
    }
}
2. 设置请求头与处理响应
public async Task<string> SendPostRequest(string url, string jsonContent)
{
    using var client = new HttpClient();
    var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
    
    // 设置请求头
    client.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0");
    client.DefaultRequestHeaders.Add("Authorization", "Bearer your_token");
    
    HttpResponseMessage response = await client.PostAsync(url, content);
    return await response.Content.ReadAsStringAsync();
}
3. Cookie管理(自动处理)
// 使用CookieContainer自动管理Cookie
var handler = new HttpClientHandler
{
    CookieContainer = new CookieContainer()
};
using var client = new HttpClient(handler);

// 首次请求设置Cookie
await client.GetAsync("https://example.com/login");

// 后续请求自动携带Cookie
var response = await client.GetAsync("https://example.com/protected");
4. 处理HTTPS证书问题(测试环境)
// 忽略证书验证(仅用于测试!生产环境应避免)
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) => true;

// 使用HttpClient
using var client = new HttpClient();
var response = await client.GetAsync("https://self-signed-site.com");
5. 低级TLS通信(SSLStream示例)
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;

public async Task UseSSLStream()
{
    var tcpClient = new TcpClient("example.com", 443);
    var stream = tcpClient.GetStream();
    
    // 创建SSL流,验证服务器证书
    var sslStream = new SslStream(
        stream,
        false,
        (sender, cert, chain, errors) => 
        {
            // 自定义证书验证逻辑
            return cert != null && cert.Get IssuerName.Name == "Your CA";
        });

    await sslStream.AuthenticateAsClientAsync("example.com");
    
    // 发送请求并读取响应
    byte[] requestBytes = Encoding.UTF8.GetBytes("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n");
    await sslStream.WriteAsync(requestBytes, 0, requestBytes.Length);
    
    byte[] buffer = new byte[4096];
    int bytesRead = await sslStream.ReadAsync(buffer, 0, buffer.Length);
    string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);
}

四、关键注意事项

  1. HTTPS安全性
    • 生产环境禁用ServerCertificateValidationCallback忽略证书错误。
    • 使用最新TLS版本(TLS 1.2/1.3)和加密套件。
  2. HttpClient复用:避免频繁创建HttpClient,应作为单例使用(防止Socket耗尽)。
  3. 异常处理:捕获HttpRequestException处理网络错误或状态码异常。

网站公告

今日签到

点亮在社区的每一天
去签到