一文读懂网络通信

理顺网络通信

很多时候,在不完全清楚的情况下,总是会被socket,websocket,restful 风格,http 协议,tcp,rpc这些知识概念搞得很懵,所以为了能够理顺这些网络通信的概念。我先总结一句话,然后下面在慢慢分析不同的概念对应不同的出处。

小结:俩台计算机通信 必然需要 硬件和软件结合,作为IT行业者则更关心软件层面,sockert作为底层技术手段 可以理解为 操作系统软件层面,而IT行业最熟悉封装的使用了,网络通信亦是如此,直接使用底层总是不友好的,那么更好的实现 就封装了各种 协议比如 http websockert grpc,而restful风格是对于 协议之间交互的规范

一句话:在软件层面进行网络通信,总是根据不同场景需求需要拟定 不同的协议 和风格,而实现 协议和风格的 手段往往都是 通过对socket系统层级封装来作为 软件层级的使用

接下来我将拆分这个总结的话,深刻去了解 通信的过程

通信过程常用五层结构

通信过程 :物理层-链路层-网络层-传输层(tcp/ip协议/udp)-应用层(http协议/)

  1. 物理层:把电脑连接起来的物理手段 网线 光纤 光缆

  2. 链路层: 以太网 帧 电脑唯一mac地址 --不太好记 衍生 IP地址 — 又不太好记 衍生出 域名 DNS就是IP与域名对一个关系 本地host文件 广播

  3. 网络层:主机到主机 网关 交换机 路由器 IP地址 IPv4 内网/外网 (局域网 公网) 子网掩码
    4.1 子网掩码就是来判断电脑ip地址是否在同一局域网内,公网上一个电脑只有一个唯一ip地址
    4.2 但局域网内A可能与局域网B内ip地址相同 就好比 张三家的沙发(局域网张三)跟李四家沙发(局域网李四)一样 但是家具厂沙发A型号(公网)不会摆俩个
    4.3 三元组 又叫半相关 (协议,ip本地地址,本地端口号) 确定程序唯一性 五元组又叫全相关 (协议,本地地址,本地端口号,远地地址,远地端口号) 这样就唯一到唯一建立连接
    4.4 有了这mac地址 IP地址两个地址,数据包才能准确送到接收者手中。但是,前面说过,MAC地址有局限性,如果两台电脑不在同一个子网络,就无法知道对方的MAC地址,必须通过网关(gateway)转发
    在这里插入图片描述

  4. 传输层 :到电脑上还需要正确到程序上 端口-端口 端口(程序编号Udp协议 Tcp协议
    socket: 其实就是网络传输层 传承到 应用层的时候 抽象的一个 通信载体 封装了底层 供使用调用即可 可以理解就是 帮助 完成tcp握手的 工具

  5. 应用层:应用程序接收传输内容 也就是协议规范处 HTTP/S/1/2 DHCP FTP、TELNET、SMTP、DNS、webSocket、grpc 有很多 后续文章会单独讲应用层

通信过程重要,但是高效的应对不同场景需求通信更重要,所以通信性能更重要接下来了解IO模型 传输的效率

五大io模型

关键点理解:五大I/O模型是操作系统提供的通信基础设施你可以理解为底层,不同场景需要的性能考虑方面来决定使用哪种,接下来会介绍5大模型,毕竟是底层当然也会用原生的socket技术来演示,而日常工作使用的协议 其实已经做了封装 屏蔽了内部细节。

  1. 阻塞 I/O 模型
    同步阻塞:调用 I/O 方法(如 Socket.Receive)时,线程被挂起直至数据就绪且完成内核到用户空间的拷贝
    ​流程:
    发起 Receive 请求;
    内核等待数据到达网卡并拷贝至内核缓冲区;
    数据拷贝至用户缓冲区后,线程恢复执行
    适用场景:
    简单单线程客户端/低并发服务端(如简单 TCP 工具)。
    ​缺点:每个连接需独立线程处理,线程资源消耗大,无法支撑高并发(如 C10K 问题)
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Blocking = true; // 默认阻塞模式
byte[] buffer = new byte[1024];
int bytesRead = socket.Receive(buffer); // 阻塞在此处
Console.WriteLine($"Received {bytesRead} bytes.");
  1. 非阻塞 I/O 模型
    同步非阻塞:调用 I/O 方法立即返回状态值(如 EWOULDBLOCK),需轮询检查就绪状态。
    ​流程:
    设置 Socket 为非阻塞模式;
    循环调用 Receive 直至返回成功或超时
    适用场景:
    低并发实时监控(如设备状态轮询)。
    ​缺点:轮询消耗 CPU,需结合多路复用优化
socket.Blocking = false; // 非阻塞模式
while (true)
{
    try
    {
        int bytesRead = socket.Receive(buffer);
        if (bytesRead > 0)
        {
            Console.WriteLine($"Received {bytesRead} bytes.");
            break;
        }
    }
    catch (SocketException ex) when (ex.SocketErrorCode == SocketError.WouldBlock)
    {
        Thread.Sleep(10); // 避免 CPU 空转
    }
}
  1. I/O 多路复用(I/O Multiplexing)
    同步事件驱动:通过 Select/Poll/Epoll 监听多个 Socket 的就绪事件,统一处理。
    ​流程:
    注册多个 Socket 到多路复用器(如 Socket.Select);
    调用 Select 阻塞等待就绪事件;
    遍历就绪 Socket 处理数据
    适用场景:
    高并发服务器(如 HTTP 服务、聊天服务器)。
    ​优势:单线程管理数千连接,减少线程切换开销
List<Socket> sockets = new List<Socket> { socket1, socket2 };
while (true)
{
    List<Socket> readList = new List<Socket>(sockets);
    Socket.Select(readList, null, null, 1000); // 阻塞等待可读事件
    foreach (Socket s in readList)
    {
        byte[] data = new byte[1024];
        int bytesRead = s.Receive(data); // 非阻塞,因 Select 已确认就绪
        Console.WriteLine($"Received {bytesRead} bytes from {s.RemoteEndPoint}");
    }
}
  1. 信号驱动 I/O(Signal-Driven I/O)
    异步通知:内核通过信号(如 SIGIO)通知进程数据就绪,进程再执行 I/O 操作。
    ​流程:
    注册信号处理函数;
    设置 Socket 为信号驱动模式;
    收到信号后读取数据。
    ​C# 限制
    ​跨平台问题:C# 原生不支持信号驱动 I/O(Linux 特有)。
    ​替代方案:使用 SocketAsyncEventArgs 或 async/await 模拟类似行为
  2. 异步 I/O(Asynchronous I/O)
    全异步:数据准备与拷贝均由内核完成,通过回调或 Task 通知用户程序。
    ​流程:
    发起异步操作(如 ReceiveAsync);
    内核完成数据准备与拷贝;
    通过回调或 await 处理结果
    适用场景:
    高性能服务端(如微服务、实时数据处理)。
    ​优势:零阻塞,高吞吐量,天然适配 C# 异步编程模型
public async Task HandleClientAsync(Socket client)
{
    byte[] buffer = new byte[1024];
    int bytesRead = await client.ReceiveAsync(buffer, SocketFlags.None);
    Console.WriteLine($"Received {bytesRead} bytes asynchronously.");
}

在这里插入图片描述

后续跟进系列 应用层 传输层 协议的使用

了解这些之后,重点就是 那些网络协议 使用了什么 网络模型 具体解决什么业务场景。这在后续的文章 会专门针对 应用层协议来进行梳理。也就是实际工作中最常用的相关的 协议 技术了 比如 http grpc websockert 这些,他们的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值