当前位置:   article > 正文

Linux 计算机网络

Linux 计算机网络

目录

一、网络协议

1、 "协议" 是一种约定

2、协议分层

二、网络模型

1、OSI七层模型

2、TCP/IP五层(或四层)模型

3、实际应用 

三、网络传输基本流程

四、数据包封装和分用

五、网络中的地址管理

六、网络编程套接字

1、理解源IP地址和目的IP地址

2、端口号

理解 "端口号" 和 "进程ID"

理解源端口号和目的端口号:

3、认识TCP、UDP协议

4、网络字节序

5、网络字节序和主机字节序的转换

七、网络中的地址管理

IP地址

MAC地址


一、网络协议

1、 "协议" 是一种约定

        网络协议确实是一种约定,它是规定数据在网络中传输的格式、规范、控制信息以及错误检测和恢复机制等一系列规则的集合。为了确保全球各地不同制造商生产的计算机、操作系统以及网络硬件设备能够无缝协同工作,共同理解彼此发送和接收的信息,网络协议的存在至关重要。

举例来说,就像人类社会中的人们用同一种语言交流一样,不同地区的方言各异,如果想要所有人无障碍沟通,就需要制定一个通用的语言规范,如普通话或国际通用的英语。

  • 在网络世界里,TCP/IP协议族就扮演着这样的角色,它包含了多个子协议,如TCP(传输控制协议)和IP(互联网协议)等,这些协议共同定义了数据在网络中封装、传输、路由以及到达目的地后解包还原的过程。

举个具体的例子,TCP/IP协议确保了无论是Linux、Windows还是Mac OS操作系统的计算机,只要它们都遵循TCP/IP协议,就能够通过网络发送和接收数据,即便它们的内部实现、硬件配置千差万别。在网络协议的框架下,计算机之间通过特定的比特流(如通过高低电平或光脉冲强度表示的0和1)按照预先设定的格式编码信息,进而实现跨地域、跨平台、跨设备的有效通信。这就是网络协议在计算机通信中的核心作用。

2、协议分层

这张图片展示了一个协议分层的概念,通过一个打电话的例子来说明。在图中,协议被分为两个层次:语言层和通信设备层。

  • 在语言层,有两个协议:汉语协议和英语协议。在通信设备层,也有两个协议:电话机协议和无线电协议。
  • 通过这个例子,我们可以看到如何使用不同的协议来实现不同的人之间的通信。
  • 例如,如果A和C都使用汉语协议,他们可以通过电话机进行通信。同样地,如果B和C都使用英语协议,他们也可以通过电话机进行通信。

分层的最大好处是封装。这意味着每个层次只关心它自己的功能,而不必关心其他层次的功能。这样可以使得系统更加模块化,更容易维护和扩展。

面向对象编程(OOP)也遵循类似的原理。在OOP中,我们把对象划分为不同的类,每个类都有自己的属性和方法。这些类之间可以通过接口进行交互,而不需要知道对方的具体实现细节。这样可以使代码更加清晰、易于理解和维护。

二、网络模型

1、OSI七层模型

OSI(Open System Interconnection,开放系统互连)七层网络模型是一个详尽的逻辑架构方案,它将复杂的网络通信过程分解为七个相互关联且功能独立的层次。这个参考模型不仅为计算机网络的设计和理解提供了一个标准框架,而且确保了不同类型的主机之间能够有效地进行数据传输和互操作。

在OSI七层模型中,每一层都对应着相应的功能集以及可能存在的物理设备组件,如路由器在第三层网络层处理数据包转发,交换机则主要在第二层数据链路层执行帧交换任务。该模型的重要特征在于,它将服务、接口和协议这三者的角色做出了清晰的区分,从而使得理论分析更为透彻、系统设计更为有序。

然而,尽管OSI七层模型在理论上具有高度完整性及一致性,但在实际应用中,由于其结构较为复杂且实施成本较高,导致并未被广泛采纳为直接的操作标准。相比之下,更为简洁且实用的TCP/IP四层模型或五层模型(因某些解释而异)成为了现代互联网通信的基础架构,它们虽然没有严格按照OSI的七层划分,但实现了类似的层次化功能分离,并且更适应实际网络环境的需求。

2、TCP/IP五层(或四层)模型

TCP/IP协议族不仅仅是一个协议名称,它实际上涵盖了众多相互协作的协议集合,共同构成了当今互联网通信的核心基础。这一协议簇采用了一种五层(或根据某些划分方式也可视为四层)的层级体系结构,每一层均依赖于其下一层提供的服务,以便完成自身的特定功能需求。

  1. 物理层:作为最底层,物理层关注的是数据传输的物理媒介与信号形式,它决定了数据在网络中的实际传输方式,包括传输速率、传输距离、抗干扰性能等因素。常见的物理层介质包括双绞线、同轴电缆、光纤以及无线电磁波等。集线器(Hub)即工作在物理层,仅负责信号的简单放大和转发。

  2. 数据链路层:这一层主要负责设备间的帧数据传输和识别。涉及的具体工作内容包括网卡驱动程序、帧同步机制(即如何识别新的数据帧起始点)、冲突检测与避免(如CSMA/CD机制)、错误检测与纠正等。以太网、令牌环网、无线局域网(WLAN)等均为数据链路层的标准实例。交换机(Switch)在此层面上运行,通过学习MAC地址表来实现数据帧的高效传输。

  3. 网络层:该层核心职责是进行地址管理和路径选择,其中最为人熟知的就是IP协议。网络层利用IP地址来唯一标识网络中的每一台主机,并通过维护和更新路由表来规划并决定数据报文在两台主机间的最佳传输路径。路由器(Router)便是在网络层工作的设备,它们基于路由算法指导数据包在不同网络间穿梭。

  4. 传输层:这一层次的主要任务是确保数据可靠地从源主机传送到目标主机。传输控制协议(TCP)就是一个典型的例子,它提供了面向连接、可靠的数据传输服务,保障了数据传输的顺序性和完整性。

  5. 应用层:位于模型顶层的应用层,专注于解决应用程序间的通信问题,它定义了一系列协议标准以支持各种网络应用服务,例如简单邮件传输协议(SMTP)、文件传输协议(FTP)、远程登录协议(Telnet)等。对于网络开发人员而言,日常工作中接触最多的便是应用层协议及其编程接口。

3、实际应用 

        在实际应用中,物理层的技术细节往往较少受到普通用户的关注,因此,在讨论网络架构时,人们常常提及的是TCP/IP四层模型。在这个简化模型中,各网络设备对协议栈各层的实现各有侧重:
  • 对于一台主机,其操作系统内核通常会全面实现从传输层直至物理层的所有功能,以确保主机能够在网络环境中进行高效且稳定的数据通信。

  • 对于路由器设备,其核心功能集中在实现从网络层至物理层的协议,通过IP寻址和路由选择机制,保证数据包能在不同网络间正确传输。

  • 在交换机层面,其主要实现从数据链路层至物理层的功能,负责在局域网内部根据MAC地址进行快速、准确的数据帧转发。

  • 集线器作为一种较为基础的网络设备,仅仅实现了物理层的功能,即对信号进行放大和再生,再无其他智能处理能力。

然而,实际情况并不总是如此绝对。随着技术的发展,一些高端交换机产品也开始实现网络层的转发功能,能够进行类似于路由器的IP路由决策;同时,部分路由器也在原有功能基础上扩展了对传输层的支持,例如通过端口转发等技术实现更高层次的服务。这些发展反映了网络设备功能融合的趋势,进一步提升了网络通信的灵活性与效率。

三、网络传输基本流程

网络传输流程图 :同一个网段内的两台主机进行文件传输

跨网段的主机的文件传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器. 

四、数据包封装和分用

在计算机网络通信过程中,数据包经过层层处理以确保信息能够在不同网络间有效传输。具体来说:

  • 当应用层数据准备通过网络发送时,它会经历一个被称为封装(Encapsulation)的过程。在这一过程中,每经过一个协议层,原始数据就会被附加一个特定的协议头(header),这些头包含了关键的信息元数据。例如,它们记录了各自层协议的控制信息,诸如首部长度、负载(payload)数据大小,以及用于指示上层协议类型的字段等。
  • 在传输层,原始数据会被封装成段(segment),如在TCP协议中;在网络层,数据进一步被打包为数据报(datagram),如在IP协议中;而在数据链路层,则形成帧(frame),如在以太网协议中。
  • 封装完成后,数据帧便会被传输到物理介质上,跨越可能涉及多个网络节点的传输路径,直到达到目的地主机。
  • 抵达目标主机后,数据包的逆向过程随之展开,即数据分用(Decapsulation)。每层协议会依据自身协议头信息,逐层剥离掉已不再需要的协议首部,直至恢复原始应用层数据。分用过程中,协议层会特别关注首部中的“上层协议字段”,以此识别并将解封后的数据递交给正确的上层协议进行进一步处理。这样,原本在网络中封装起来的复杂信息得以还原,并最终送达相应的目的应用程序。
下图为数据封装的过程

五、网络中的地址管理

在计算机网络中,地址管理扮演着至关重要的角色,其中两个关键的地址类型分别为IP地址和MAC地址。

IP地址的理解 IP协议共分为两个主要版本:IPv4和IPv6。在本课程未作特殊声明的情况下,所提及的IP协议默认指的是IPv4版本。IP地址在IP协议体系中是用来唯一标识网络中各个主机和设备的一种逻辑地址。对于IPv4协议而言,IP地址是一个由四个字节组成、总计32位的二进制整数。为了便于人类阅读和记忆,IP地址通常采用“点分十进制”格式表示,例如“192.168.0.1”。这里的每一个点分隔的数字代表一个字节,取值范围是从0到255。

MAC地址的认知 MAC地址,即Media Access Control Address,主要用于在数据链路层识别网络中直接相连的节点,如网络适配器(网卡)。MAC地址的长度固定为48位,相当于6个字节。在实践中,MAC地址常以十六进制数串联并用冒号分隔的形式显示,例如“08:00:27:03:fb:19”。值得注意的是,MAC地址在网卡生产制造时就已经固化,并且在大多数情况下是不可更改的,因此理论上每块网卡的MAC地址应该是全球唯一的。不过,在虚拟化环境下,虚拟机可能会使用非真实物理硬件生成的MAC地址,这就可能导致MAC地址的重复;另外,也有部分网卡允许用户在一定程度上自定义MAC地址,但这并非普遍现象。

六、网络编程套接字

1、理解源IP地址和目的IP地址

        在Internet协议(IP)层面,源IP地址和目的IP地址是核心的元素,它们共同构成了数据包在网络中传输的基础寻址信息。源IP地址是发送数据包设备的IP地址,而目的IP地址则是接收数据包设备的IP地址。通过这两个地址,网络中的路由器和其他网络设备能够正确地将数据包从源点转发到目的地。

然而,仅凭IP地址并不能完全实现应用程序间的具体通信。这是因为IP地址只是识别了网络上的特定主机,但它并没有指出在主机内部哪个进程或服务应该接收这个数据包。例如,在QQ消息传递的过程中,即使我们知道了对方主机的IP地址,也无法直接通过IP地址来判断数据应当被哪个QQ客户端程序接收。

        为了更准确地定位到主机内部的服务或进程,我们需要另一层协议的帮助,这就是传输层的协议,如TCP(传输控制协议)或UDP(用户数据报协议)。在TCP/IP协议簇中,除了IP地址外,还使用端口号(Port Number)来标识主机上的特定服务或应用程序。当一个数据包到达目的主机时,它的目的IP地址帮助主机确定数据包是否为自己所有,而目的端口号则告诉主机的操作系统应该将这个数据包交给哪个正在监听该端口的应用程序去处理。

所以,为了完整地完成类似QQ消息这样的应用程序通信,不仅需要源IP地址和目的IP地址,还需要源端口号和目的端口号。这四个值共同组成了一对套接字(Socket),即(源IP,源端口,目的IP,目的端口),这样才能确保数据能准确地从发送方的一个进程传递到接收方的对应进程。

2、端口号

端口号(port number)是计算机网络中传输层协议(如TCP和UDP)的重要组成部分,用于标识主机上运行的应用程序或服务。端口号是一个16位的无符号整数,范围从0到65535,其中一些端口号是预先定义的标准服务端口号,例如HTTP服务使用80端口,FTP服务使用21端口等。

  1. +-----------------+
  2. | 客户端 |
  3. | 进程 (A) |
  4. | 端口 X |
  5. +-----------------+
  6. +-----------------+
  7. | 网络层 |
  8. +-----------------+
  9. +-----------------+
  10. | 服务器 |
  11. | 进程 (B) |
  12. | 端口 Y |
  13. +-----------------+

假设有两个不同的IP地址(IPA和IPB),分别代表两个不同的机器或服务器。

在左侧,有一个软件客户端,它通过公网IP地址与服务器进行通信。这个过程涉及到客户端进程和服务器进程之间的交互。在正常情况下,我们可能会认为网络通信的目标是将数据发送到对方的机器上,但这并不是真正的本质。

实际上,网络通信的本质是进程间的通信。这意味着,当数据在网络中传输时,最终的目标是将这些数据交付给指定的进程。因此,将数据在主机之间转发只是一个手段,而不是目的本身。

为了实现这个目标,我们需要确保数据能够正确地路由到正确的进程。这通常涉及到使用端口号来标识不同的进程,并且需要在网络层面上进行相应的配置和管理。

理解 "端口号" 和 "进程ID"

端口号与进程ID(PID)的关系在于,它们都是用来标识主机内部资源的。

  • 进程ID是操作系统为每一个运行中的进程分配的唯一标识符,而端口号则是为了让操作系统知道哪个进程应该接收特定网络数据流。
  • 当一个进程打开一个网络套接字并请求绑定到一个特定端口时,操作系统会确保同一时刻没有其他进程也绑定到该端口,从而保证端口号与进程之间的一一对应关系。
  • 不过,需要注意的是,一个进程实际上可以同时绑定并监听多个端口,但这并不意味着多个进程可以同时绑定同一个端口。

比如10086:在中国移动的客服系统中,10086就是一个众所周知的端口号,它可以被手机营业厅软件(一个进程)监听,当用户的手机向10086端口发起连接请求时,运营商的服务器就会将请求转交给监听该端口的特定进程处理。

理解源端口号和目的端口号:

  • 源端口号:就像唐僧(发送者)从自家的佛经室(源端口)发出一份经书(数据包),这个源端口号告诉其他网络参与者,这份经书是从哪个源头发出的。
  • 目的端口号:假设目标是孙悟空(接收者),那么目的端口号就如同孙悟空所在的花果山水帘洞(目的端口),经书最终是要送达这个地方由孙悟空接收并处理。

送快递例子:源端口号就好比快递员从A地发货站点(源地址+源端口)发出包裹,目的端口号则是收件人B地的收货地址(目的地址+目的端口)。在TCP/IP协议中,源端口号表示数据发送方的应用进程,目的端口号表示数据接收方的应用进程。数据段中的这两个端口号组合起来,就能确保数据被正确地从源进程传递到目的进程。

3、认识TCP、UDP协议

TCP(Transmission Control Protocol)作为传输层的核心协议之一,以其建立有序、可靠的数据传输通道而著称。

  • 在通信开始阶段,TCP采用三次握手建立连接,确保双方的通信准备就绪。在数据传输过程中,TCP具备序列号与确认应答机制,能够确保数据包按序送达,同时,通过重传机制解决丢包问题,通过流量控制和拥塞控制策略优化网络资源利用。总之,TCP提供一种面向连接、可靠的字节流服务,确保数据的完整性、顺序性和稳定性。

UDP(User Datagram Protocol)同样位于传输层,但在设计哲学上更侧重于简洁与速度。

  • UDP采用无连接的工作模式,即发送数据前无需预先建立连接,数据包能够独立发送,但这也意味着它不保证数据的可靠传输和顺序交付。每个UDP数据报被视为独立的信息单元,其传输过程可能丢失、乱序或重复,但这种特性使其非常适合于那些对延迟敏感、容忍一定丢包率且需要快速响应的应用场景,例如在线视频、实时通信、网络广播等。总的来说,UDP提供的是面向数据报的、无连接且不可靠的服务。

4、网络字节序

我们知道,在内存中存储多字节数据时存在大端和小端两种方式,它们决定了多字节数据在内存地址空间内的排列顺序。同样的,磁盘文件中的多字节数据相对于文件偏移地址也存在大端小端的差异。而在网络数据流中,数据的字节顺序同样是个重要问题。

对于网络数据流,尽管不存在具体的“地址”概念,但我们可以将其抽象理解为:发送主机将待发送缓冲区中的数据按照内存地址从低到高的顺序逐个发出;相应地,接收主机接收到网络上的字节流后,也会按照内存地址从低到高的顺序将这些数据依次存放在接收缓冲区中。基于此逻辑,我们约定在网络数据流中,先发送的数据视为低地址部分,后发送的数据则是高地址部分。

按照TCP/IP协议的规定,网络数据流应当采用大端字节序(Big-Endian),也就是说,高位字节存储在低地址处。无论是大端主机还是小端主机,在进行网络通信时都必须遵循这一网络字节序标准。

举例来说,如果我们想要将十六进制数0x1234abcd写入从0x0000开始的内存区域,那么依据大端和小端的不同字节序,存储结果如下:

  • 大端模式(Big-Endian):

    • 地址 0x0000 存储字节 0x12
    • 地址 0x0001 存储字节 0x23
    • 地址 0x0002 存储字节 0xab
    • 地址 0x0003 存储字节 0xcd
  • 小端模式(Little-Endian):

    • 地址 0x0000 存储字节 0xcd
    • 地址 0x0001 存储字节 0xab
    • 地址 0x0002 存储字节 0x34
    • 地址 0x0003 存储字节 0x12

所以,如果当前发送主机是小端系统,它在发送数据前需将本地小端格式转换为网络要求的大端格式;若主机本身就是大端系统,则可以直接按照大端格式发送数据。

5、网络字节序和主机字节序的转换

为了确保网络程序能在大端和小端架构的计算机上都能顺利编译和运行,程序员可以借助 <arpa/inet.h> 库提供的四个转换函数来处理网络字节序与主机字节序之间的切换,从而提高程序的可移植性。这四个函数分别是:
  • uint32_t htonl(uint32_t hostlong);
  • uint16_t htons(uint16_t hostshort);
  • uint32_t ntohl(uint32_t netlong);
  • uint16_t ntohs(uint16_t netshort);

这些函数名称的设计直观易记:“h”代表"host"(主机),"n"代表"network"(网络),"l"表示32位长整型,“s”表示16位短整型。具体含义如下:

  • htonl:将32位的主机长整型数值转换为网络字节序。例如,在发送IP地址时,确保其符合网络传输的标准字节序。
  • htons:将16位的主机短整型数值转换为网络字节序。
  • ntohl:将32位的网络长整型数值转换为主机字节序。在接收网络数据时,确保数据能被正确解析。
  • ntohs:将16位的网络短整型数值转换为主机字节序。

在实际操作中,若主机是小端字节序(低位字节存储在低地址),调用这些函数时,会将输入的参数进行大小端转换后再返回结果。反之,如果主机已经是大端字节序(高位字节存储在低地址),这些函数则会原样返回输入的参数,无需进行任何转换操作。如此一来,无论在哪种类型的计算机系统上编译和运行,程序都能够正确处理网络数据的字节序问题。

七、网络中的地址管理

网络中的地址管理至关重要,它为数据在网络中的准确传输提供了定位基础。让我们首先深入认识两种关键的网络地址类型:IP地址和MAC地址。

IP地址

IP地址是Internet Protocol(互联网协议)的核心组成部分,用于在TCP/IP网络中唯一标识一台联网设备。目前,IP协议主要存在两个版本:IPv4和IPv6。在未特别指明的情况下,我们提及的IP协议通常是指IPv4。

IPv4地址是一种四字节、32位的二进制整数。为了便于人类阅读和记忆,IPv4地址通常采用点分十进制格式进行书写。例如,"192.168.0.1"就是一个典型的IPv4地址。这里的每一个数值(如192、168、0、1)代表一个字节,取值范围从0到255,相邻数值之间用英文句点(.)分隔。这样的表示方法清晰地展现了IPv4地址由四个八位字节组成的结构。

MAC地址

MAC地址,全称Media Access Control Address,是数据链路层中用于唯一标识网络设备的一种物理地址。它与IP地址不同,主要作用于局域网内部,确保数据帧能够准确送达目标设备。

MAC地址由48位二进制组成,即六个字节。为了直观展示,通常使用十六进制数字并以冒号分隔的形式表示,例如"08:00:27:03:fb:19"。每个十六进制数代表一个字节,范围从00到FF。

值得注意的是,MAC地址在网卡出厂时就已经固化,对于大多数设备而言,它是不可更改的。因此,MAC地址具有高度的唯一性和稳定性,是识别网络设备物理身份的重要标识。然而,也有例外情况:

  • 虚拟机环境中的MAC地址并非真实硬件所生成,可能会出现重复,不具备真正的全球唯一性。
  • 部分高端网络设备或特定应用场景下,某些网卡支持用户自行配置MAC地址。尽管这打破了出厂时的固定性,但在实际网络环境中应谨慎操作,以避免地址冲突。

总结来说,IP地址与MAC地址分别服务于网络层(IP协议)和数据链路层,共同构成了网络通信中的地址管理体系。IP地址作为逻辑地址,确保数据在全球互联网中路由至正确的主机;而MAC地址作为物理地址,确保数据在局域网内精确送达目标设备。二者相辅相成,共同保障了网络通信的准确与高效。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/541211
推荐阅读
相关标签
  

闽ICP备14008679号