Linux网络基础

协议

多个计算机想协同工作,于是产生了计算机网络,想要保证多台计算机能够正确地、协调地合作,就需要规定一些规则,只有所有计算机遵循这些规则,才能有条不紊的共同工作,这些多方提前约定的规则也叫做协议。

协议是一种约定。计算机协议是计算机之间的约定,指定计算机协议是为了减少通信成本,协议让计算机双方能够正确解析对方发来信息。计算机协议可以分为硬件级别的协议和软件协议

硬件协议:由硬件标准化组织制定,规定计算机硬件的物理特性、电气特性、规格特性等,比如电压范围,接口引脚数等。

软件协议:由软件标准化组织指定,规定编写计算机软件的规则,如计算机网络协议、IEEE854规定的浮点数存储规则等。

而计算机网络作为一个庞大的软件,必定有标准组织制定相关的协议管理计算机网络。

网络协议需要解决的问题

网络是为了解决通信主机之间的距离变长,在解决一个问题时,必然会产生新的问题,比如:

  1. 在长距离通信过程中,如何保证数据传输的可靠性
  2. 在众多主机中,如何找到目的主机,即主机定位的问题?
  3. 找到目的主机后,如何进行数据转发,即数据包局域网转发问题?
  4. 将数据发送到目的主机后,目的主机如何使用收到的数据?

网络协议便是解决上述问题的方案。一个好的方案一定是可扩展、方便维护的,而层状结构刚好满足这种特性,因此好的网络协议一定是需要分层的。

网络分层结构

软件分层

在计算机中,软件分层是编写软件时非常重要的一个思想,在一个优秀的程序中,不同函数执行的功能应该是弱耦合的,因此优秀的程序往往是层状结构的;例如在计算机体系结构中,自底向上被分为硬件、驱动程序、操作系统、系统调用、动静态库、用户层代码部分。

任何问题都可以添加一层软件层来解决。比方说为了保证进程之间运行的独立性,在进程和内存之间加上一层虚拟地址空间保证每个进程都可以"独享"内存资源。为了向用户屏蔽系统调用对不同硬件的操作,在硬件和系统调用之间加上虚拟文件系统层对不同的硬件提供统一的访问接口。

分层的好处:让不同模块耦合度低,实现逻辑解耦。

网络分层

有了网络,计算机通信的距离变得更长了,随着通信距离变长,会出现如下问题:

  1. 如何在相邻两台主机传输数据
  2. 主机的定位和路径选择
  3. 要不要保证数据的可靠性?数据传输出错了怎么办?
  4. 数据传输给目的主机后怎么处理数据?

而网络协议就是为了解决上面的问题,上面四个问题可以看做4种层面:局域网之间的数据传输、跨网络的数据传输、主机之间的数据传输、进程之间的数据传输。

因此,网络层协议也需要分层,每一个层次解决某一方面的问题。下面介绍OSI协议和TCP/IP协议。

OSI七层模型

  • OSI(Open System Interconnection,开放系统互连)七层模型统称为开放系统互连模型,将网络从逻辑上划分为7个层次,每个层次都有相关的物理设备。
  • OSI七层模型是一种框架设计方法,最主要的功能是帮助不同类型的主机实现了数据传输。
  • 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
  • OSI将网络划分为7层,自顶向下分别是
    • 应用层:针对特定应用的协议
    • 表示层:设别固有数据格式和网络标准数据格式的转换
    • 会话层:通信管理,负责建立和断开通信连接。
    • 传输层:管理两个节点之间的数据传,负责可靠传输。
    • 网络层:地址管理与路由选择。
    • 数据链路层:互联设备之间传送和识别数据帧。
    • 物理层:比特流与电子信号之间的转换。
  • OSI指定的7层协议理论上非常完善,但在实际操作过程中难以将应用层、表示层、会话层分开处理,因此在工程实践中,将应用层、表示层 、会话层合并为应用层,应用层加上下4层构成的5层网络体系结构叫做TCP/IP五层模型

TCP/IP五层协议

相比于OSI协议,TCP/IP协议在网络中是更常使用的。

TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

  • 物理层:负责光/电信号的传递方式,比如现在以太网通用的网线(双绞线)、光纤、wifi使用的电磁波都属于物理层的概念,物理层的能力决定了最大传输速率、传输距离、抗干扰性等,工作在物理层的设备由集线器。

    集线器用于扩大因远距离传输导致信号变弱的信号

  • 数据链路层:负责一个局域网内的数据通信。

    数据链路层的功能:

    1. 负责设备之间的数据帧的传送和识别,例如网卡设备的驱动、帧同步(在网线上检测到什么算作新的帧的开始)
    2. 冲突检测(检测到冲突就重新发送)
    3. 数据差错校验等工作。

    常见的局域网:

    1. 以太网:遵循以太网协议或IEEE802.3协议
    2. 令牌环网:遵循IEEE802.5令牌环网协议
    3. 无线LAN。遵循IEEE802.11协议

    工作在数据链路层的物理设备

    1. 交换机
  • 网络层:负责在多个局域网之间传输数据,即跨网络传输数据。

    网络层的功能:

    1. 地址管理
    2. 路由选择

    在IP协议中,通过IP地址唯一标识一台主机,并通过路由表的方式规划处两台主机之间的数据传输线路。

    工作在网络层的设备

    1. 路由器
  • 传输层:负责两台主机之间的数据传输

    传输层协议:

    1. TCP:面向连接、可靠传输,面向字节流。
    2. UDP:无链接,不可靠,面向数据报。
  • 应用层:负责主机上的应用程序间的通信,如简单电子邮件传输SMTP、文件传输协议FTP、网络远程访问协议Telnet等,网络编程就是针对应用层。

TCP/IP协议很好地解决了因传输距离变远而产生的通信问题:

  1. 数据链路层解决数据报局域网转发的问题。
  2. 网络层解决了主机定位的问题。
  3. 传输层解决数据可靠性的问题。
  4. 应用层解决了如何使用数据的问题。

网络与操作系统的关系

在计算机体系结构中,自底向上被分为硬件、驱动程序、操作系统、系统调用、用户操作接口不同的层次,网络的5层结构在计算机体系结构中也有对应关系。

网络层 计算机体系结构
物理层 硬件
数据链路层 驱动程序
网络层 操作系统
传输层 操作系统
应用层 系统调用、用户操作接口
  • TCP/IP网络层和传输层对应计算机体系结构中的操作系统,也就是说,网络也属于操作系统内核的一部分,因此在操作系统中,一定存在网络相关的系统调用。
  • 应用层属于用户空间
    • 可以在应用层使用网络系统调用开发网络软件。
    • 可以在应用层对网络系统调用封装形成网络库。

操作系统内部实现了网络层和传输层,足以可见网络层和传输层的重要性,因此这个5层模型也叫做TCP/IP模型。

理解多主机下网络通信

不同的主机装的操作系统可能是不同的,因此他们的系统接口部分的设计不是完全一样的,比如Windows为线程设计了一个TCB结构体,但Linux只是将进程的概念复用到线程上,但是操作系统中的网络部分都必须遵守TCP/IP协议,只有网络协议栈是一样的,它们才能解析其他主机发送的网络信息。这就是为什么Windows主机和Linux主机可以进行网络通信,也就是说,只要一个操作系统想要和别的主机进行网络通信,它的操作系统网络部分就必须遵守TCP/IP协议!

如何理解相同的协议?

不同主机需要遵守同一个网络协议才能进行网络通信,究竟什么是"同一个网络协议"呢?网络协议就是计算机中进行网络通信时的一种约定,网络中传输的数据不仅仅包含数据本身的含义,还要包含数据的属性信息,如数据大小、发送时间、数据开始帧等等,在进行数据传输时,一定是将这些信息全部保存在一个结构体 中进行传输,这就要求目标主机收到这个结构体后能够成功的解析各个字段的含义,而目标主机就是靠网络协议定义的规则对这个"结构体"数据解析,因此只有当源主机A和目标主机B有相同的网络协议,B才能正确的解析A发过来的数据,因此这个协议一定是提前被双方接收的,是提前保存到操作系统中的"解析数据的规则"。

网络传输基本流程

局域网通信

局域网是用于连接有限区域下的计算机网络,早期局域网络技术由不同的厂家专有,后来由电子电气工程师学会推动局域网技术的标准化。

局域网通信不需要公网IP,传输的数据不能发送到互联网上,只能在小范围区域内传输,因为局域网通信的距离较短,因此局域网通信速度比跨网络通信快。

不同的标准和厂商发明了不同的局域网,常见的局域网有以太网、令牌环网、无线LAN,以太网是最常用的局域网,现在无线技术越来越发达,无线LAN也广泛用于局域网通信。

以太网

Mac地址

在同一个局域网中,Mac地址用于唯一标识主机的一个网卡,一个主机可能有多个网卡,每个网卡具有不同的Mac地址,Mac地址也叫做网卡地址。

Mac地址由48bit位组成,通常用12位十六进制字符标识,如A0-80-69-33-0D-E7

Mac帧

在局域网中传输的数据叫做Mac帧,一条Mac帧分为帧首部、数据部分和帧尾部3部分。

  • 帧首部:记录源Mac地址、目的Mac地址、网络层使用的协议
  • 数据部分:网络层向下发送的数据
  • 帧尾部:差错校验码
传统以太网

早期的以太网是总线型以太网,一台主机通过总线传输数据,连接总线的所有主机都能够收到数据,但只有目的主机会接收数据。以太网上传输的数据叫做Mac帧。

当总线上的主机收到Mac帧后,由数据链路层的网卡驱动程序检测Mac帧的目的地址是否与本主机目的地址匹配,若匹配则将Mac帧向上层传递,否则丢弃Mac帧。

网卡具有一个小型处理器专门对Mac帧进行处理,因此计算机收到Mac帧时不需要CPU检测,网卡可以独立完成Mac帧的检测,如果Mac帧的目的地址是本主机,则向CPU发送一个网卡中断,将数据交给CPU进一步处理。

以太网通信:

  1. 处于同一个局域网的主机通过物理介质连接起来。
  2. 每台主机发送消息时都要知名源主机Mac地址和目标主机Mac地址。
  3. 在物理介质上,同一时刻只允许存在一条某个主机发送的消息。
  4. 碰撞检测:当主机A发送消息后,会处于碰撞检测状态,若处于同一个局域网的另一个主机也发送了数据,发生了数据碰撞,那么主机A和另外一台主机停止发送消息,等待一段时间再发送数据。

局域网本质是一种临界资源,同一时刻只允许一个主机访问局域网,局域网中,主机数量越少,就会降低数据碰撞的概率,如果主机数量太多了,可以通过交换机来减少数据碰撞。

以太网名字的来由

古希腊哲学家亚里士多德假象宇宙中有一种介质,正是通过这种介质,光才能从太阳传播到地球,他将这种介质命名为"以太",但后来以太被其他科学家证明过这种物质并不存在,后台美国施乐公司研究出了一种可以用于局域网通信的技术,将它命名为"以太网"表示传递电磁波的介质。

碰撞检测

在传统以太网中,以太网中的各个主机是通过总线连接,多台主机共享总线,向总线同时多条数据会产生数据碰撞,导致接收方不能正确收到消息,因此在传统以太网中需要专门的协议来检测碰撞以及发生碰撞后的处理,这个协议就是CSMA/CD协议,规定了发送发在发送数据时需要检测碰撞的时间以及碰撞后所执行的碰撞避免算法。

碰撞域

碰撞域 是指在同一个共享介质网络中,所有可能因同时发送数据而导致 数据帧冲突(Collision) 的设备集合,如通过总线或集线器连接起来的各个计算机构成一个碰撞域。通过交换机或路由器连接的设备属于不同的碰撞域。

其他局域网

令牌环网

令牌环网也用于局域网通信,属于轮询访问介质控制。按照一定的轮次控制谁可以发送数据,一次只能有一个主机获取令牌,获取令牌的主机可以发送数据,其他主机只能等待。

令牌环网通信规则如下:

  1. 当网络空闲时,令牌会在网络中循环传递
  2. 令牌传递到某个主机且主机要发送数据时,就将自己的数据添加到令牌中,将令牌变为数据帧,传递给目的主机
  3. 数据帧传递到目的主机时,目的主机复制一份数据帧进行处理
  4. 数据帧循环一圈回到源点,之后不再传递,同时,通过检验返回的帧判断数据是否传输出错,若出错则重传
  5. 源主机发送完数据后,重新产生一个令牌传递给下一个主机,释放信道控制权

令牌环网保证多台主机只有获取令牌的才能访问网络信道,令牌相当于锁,网络信道相当于公共资源,只有持有锁的才能访问公共资源。

当局域网中有很多主机发送数据时,若使用以太网,冲突的几率很大,需要多次重发数据,而令牌环网不会产生冲突,只有拿到令牌的主机才能够发送数据。

交换式局域网

传统以太网的多主机直接通过总线或集线器相连,使得冲突域比较大,而交换机局域网让主机与主机之前通过交换机相连,隔离了冲突域。

交换机是一种数据链路层的设备,交换机的端口和主机或集线器相连,构成一个单独的冲突域。因此交换机隔离了冲突域。

交换机通过自学习算法构建了一张交换表,通过交换表,交换机能够将收到的Mac帧转发给相应的端口,再传输到指定的主机上。

无线LAN

处于无线局域网的计算机通信时,必须通过接入点AP才能对外或对内通信,同时通过CSMA/CA协议封装与解包Mac帧,无线局域网的原理较为复杂, 这里不做解释。

局域网内的通信

我们常说的"联网"实际上是指代连接互联网,默认情况下,操作系统和一些网络设备默认帮我们连入局域网,比如我们家里的各个设备就构成一个局域网。

封装与解包

TCP/IP协议中,每一层都有各自的协议,如:

  • 应用层:DNS协议、SSH协议、HTTP/HTTPS协议、SMTP协议......
  • 传输层:TCP协议、UDP协议......
  • 网络层:IPv4协议、IPv6协议、ICMP协议
  • 链路层:以太网协议、令牌环网协议、ARP协议、PPP协议、无线网协议......

为了保证通信双放能够正确发送和处理数据,即发送方发送什么数据,接收方就应该接收什么数据,双放需要使用相同的协议处理数据,假设发送发使用IPv4对传输层的数据进行封装,而接收方收到后按照IPv6对数据解包,此时接收到的数据不一定和发送的数据保持一致。

封装 是指数据在 发送端 从高层(应用层)向低层(物理层)传递时,每一层都会在原始数据前(或后)添加本层的 协议头(Header)尾(Trailer) ,形成新的数据单元。 目的

  • 标识协议类型(如TCP、IP、Ethernet)
  • 提供路由、错误检测、流量控制等信息

解包 是封装的逆过程,指数据在 接收端 从低层(物理层)向高层(应用层)传递时,逐层剥离协议头,最终还原原始数据。 目的

  • 解析协议头中的控制信息,确保数据正确传递到目标应用

发送数据时,数据每往下传递一层,就需要添加一份协议头;接收数据时,数据每向上传递一层,就需要解析该层的协议头,得到有效载荷。

协议头的作用:

  1. 分离数据:通过向协议头中添加长度字段,能够在解包时分离协议头和有效载荷
  2. 路由协议:同一层的协议有多个,通过向协议头中添加协议字段,能够在解包时将有效载荷传递给上一层的具体协议
  3. 功能控制:功能字段实现当前层的特定操作(如校验、分片、QoS)

在局域网中,数据从一个主机的应用层传输到另一个主机的应用层过程如下:

发送方(封装)

  • 应用层:将用户数据添加应用层报头(如HTTP报头),向下交付
  • 传输层:选择TCP协议或UDP协议,将应用层传递的数据添加传输层报头,传输层报头包括源端口号和目的端口号,这就指定了当接收方传输层收到数据后将数据交给应用层的哪个协议处理。将封装后的IP数据报向下传递
  • 网路层:选择合适的网络层协议,将传输层传递的数据添加网络层报头(IPv4/IPv6),报头中记录传输层使用的是TCP还是UDP以及源IP,目的IP和其他信息。将封装后的IP数据报向下传递。
  • 链路层:选择合适的链路层协议,将网络层传输的数据添加帧首部,帧首部包括源Mac,目的Mac,记录了网络层使用的协议,同时添加一个用于差错检验的帧尾部。将封装的帧传输到电线上。
  • 物理层:在这一层可能使用物理设备如集线器/调制解调器实现远距离传输,集线器用于扩大信号,调制解调器用于转化数字信号和模拟信号。

若数据传输给路由器,路由器会解包到网络层,查看数据目的IP地址,检测目的IP地址是否与路由器处于同一个网络,因为局域网通信的路由器一定与目的IP地址处于同一个网络,故不进行转发。

接收方(解包和分用)

  • 数据链路层:收到Mac帧后,网卡对Mac帧解包,判断Mac帧的目的地址是否该主机网卡地址,若是则通知CPU向上处理
  • 网络层:对解包后的Mac帧使用对应的网络层协议进行处理,根据数据报首部取出数据报内容部分同时交给传输层Tcp或Udp处理
  • 传输层: 使用相应的传输层协议对数据解析,取出数据段首部,通过首部取出应用层需要用到的数据,向上交付给上层应用层对应的应用
  • 应用层: 拿到应用数据后, 处理即可

我们现在不关心每一层协议的报头有哪些字段,也不知道每一层如何分离报头和数据以及如何向上层交付,但我们知道如果数据想要从一个主机的应用传送到另一台主机的应用,数据在网络中必定经过封装和解包的过程,并且每封装/解包一次就会在数据上添加/删除一次报文首部.

约定:

应用层发送的数据称为报文,HTTP称为请求和响应,DNS称为查询和应答.

传输层发送的数据叫做数据段/数据,网络层发送的数据称为IP数据报,链路层发送的数据称为数据帧.

每一个网卡都有唯一的mac地址和ip地址,一台主机可能有多个网卡,后续不特殊指代,默认主机只有一个网卡

如果仅在局域网上传输数据,网络协议栈中可以不需要网络层,当需要跨网络通信时,必须要网络层进行数据跨网络转发.

跨网络通信

IP地址

IP地址分为IPv4地址和IPv6地址,IPv6地址解决的是IPv4地址不足的问题,但现在公网中仍广泛使用IPv4地址,若不特殊指代,本文提及的IP地址均为IPv4.

IP地址可以在公网上唯一标识一张网卡,IPv4地址用4字节点分十进制标识,如a.b.c.d,a b c d都是0-255十进制数字.

Linux下ifconfig命令查看当前主机网络信息:

shell 复制代码
sy@ubuntu64:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.142.128  netmask 255.255.255.0  broadcast 192.168.142.255
        inet6 fe80::20c:29ff:fef3:e916  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:f3:e9:16  txqueuelen 1000  (Ethernet)

这台Linux机器上,IPv4地址为192.168.142.128,这是一台虚拟机,因此IP地址为局域网内地址.

ip地址和mac地址

mac地址已经可以唯一标识网卡了,为什么还要引入ip地址呢?

答案很简单,这两个地址用于解决网络中不同层面的问题,在局域网通信中,只使用mac地址就可以保证数据能够正确传输到目标主机上,但当数据需要跨网络传输时,mac地址就不够用了.

所谓跨网络传输,即数据经过多个局域网传输,每一个局域网可以使用不同的局域网协议,如局域网A使用以太网协议,局域网B使用令牌环网协议,如果局域网A和局域网B直接通信,局域网B并不知道如何处理以太网协议封装的数据帧,同样地,局域网A也不知道如何处理令牌环网协议封装的数据帧,这样两台主机无法进行跨网络通信.

为了解决这个问题,网络协议栈中定义网络层专门解决跨网络通信的问题,数据跨网络传输时,会经过中间设备路由器的处理,路由器负责将一个局域网的数据帧转发给另一个局域网,如果两个局域网使用不同的协议,路由器会按照相应的协议进行帧的解包和封装并发送.

这样mac地址和ip地址的作用就很明显了:

  • mac地址是数据链路层协议封装的, 用于解决局域网中的通信问题,在局域网中通过mac地址找到目的主机并发送.
  • ip地址在网络层封装,用于解决跨局域网通信问题,用于指导路由器设备如何跨网络地将数据从一个主机发送到另一个主机.

在跨网络数据传输中,可能途径多个局域网,数据帧一定是每一个局域网内的物理线路传输的,因此在每一个局域网中都需要一个地址指定源地址和目的地址,不同局域网的源地址和目的地址不一样,因此mac地址用于指定一个局域网内的源地址和目的地址 ,随着数据在不同局域网传输,数据的源地址和mac地址会变化.虽然mac地址全球唯一,但mac地址只需要保证局域网内唯一即可,因为没经过一个局域网,mac地址都会改变.

不管数据在局域网中是如何传递的,这个数据一定要从一台主机传送到另一台主机上,这对源地址和目的地址在数据的传输中是不会变的,ip地址用于指定跨网络传输时数据传送过程中的源地址和目的地址,在整个数据传输中,这对地址不会改变.

同时,当数据经过路由器转发时,路由器会根据数据报的ip地址进行转发.

ip地址存在的意义:

  • 与硬件解耦,mac地址和硬件强相关
  • 网络层路径选择的重要依据
  • 标识网络层中的唯一地址

网络层存在的意义:

  • 屏蔽下层局域网的差异,让多个局域网可以通信
  • 路由选择和路由转发

至此,我们初步理解了局域网内通信和跨网络通信的宏观流程,但我们还有很多细节不清楚,比如:每一个层协议是怎么设计的?协议包含哪些字段?协议具体的功能?发送的数据如何保证可靠性?如何知道数据的目的地址是否在本局域网或跨网络?

这些问题我们在后面会逐步解释.

相关推荐
zl_dfq2 小时前
Linux 之 【多线程】(线程的概念、Linux中的线程、页表)
linux
郝亚军3 小时前
如何在Ubuntu和win10/11之间通过samba访问对方的文件
linux·服务器·ubuntu
曦云沐3 小时前
【避坑指南】Ubuntu更新报错“Repository is not signed”的快速修复
linux·ubuntu·docker
带土14 小时前
10. .out文件
linux
Exquisite.4 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
STCNXPARM4 小时前
Linux camera之V4L2子系统详解
android·linux·camera·v4l2架构
yueyuexiaokeai15 小时前
linux kernel常用函数整理
linux·c语言
qq_411262426 小时前
用 ESP32-C3 直接连 Starlink 路由器/热点并完成配网
网络·智能路由器
郝亚军6 小时前
ubuntu-18.04.6-desktop-amd64安装步骤
linux·运维·ubuntu