ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Linux】网络概述

【Linux】网络概述 前言不管是后端开发、运维、前端网络都是必备底层基础。本文从网络发展历程、协议本质、分层模型、数据封装/分用、IP/MAC/端口、Socket预备介绍。网络通信不是两台机器硬件通信而是两台主机上的应用进程例如微信服务器---微信客户端单进程通信管道、共享内存、消息队列依赖本机操作系统网络跨主机进程间通信网络作为跨主机的公共资源进程通过操作系统的系统调用读写网络协议栈完成收发一、计算机网络的四个发展阶段引入早些年为了完成多台计算机之间的相互协作需要用软盘做数据拷贝然后将软盘运输到别的地方。为了提高效率将所有计算机连接起来就可以把一台计算机的数据直接传送给下一台计算机 —— 网络计算机互连的雏形。随着网络发展局域网逐渐形成。为了实现更远的传输距离一个区域的子网和另一个区域的子网也要连接从而引发一系列问题数据怎么准确定位到目标主机 —— MAC 地址网卡在出厂时MAC 地址全网唯一远距离传输信号衰减 —— 交换机、集线器信号放大不同的子网用路由器连接构成局域网LAN的概念。随着远距离传输的需求提升用户量上升硬件设备发展形成广域网。用户量决定经济效益才有了建基站等一系列行为。计算机诞生初期设备相互独立随着协同办公需求逐步演化出单机、局域网、广域网最终形成互联网。1. 独立单机特点每台电脑完全隔离数据本地存储无法互通痛点数据无法共享切换业务需要更换主机2. 多机互联新增中心服务器统一存储业务数据每个人拥有独立电脑业务可自由切换实现基础数据共享。3. 局域网 LAN本地小规模网络定义同一机房、公司、校园内的计算机通过交换机、路由器连接形成本地网络核心设备交换机数据链路层、路由器网络层优势传输速度快、延迟低支持百台设备同时通信局域网协议以太网、令牌环网、无线局域网等4. 广域网 WAN跨地域互联网定义通过路由器串联全球各地局域网形成跨城市、跨国的大范围网络关键概念LAN与WAN是相对概念互联网本质是超大广域网核心逻辑路由器负责跨网段路由转发实现千里之外设备互通。二、什么是网络协议为什么需要分层引入长距离传输时光电信号发生衰减通信沟通成本提升、网络复杂度随新技术不断增加因此诞生了协议协议就是通信双方预先达成的约定。任何协议的形成由于传输距离变远而引发一系列问题。类比快递快递盒、快递单附加源地址目标地址等这一附加部分就是协议计算机网络中协议用C 语言结构体来描述结构体最后转化为二进制比特流发送数据时把结构体字段拷贝到业务数据前面就完成报头添加也就是封装通信双方使用一致的结构体协议接收端进行报文的分用去除协议结构体进行报头和有效载荷分离交付给上层协议就是将一串二进制信号赋予特殊含义1. 协议通俗定义协议 通信双方统一遵守的约定。计算机只能传输0/1光电信号不同厂商硬件、操作系统想要互通必须统一数据格式、传输规则这套通用标准就是网络协议。举个生活化例子打电话双方约定响铃、对话、挂断的规则就是通信协议如果一方说中文、一方说外语即便有通信线路也无法沟通两个人打电话时用户 1 和用户 2 分别对电话 1 和电话 2 交互双方只听到电话里面的声音实际声音的压缩、编码、加密、转化成光电信号以及两个电话之间通信的协议用户并不知道站在用户的角度用户 1 和用户 2 在相互沟通电话 1 和电话 2 之间对光电信号的处理以及播放做协商在逻辑上用户和用户在同一层进行沟通电话和电话在同一层进行沟通用户之间在进行正常通信之前先打个招呼进行握手保证通信链路打通 —— 类似 TCP 协议双方都能听到再进行正常数据收发此外上层并不关心下层数据怎么切片、怎么分发只要保证对方收到数据就可以从而上层和下层有一定的隔离当底层通信协议变成无线电协议两个人仍然可以进行正常沟通 —— 数据链路层的令牌环网和以太网此外用户 1 和用户 2 也可以进行协商例如双方都使用英语 —— 应用层上协商使用 HTTP 协议2. 协议分层的核心好处解耦分层是软件模块化思想每层只负责自己的工作上下层仅通过固定接口交互高内聚低耦合上下层协议更换不会产生太多问题满足不同协议的通信场景维护成本降低三、两大经典分层模型OSI七层 vs TCP/IP五层四层1. OSI七层参考模型理论标准由ISO国际标准化组织制定完整定义网络通信全流程自上而下7层层级名称核心功能对应设备/协议7应用层面向用户程序提供应用通信接口HTTP、FTP、SSH、浏览器、QQ6表示层数据格式转换、加密、压缩、编码SSL/TLS、MIME5会话层建立/管理/断开通信会话RPC、SIP4传输层端到端进程传输可靠/不可靠控制TCP、UDP3网络层IP寻址、跨网段路由转发IP、ICMP、路由器2数据链路层局域网帧传输、MAC寻址、差错校验以太网、交换机、网卡1物理层传输0/1比特流电/光信号网线、光纤、集线器Hub问题会话层负责建立和断开连接表示层用来设备固有数据格式和网络标准数据格式的转换 —— 接收文字流、图像、声音等但是在实践中不同的场景下这两层不可能写到操作系统内部所以工程上把网络协议层状结构划分为五层协议五层协议物理层、数据链路层、网络层、传输层、应用层实际编写时写的是上四层不管物理层。此外会话层和表示层必须要编写这几层最重要的是 TCP、IP 协议这样的网络协议栈又称为 TCP/IP 网络协议栈传输层、网络层、数据链路层的代码写到操作系统内核中OS 向上提供调用接口。2. TCP/IP五层模型实际互联网、操作系统内核使用的分层合并OSI上层三层拆分底层硬件层兼顾理论与实操应用层合并OSI 5/6/7层所有用户程序网络交互HTTP、DNS、FTP网卡可以是硬件网络通信就是在访问硬件资源但是用户不能直接访问硬件操作系统作为资源的管理者为用户提供了系统调用接口来贯穿网络协议栈实现网络通信在应用层是基于网络系统调用接口编写的协议例如HTTP、SMTP 等网络协议栈是不同操作系统都要遵守的。传输层TCP/UDP协议区分主机内不同进程传输层保证数据传递出问题怎么办、或者安全性网络层IP协议跨网段寻址路由解决主机定位路由到哪个子网根据源ip和目的ip路由器工作在网络层具有网络层之下的功能如交换机、集线器的功能数据链路层以太网帧、MAC地址局域网设备转发网络是拓扑结构只要在任意子网内部任意两台主机可以通信才有实现相隔万里的不同主机间的通信但是物理层只负责 01 光电信号的传输但不知道发给哪一个相邻设备。数据链路层解决同一局域网内相邻直接相连设备之间的数据帧传输、设备识别问题也就是主机在子网的通信帧数据链路层传输的数据单元叫数据帧。把上层的数据封装成帧加上头部尾部交给物理层变成比特流发送出去MAC 地址网卡驱动工作在数据链路层每一块网卡有全球唯一的 MAC 物理地址。局域网内用来识别设备表示这一帧要发给局域网哪一台相邻主机交换机根据 MAC 地址转发帧在局域网内完成各个主机之间的一跳交付物理层网线、光纤、电磁波原始比特流传输物理层不处理数据、不理解帧、IP 报文只负责光电信号的传输定义硬件电气特性、传输速率、距离、抗干扰能力把二进制转换成物理介质上可传递的信号集线器光电信号在长距离传输时会发生信号衰减集线器做信号放大、整形、不解析数据内容。物理层只管硬件介质与光电信号 → 信号长距离必然衰减 → 使用集线器放大信号延长传输距离。家庭网络完整链路光纤入户‑光猫‑双绞线‑路由器‑有线网线 / Wi‑Fi。补充TCP/IP四层模型 五层去掉物理层把链路物理合并为「网络接口层」。各层级对应硬件设备总结集线器Hub仅物理层交换机Switch物理层数据链路层路由器Router物理链路网络层电脑/服务器完整五层内核实现1-4层应用实现应用层各层数据包命名应用层请求、响应传输层数据段TCP数据包UDP网络层IP数据报数据链路层数据帧通信过程发送应用层 → 传输层 → 网络层 → 数据链路层 → 物理层逐层加上本层报头层层封装最后变成比特流交给网卡硬件通过网线 / 光纤发出去接收网卡收到比特流物理层往上交付逐层剥掉对应层的头部层层解封装一直向上递交最终数据送到对方的应用层逻辑上各层对等层虚拟直接通信物理上发送方从上到下逐层封装经过硬件传输接收方从下到上逐层解封装依靠两端每一层预先约定好的协议结构体实现对报文头部的识别解析总结整套网络协议栈每一层都有属于本层自己的协议---结构体、报文头部字段还有对应的解析代码。通信双方同一层级协议、报文格式完全预先约定一致。能做到同层互相读懂根源在于通信两端每一层协议结构体、字段格式预先全局约定统一。四、网络通信核心流程封装 分用1. 封装发送端从上到下逐层加头部主机发送数据时每一层都会在上层数据前添加本层协议头部Header最终组装成二进制比特流交给网卡发送。封装顺序应用层添加应用头部 → 应用数据传输层添加TCP/UDP头部 → TCP段 / UDP数据报网络层添加IP头部 → IP数据报链路层添加帧头(MAC)帧尾校验 → 以太网帧物理层转换为0/1电信号通过网线传输专业名词报文 报头 有效载荷各层数据名称应用层数据、传输层数据段、网络层数据包、链路层数据帧2. 分用接收端从下到上逐层剥头部分用顺序数据链路层网络层传输层应用层分层分发规则链路层根据帧类型字段区分IP/ARP报文网络层根据IP头协议字段区分TCP/UDP/ICMP传输层根据端口号把数据交给主机内对应进程浏览器、MySQL等下层不会看懂上层报头解耦合传输层看不懂微信版本网络层看不懂序列号每层只处理属于自己的头部字段横线以上用户态用户空间运行应用程序处理业务应用逻辑比如视频软件、游戏、浏览器横线以下内核态操作系统内核操作系统内部负责处理全部网络通信底层细节协议栈传输层、网络层、链路层运行在内核协议两大特性报头和有效载荷分离分用功能协议栈是一棵倒置多叉树底层只有一个网卡驱动但是上层同时运行很多协议分用就是把有效载荷分离出来决定交给上层协议的哪一个五、三大核心地址MAC地址、IP地址、端口号1. MAC地址数据链路层局域网标识规格48位6字节十六进制网卡出厂固化全球唯一例08:00:27:03:fb:19作用同一局域网内定位设备交换机依靠MAC转发数据特点跨路由器传输时每经过一台路由源/目标MAC地址会重新改写全程变化2. IP地址网络层全网主机标识IPv432位4字节点分十进制192.168.2.2IPv6128位16字节作用跨网段定位主机全程路由转发时源IP、目标IP始终不变对比MAC/IPIP是远程目标地址MAC是下一跳邻居地址IP网络层存在的意义提供网络虚拟层让所有网络都是IP网络屏蔽底层网络差异例如以太网和令牌环网3. 端口号传输层进程标识一台主机可以同时运行浏览器、QQ、数据库IP只能找到主机端口用来区分内部进程16位2字节整数范围0~655350-1023知名固定端口HTTP80、SSH22、MySQL33061024-65535客户端动态临时端口操作系统自动分配规则一个端口只能绑定一个进程一个进程可绑定多个端口一个服务器监听多个端口服务端进程绑定端口号客户端报文携带目的端口号告诉操作系统数据交给哪个进程响应报文交换源端口、目的端口回传给客户端进程进程PID不能替换端口号的原因PID是内核本地标识且进程重启后会动态变化不能放在网络报文在互联网传输端口号是传输层协议定义写在报文头部可以跨网络传递PID用于本机内核管理进程端口号用于网络层面区分进程。不同功能需要解耦合PID 属于进程管理子系统如果网络直接依赖 PID一旦操作系统修改 PID 分配规则、数据类型网络模块就要跟着改动牵一发而动全身强耦合端口号进程调用系统调用bind()绑定端口本质 操作系统传输层维护一张哈希表key 为端口号value 存放对应进程 PCB进程控制块的指针绑定端口拿端口号做哈希计算找到对应表项表项空闲就填入该进程 PCB 指针表项已占用直接绑定失败传输层读取报文头部的目的端口号拿端口号做同样哈希运算在哈希表找到对应的进程 PCB将报文有效载荷拷贝到该进程对应的 socket 文件缓冲区进程像读取普通文件一样从 socket 缓冲区读取数据服务端口写死在客户端 APP 内部客户端发起连接时直接带上服务器端口。客户端端口一般由操作系统随机分配临时端口4. Socket套接字IP端口定义IP地址 端口号组合称为Socket意义全网唯一标识一台主机上的某一个网络进程通信本质网络就是两个Socket进程内核之间的数据交互四元组源IP、源端口、目标IP、目标端口唯一确定一条通信链路。局域网通信局域网属于多主机共享资源同一时刻只能允许一台主机发送数据否则会发生数据碰撞数据出错物理缓解交换机可以划分碰撞域如果左侧发生碰撞则发生碰撞的数据不会转发给右侧协议解决令牌环网只有拿到令牌的主机才有发送数据的权限发完把令牌传递给下一台设备属于数据链路层协议---网络分层解耦替换底层协议不影响上层协议算法解决碰撞避免算法发送数据的主机执行局域网以太网原始模式是广播所有人硬件都收到数据靠底层链路层判断是否属于自己不属于就丢弃。这也是局域网存在嗅探抓包安全风险的根源。当网卡工作模式是混杂模式时接收所有到达本主机的以太网帧而不是丢弃常用于抓包和网络监控同一局域网持续发送大量垃圾报文制造信号碰撞干扰正常主机通信破坏局域网网络远程通信流程路由器处理细节链路层剥掉以太网帧头把 IP 数据包上交给网络层读取 IP 报头中的目的 IP仍然是 Server 的 IP查询自身路由表判断该目的 IP属于自己另一侧直连的局域网IP 包头源 / 目的 IP 保持原样不变路由器会重新封装全新的以太网帧重新填写新的源 MAC路由器出口 MAC和目的 MACServer 主机 MAC再转发到右侧局域网最终送达 Server 主机获取目的主机的MAC使用的ARP协议路由判断目标网段 IP 地址分为网络号 主机号依靠子网掩码区分。路由器路由表依据网络号做路由选择先找到目标网络到达目标网络内部再定位具体主机MAC 地址IP 地址作用范围局域网内部全网互联网跨路由器寻址是否变化每经过一跳路由器重新改写端到端全程保持不变功能同一局域网内交付帧做路径规划定位全网主机六、传输层两大核心协议TCP vs UDPTCP传输控制协议有连接、可靠传输、面向字节流面向连接通信前必须建立连接类比打电话正常通信前的确保信道对应三次握手可靠传输传输层内核自动完成序号、去重、丢包重传、流量控制、乱序重组、拥塞控制可靠性的实现复杂需要内核维护大量状态例如网银支付、文件浏览UDP用户数据报协议无连接、不可靠传输、面向数据报无连接不需要提前建立连接拿到数据直接封装报文就往外发送类比发邮件投递出去不需要确认对方在线面向数据报数据有明确边界发一个报文收就完整收一个不会拆分包不可靠内核发送完报文就彻底脱手报文丢了、乱序UDP 本身完全不处理适用场景可以容忍少量丢包追求低延迟。直播视频通话游戏TCP 的可靠是高额成本换来的在三次握手成功的前提UDP 放弃可靠性把复杂逻辑全部去掉做到极简、低延迟七、Socket编程知识点1. 网络字节序大小端计算机内存分大端、小端存储网络传输统一规定大端字节序低地址存高字节例如小端 大端 低地址 高地址小端低权值位放低地址小小小提供转换函数C语言htons/htonl主机字节序 → 网络字节序ntohs/ntohl网络字节序 → 主机字节序2. Socket核心APIIPv4// 创建套接字文件描述符 int socket(int domain, int type, int protocol); // 服务器绑定端口 int bind(int sockfd, struct sockaddr *addr, socklen_t len); // 服务器开启监听 int listen(int sockfd, int backlog); // 服务器接收客户端连接 int accept(int sockfd, struct sockaddr *addr, socklen_t *len); // 客户端发起连接 int connect(int sockfd, struct sockaddr *addr, socklen_t len);3. sockaddr与sockaddr_in结构体sockaddr通用地址结构体兼容IPv4/IPv6/本地套接字sockaddr_inIPv4专用结构体包含地址类型、端口、32位IP套接字分类域间套间字AF同一主机内进程通信依靠文件路径作为标识类似管道原始套接字直接操作网络层、链路层用于抓包网络诊断网络套接字AF_INET使用TCP、UDP传输层两种结构体内容完全不一样但是接口参数统一要求传入struct sockaddr*通用指针编码时强制转换使用实现一套接口兼容多种套接字所有地址结构体前两个字节固定为地址类型字段AF_INET代表IPv4网络套接AF_UNIX代表本地套接字函数内部读取头部2字节的类型字段判断是网络通信还是本地通信再解析后面的结构体内容。调用时需要把具体结构体指针强制转换成 struct sockaddr *传入函数。
返回列表