欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 【Linux】网络基础

【Linux】网络基础

2025/2/4 22:47:17 来源:https://blog.csdn.net/m0_69131255/article/details/144168605  浏览:    关键词:【Linux】网络基础

【Linux】网络基础

文章目录

  • 【Linux】网络基础
    • 1. 网络发展:
    • 2. 初识协议:
      • 1.1 协议分层
        • 为什么要分层?
      • 1.2 OSI 七层模型
      • 1.3 TCP/IP 五层(或四层)模型
      • 1.4 为什么要有TCP/IP协议?
      • 1.5 什么是TCP/IP 协议?
      • 1.6 TCP/IP 协议与操作系统的关系(宏观上,怎么实现的)
    • 3. 网络传输基本流程
      • 3. 1 局域网(以太网为例)通信原理
      • 3.2 提炼IP 网络的意义和网络通信的宏观流程
    • 4. Socket 编程预备
      • 4.1 理解源IP 地址和目的IP 地址
      • 4.2 认识端口号
      • 4.3 理解"端口号" 和"进程ID"
      • 4.3 理解源端口号和目的端口号
      • 4.5 理解socket
      • 4.6 传输层的典型代表
    • 5. 认识TCP 协议
    • 6. 认识UDP 协议
    • 7. 网络字节序
    • 8. socket 编程接口

1. 网络发展:

  • 独立模式:计算机之间相互独立。
  • 网络互联:多台计算机连接·在一起,完成数据共享。
  • 局域网LAN:计算机数量多了,通过交换机和路由器连接在一起。
  • 广域网WAN:将远隔千里的计算机连接在一起。
  • 所谓"局域网" 和"广域网" 只是一个相对的概念. 比如, 我们有"天朝特色" 的广域网, 也
    可以看做一个比较大的局域网.

计算机是人的工具,人要协同工作,注定了网络的产生是必然的.

2. 初识协议:

  • "协议"是一种约定

计算机之间的传输媒介是光信号和电信号. 通过"频率" 和"强弱" 来表示0 和1 这样的
信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式.

思考: 只要通信的两台主机, 约定好协议就可以了么?

  • 定好协议,但是你用频率表示01,我用强弱表示01,就好比我用中国话,你
    用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了
    基本的协议,也是无法正常通信的

所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守。

一般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地位的组织或者公司

1.1 协议分层

为什么要分层?

协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构的

软件分层的好处

image-20241130204719110

  • 这个例子中,我们的“协议”只有两层:语言层和通信设备层。
  • 但实际的网络通信协议,设计会更加复杂,需要分更多层。

1.2 OSI 七层模型

  • 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,
    理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可
    靠的通讯;
  • 但是, 它既复杂又不实用; 所以我们按照TCP/IP 四层模型来讲解.

image-20241130205146048

image-20241130205243252

  • 其实在网络角度,OSI 定的协议7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是5 层协议。

1.3 TCP/IP 五层(或四层)模型

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

image-20241130212730980

  1. DNS (Domain Name System, 域名系统):
    • DNS 是一个分布式数据库,它将人类可读的域名(如 www.example.com)转换为计算机可识别的 IP 地址(如 192.0.2.1)。这样,用户可以通过输入域名来访问网站,而不需要记住网站的 IP 地址。
  2. URL (Uniform Resource Locator, 统一资源定位符):
    • URL 是一种地址格式,它指定了互联网上资源的位置。URL 通常包含协议类型(如 http://https://)、域名或 IP 地址、端口(可选)、路径和查询参数(可选)等。
  3. HTML (HyperText Markup Language, 超文本标记语言):
    • HTML 是一种用于创建网页的标准标记语言。它定义了网页内容的结构和格式,包括文本、链接、图片、表格等。HTML 使用标签来描述网页内容,浏览器会解析这些标签并显示网页。
  4. HTTP (HyperText Transfer Protocol, 超文本传输协议):
    • HTTP 是一种应用层协议,用于在 Web 浏览器和 Web 服务器之间传输超文本数据。它是互联网上最常用的协议之一,用于在客户端和服务器之间交换 HTML 页面、图片、视频等资源。
  5. SMTP (Simple Mail Transfer Protocol, 简单邮件传输协议):
    • SMTP 是一种用于发送电子邮件的互联网标准。它定义了电子邮件的传输过程,包括邮件的格式、路由和交付等。SMTP 协议用于在邮件服务器之间传输邮件,而用户通常使用其他协议(如 IMAP 或 POP)来接收邮件。
  6. APR (Apache Portable Runtime):
    • APR 是 Apache 软件基金会开发的一套库,旨在提供可移植的运行时环境,使得 Apache HTTP 服务器可以在多种操作系统上运行。APR 提供了一系列 API,用于处理文件系统操作、网络通信、内存管理等,使得 Apache 服务器能够跨平台运行。
  7. IP (Internet Protocol):
    • IP 的全称是 Internet Protocol,即互联网协议。它是网络层的一种通信协议,负责将数据包从源地址传输到目标地址。IP 协议定义了数据包的格式和传输规则,并使用 IP 地址来标识网络上的设备。它是互联网的核心协议之一,与传输控制协议 (TCP) 一起构成了 TCP/IP 协议栈的基础。
  8. ICMP (Internet Control Message Protocol):
    • ICMP 的全称是 Internet Control Message Protocol,即互联网控制消息协议。它是一种网络层协议,用于在 IP 网络中发送控制消息,如错误报告、回显请求(ping)等。ICMP 消息通常用于诊断网络问题、报告传输错误、提供网络状态信息等。

物理层我们考虑的比较少,我们只考虑软件相关的内容. 因此很多时候我们直接称为TCP/IP 四层模型.

一般而言:

  • 对于一台主机,它的操作系统内核实现了从传输层到物理层的的内容。
  • 对于路由器,它实现了从网络层到物理层。
  • 对于交换机,它实现了从数据链路层到物理层。
  • 对于集线器,它实现了物理层。

但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发);

1.4 为什么要有TCP/IP协议?

  • 首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:SATA,IDE,SCSI 等。只不过我们感知不到罢了。而且这些协议都在本地主机各自的硬件中,通信的成本、问题比较少。
  • 其次,网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议咯。

image-20241130213904147

所以,为什么要有TCP/IP 协议?本质就是通信主机距离变远了

1.5 什么是TCP/IP 协议?

  • TCP/IP 协议的本质是一种解决方案
  • TCP/IP 协议能分层,前提是因为问题们本身能分层

1.6 TCP/IP 协议与操作系统的关系(宏观上,怎么实现的)

image-20241201091602735

所以究竟什么是协议?

  • 截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可
    以试试了。
  • OS 源代码一般都是用C/C++语言写的。

image-20241201092728245

问题:主机B 能识别data,并且准确提取a=10,b=20,c=30 吗?
回答:答案是肯定的!因为双方都有同样的结构体类型struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别对方发来的数据,这不就是约定吗?

关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型。
因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对
方的协议。

3. 网络传输基本流程

3. 1 局域网(以太网为例)通信原理

  • 首先回答,两台主机在同一个局域网,是否能够直接通信?可以直接通信
  • 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址

认识MAC 地址

  • MAC地址用来识别数据链路层中相连的节点。
  • 长度为48位,即6个字节,一般用16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
  • 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的mac 地址不是真实的mac 地址, 可能会冲突; 也有些网卡支持用户配置mac 地址)。

image-20241201093446102

  • 以太网中,任何时刻都只允许一台机器向网络中发送数据。
  • 如果有多台机器同时发送,会发生数据干扰,我们称为数据碰撞。
  • 所有发送数据的主机都要进行碰撞检测和碰撞避免。
  • 没有交换机的情况下,一个以太网就是一个碰撞域。
  • 局域网通信的过程中,主机对收到的报文是否是发给自己的,是通过目标Mac地址判定
  • 局域网就类似与临界资源。

网段内的两台主机进行发送消息的过程

image-20241201095810019

每层都有协议,所以当我进行进行上述传输流程的时候,要进行封装和解包

  • 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
  • 除了报头,剩下的叫做有效载荷
  • 故,报文= 报头+ 有效载荷

不同层的报文的完整叫法:

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

整体复盘:

image-20241201101115228

image-20241201103234676

在网络传输的过程中,数据不是直接发送给对方主机的,而是先要自定向下将数据交付给下层协议,最后由底层发送,然后由对方主机的底层来进行接受,在自底向上进行向上交付,下面是一张示意图。

image-20241201110005321

下图为数据分用的过程:

image-20241201111209673

跨网络传输流程图

网络中的地址管理- 认识IP 地址

  • IP 地址是在IP 协议中, 用来标识网络中不同主机的地址;
  • 对于IPv4 来说, IP 地址是一个4 字节, 32 位的整数;
  • 我们通常也使用"点分十进制" 的字符串表示IP 地址, 例如192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是0 - 255;

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

下面是一张示意图:

image-20241201111700414

image-20241201120915522

对比IP 地址和Mac 地址的区别

  • IP 地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正)
  • Mac 地址一直在变
  • 目的IP 是一种长远目标,Mac 是下一阶段目标,目的IP 是路径选择的重要依
    据,mac 地址是局域网转发的重要依据

3.2 提炼IP 网络的意义和网络通信的宏观流程

image-20241201121728695

IP 网络层存在的意义:提供虚拟网络层,让世界所有网络都是IP网络,屏蔽最底层网络的差异。

4. Socket 编程预备

4.1 理解源IP 地址和目的IP 地址

  • IP在网络中,用来表示主机的唯一性。
  • 但是这里要思考一个问题:数据传输到主机是目的吗?不是的。因为数据是给人用
    的。比如:聊天是人在聊天,下载是人在下载,浏览网页是人在浏览?
    但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过
    启动的qq,迅雷,浏览器。
  • 而启动的qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把
    数据给进程,人就相当于就拿到了数据。
  • 所以:数据传输到主机不是目的,而是手段。到达主机内部,在交给主机内的进程,
    才是目的。
  • 但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标
    进程?这就要在网络的背景下,在系统中,标识主机的唯一性。

image-20241201123054444

4.2 认识端口号

端口号(port)是传输层协议的内容

  • 端口号是2字节16位的整数
  • 端口号用来表示一个进程,告诉操作系统,当前数据要交给哪个进程来处理
  • IP地址+端口号能工标识网络上的某一台主机的某个进程
  • 端口号只能被一个进程占用

image-20241201123721048

端口号范围划分

  • 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的.
  • 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.

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

我们之前在学习系统编程的时候, 学习了pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系?

  • 一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定。
  • 进程ID 属于系统概念,技术上也具有唯一性,确实可以用来标识唯一的一个进
    程,但是这样做,会让系统进程管理和网络强耦合,实际设计的时候,并没有选择这
    样做。

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

传输层协议(TCP 和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号.就是在描述"数据是谁发的, 要发给谁";

4.5 理解socket

综上:IP地址用来标识互联网中唯一的主机,port用来标识该主机中唯一的一个网络进程。

  • IP+Port就能表示互联网中唯一的一个进程。
  • 通信的时候,本质就是:两个互联网进程代表人来进程通信,{srcIP,srcPort,dstIP,dstPort}这样的四元组就能标识互联网中唯二的两个进程。
  • 所以,网络通信的本质,也是进程间通信。
  • 我们将IP+Port叫做套接字socket.
C++
socket
n.
(电源)插座;(电器上的)插口,插孔,管座;槽;窝;托座;臼;孔穴
vt.
把…装入插座;给…配插座

4.6 传输层的典型代表

  • 如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核
    的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来
    进行的网络通信。

    image-20241201125950502

5. 认识TCP 协议

此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论TCP 的一些细节问题.

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

6. 认识UDP 协议

此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后
面再详细讨论.

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

7. 网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的
多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之
分. 那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
  • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
  • TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.
  • 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP 规定的网络字节序来发送/接收数据;
  • 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

为使网络程序具有可移植性,使同样的C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

image-20241201130423222

  • 这些函数名很好记,h 表示host,n 表示network,l 表示32 位长整数,s 表示16 位短整数。
  • 例如htonl 表示将32 位的长整数从主机字节序转换为网络字节序,例如将IP 地址转换后准备发送。
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回
  • 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

8. socket 编程接口

socket 常见API

// 创建socket 文件描述符(TCP/UDP, 客户端+ 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号(TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求(TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建立连接(TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);

sockaddr 结构

image-20241201131501623

  • IPv4 和IPv6 的地址格式定义在netinet/in.h 中,IPv4 地址用sockaddr_in 结构体表示,包括16 位地址类型, 16 位端口号和32 位IP 地址.
  • IPv4、IPv6 地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr 结构体的首地址,不需要知道具体是哪种类型的sockaddr 结构体,就可以根据地址类型字段确定结构体中的内容.
  • socket API 可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX DomainSocket 各种类型的sockaddr 结构体指针做为参数;

[!IMPORTANT]

【Linux】网络基础完成,下一篇【Linux】Socket编程UDP

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com