• 【Linux】网络编程基础


    网络基础

    1.网络与操作系统的关系

    操作系统内,除了进程管理、文件管理、内存管理和驱动管理之外。还有一个内嵌了一个网络协议栈。传输数据时,通过网络协议栈,将数据封包,网卡将数据发送到网络中。接收数据时,通过网络协议栈,从网卡中获取数据,将数据解包。

    image-20221127205210381

    协议栈与操作系统的关系图

    image-20221127210216205

    网络协议栈各层功能

    • 数据链路层/物理层:负责数据真正的发送过程(物理意义上的发送)
    • 网络层:完成的是数据转发,解决数据去哪的问题。通过IP解决从哪来到哪去的问题
    • 传输层:解决传输过程中的丢包,端口关闭,服务器出错的等问题。传输层的工作作用是处理数据传输过程中出现的问题,主要保证数据的可靠性
    • 应用层:明确数据发送的目的是什么,解决干什么的问题。负责业务细节。

    2.计算机网络发展

    独立模式: 计算机之间相互独立;

    image-20221127211215060

    网络互联:多台计算机连接在一起,完成数据共享

    image-20221127211247853

    局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起

    image-20221127211324630

    广域网WAN: 将远隔千里的计算机都连在一起;

    image-20221127211343707

    所谓 “局域网” 和 “广域网” 只是一个相对的概念 。广域网可以说是有个更大的局域网。

    3.协议

    “协议”本质就是一种约定,通信双方只要曾经做过某种约定,之后就可以使用这种约定来完成某种事情。而网络协议是通信计算机双方必须共同遵从的一组约定,因此我们一定要将这种约定用计算机语言表达出来,此时双方计算机才能识别约定的相关内容。

    3.1协议分层

    协议分层让每一个层看起来可以直接进行通信。

    image-20221127211735161

    分层最大的好处在于“封装”,在分层情况下,将某层的协议进行替换后,通信双方之间是不会受到影响的。

    3.2OS七层模型
    • OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型 ,是一个逻辑上的定义,一个规范,它把网络从逻辑上分为了7层。
    • 每一层都有相关、相对应的物理设备,比如路由器,交换机。OSI 七层模型是一种框架性的设计方法 ,建立七层模型的主要目的是为解决异种网络互连时所遇到的兼容性问题,其主要的功能使就是帮助不同类型的主机实现数据传输。
    • 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
      image-20221127212218996

    各层作用

    • 应用层:针对特定应用的协议
    • 表示层:设备固有数据格式和网络标准数据格式的转换
    • 会话层:通信管理、负责建立和断开通信连接(数据流动的逻辑通路)、管理传输层以下的分层
    • 传输层:管理两个节点之间的数据传输、负责可靠性传输(确保数据被可靠地传送到目标地址)
    • 网络层:地址管理与路由选择
    • 数据链路层:互联设备之间传送和识别数据帧
    • 物理层:以0/1代表电压的高低以及灯光的闪灭、界定连接器和网线的规格
    3.3TCP/IP五层模型

    TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
    TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

    image-20221127213050613

    • 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
    • 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
    • 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
    • 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
    • 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层

    4.网络传输基本流程

    4.1数据包的封装和分用
    • 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
    • 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装
      (Encapsulation).
    • 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
    • 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 “上层协议字段” 将数据交给对应的上层协议处理

    假如有主机A和主机B进行通信

    image-20221127214123825

    **当主机A给主机B发送消息时:**消息在每一层经过被封装,添加上消息头。

    image-20221127214255161

    主机B接收到主机A的消息后,会从最下层的协议逐步解包,将有效载荷将给上一层协议。最终应用层拿到主机A发送的数据

    image-20221127214855559

    4.1.1报头和有效载荷

    报头

    报头本质也是一种数据,报头一般是通过位段实现的,因此协议栈的每一层都有一个对应的位段来表示当前层的报头。

    有效载荷

    当对端主机收到数据后,需要自底向上贯穿协议栈,依次进行数据的解包与分用。在这个解包的过程中,每一层的协议只需要提取出数据中对应的报头,然后对该报头进行分析处理,而剩下的数据则直接交付给上层就行了。

    因为每一层的协议实际上只关心数据中与当前层对应的报头信息,而剩下信息的具体内容不必关心,交给上一层协议进行处理。我们将数据中除当前层的报头以外的数据叫做“有效载荷”。

    报头和有效载荷分离

    协议栈的每一层都要从数据中提取对应的报头信息,而要将数据中的报头提取出来,首先就需要明确报头与有效载荷之间的界限,这样才能将它们进行分离。

    每一层添加报头都是讲协议头添加到数据首部,因此只要知道了报头的大小,就可以讲报头和有效载荷分离。

    获取报头大小的方法有:

    • 定长报头:报头大小是固定的
    • 自描述字段:报头当中有描述报头长度的字段。
    4.2局域网的两台主机通信

    局域网通过局域网交换机进行数据的交换。同一局域网中的任意主机之间可以进行通信。

    在一个局域网当中,除了当前正在进行通信的A主机和B主机以外,还有其他的主机,那A主机是如何将数据成功发送给B主机的呢?

    image-20221127224846349

    实际当主机A想要发数据给主机B的时候,该局域网内的其他主机也都收到了该数据,只不过除了主机B以外,其他主机识别到该数据并不是发给自己的,此时其他主机就把收到的数据丢弃了。

    也就是说,在局域网(以太网)通信时,该局域网内所有的主机在底层其实都收到了任何数据,只不过经过筛选后只提交上来了发给自己的数据。

    碰撞

    当A和B在进行通信时,有可能有其他主机之间也可能在通信。但同一局域网中的所有主机在通信时,使用的都是一个共同的通信信道,因此如果局域网内的多台主机同时进行通信,此时这些数据之间就可能会相互干扰。

    • 每一个局域网都可以看作是一个碰撞域,如果某个主机发送出去的数据与其他主机发送的数据之间产生了干扰,我们就称这两台主机在该碰撞域中发生了碰撞。

    如何判断是否发生了碰撞

    发送到局域网当中的数据是所有主机都能够收到,因此当一个主机将数据发送出去后,该主机本身也可以收到这个数据。

    当该主机收到该数据后就可以将其与之前发送出去的数据进行对比,如果发现收到的数据与之前发送出去的数据不相同,则说明在发送过程中发生了碰撞。

    解决碰撞问题

    当检测到发生了碰撞,发生消息的主机会选择等待一段时间,再次发送数据。

    4.3跨网络的两台主机通信

    image-20221127230735044

    局域网之间都是通过路由器连接起来的,因此一个路由器至少能够横跨两个局域网。而这些被路由器连接的联局域网认为,该路由器就是本局域网内的一台主机,因此路由器可以和这些局域网内的任意一台主机进行直接通信。

    通信过程

    image-20221127231003572

    左边的主机向右边的主机发送信息。消息经过封装,网络传输,解包后达到右边的主机。

    两个局域网采用不同通信标准

    上述的广域网中,左边的局域网采用以太网,右边采用令牌环网。

    由于以太网和令牌环网是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包。因此路由器需要对数据解包,去掉以太网协议头,再加上令牌环网协议头。

    image-20221127233031089

    • 可以看到在网络层以上,两台主机得到的数据是相同的。这样两台主机就可以完成通信。

    5.IP地址和MAC地址

    在上面的通信过程中,路由器是如何知道传递给那一台主机?

    一个路由器可能会级联多个局域网,当路由器需要将一个局域网的数据转发到另一个局域网时,路由器如何知道该数据应该转发到哪一个局域网的呢?

    路由器其实是通过IP地址来确定数据的转发方向的,每一个IP地址唯一标识一台主机,在数据向下进行封装时,在网络层封装的报头当中就会包含两个字段,分别是源IP地址和目的IP地址。

    当路由器需要将数据从一个局域网发送到另一个局域网时,路由器的链路层会先将数据的在当前局域网对应的底层报头去掉,然后将剩下的数据向上交付给网络层。此时,路由器就得到了目的IP地址,然后路由器就可以根据该IP地址在路由表当中进行查找,最终就能够确认该数据应该发送到哪一个局域网。

    一般在进行路线选择时,会存在两套地址。

    IP地址:解决了从哪台主机来,目的主机是哪一台的问题。MAC地址:记录路线,解决了上一站是哪一台主机,下一站应该是哪一台主机的问题

    5.1IP地址

    这里的IP地址指的是IPV4

    • IP地址是在IP协议中, 用来标识网络中不同主机的地址;对于IPv4来说, IP地址是一个4字节, 32位的整数;
    • 我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个
      字节, 范围是 0 - 255;
    5.2MAC地址
    • MAC地址用来识别数据链路层中相连的节点;
    • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
    • 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可
      能会冲突; 也有些网卡支持用户配置mac地址)
    5.3IP地址和MAC地址的区别
    • 地址性质不同:MAC是物理地址,IP地址是逻辑地址;MAC不可改变,IP地址可以修改。
    • 工作层次不同:MAC在OSI模型中,处于第二层数据链路层中。IP地址处于第三次网络层中。
    • 二层交换机基于MAC地址转发数据,路由器基于路由表(IP地址)转发数据。
    • 分配依据不同:IP地址的分配基于网络拓扑,MAC分配基于制造商。
    5.4数据传输的两套地址

    源IP地址和目的IP地址

    每台计算机都有一个唯一的IP地址,如果一台主机上的数据要传输到另一台主机,那么对端主机的IP地址就应该作为该数据传输时的目的IP地址。但仅仅知道目的IP地址是不够的,当对端主机收到该数据后,对端主机还需要对该主机做出响应,因此对端主机也需要发送数据给该主机,此时对端主机就必须知道该主机的IP地址。因此一个传输的数据当中应该涵盖其源IP地址和目的IP地址,目的IP地址表明该数据传输的目的地,源IP地址作为对端主机响应时的目的IP地址。

    源MAC地址和目的MAC地址

    大部分数据的传输都是跨局域网的,数据在传输过程中会经过若干个路由器,最终才能到达对端主机。MAC地址在网络中唯一标识一个网卡,每一台路由器上的网卡都有一个MAC地址。

    image-20221127235213949

    源MAC地址和目的MAC地址是包含在链路层的报头当中的,而MAC地址实际只在当前局域网内有效,因此当数据跨网络到达另一个局域网时,其源MAC地址和目的MAC地址就需要发生变化,因此当数据达到路由器时,路由器会将该数据当中链路层的报头去掉,然后再重新封装一个报头,此时该数据的源MAC地址和目的MAC地址就发生了变化。

    时间源MAC地址目的MAC地址源IP地址目的IP地址
    刚开始主机1的MAC地址路由器A的MAC地址主机1IP地址主机2IP地址
    经过路由A之后路由器A的MAC地路由器B的MAC地址主机1IP地址主机2IP地址
    经过路由B之后路由器B的MAC地路由器C的MAC地址主机1IP地址主机2IP地址
    经过路由C之后路由器C的MAC地址路由器D的MAC地址主机1IP地址主机2IP地址
    经过路由D之后路由器D的MAC地址主机2MAC地址主机1IP地址主机2IP地址

    数据传输的两套地址

    • 一套是源IP地址和目的IP地址,这两个地址在数据传输过程中基本是不会发生变化的。
    • 另一套就是源MAC地址和目的MAC地址,这两个地址是一直在发生变化的,因为在数据传输的过程中路由器不断在进行解包和重新封装。
  • 相关阅读:
    开发工具
    回归预测 | MATLAB实现GLM广义线性模型数据回归预测
    Vue2(二):计算属性、监视属性、二者的区别
    PMP®项目管理|项目干系人如何管理?
    C++ Qt开发:QFileSystemModel文件管理组件
    羊大师提示,羊奶都有哪些惊人功效?
    什么是MapReduce?MapReduce整体架构搭建使用介绍
    基于php经贸时间轴小程序毕业设计-附源码211617
    HK32F030MF4P6 TIM2(定时器例程)
    拥抱国产信创化,思迈特与云和恩墨完成产品兼容认证
  • 原文地址:https://blog.csdn.net/qq_53893431/article/details/128072511