Linux网络基础

从本篇开始将进入介绍 Linux 中的网络知识,本篇是先对网络中的一些基础概念做介绍。

其中主要介绍了 OSI 七层协议(TCP/IP 五层协议),以及网络传输的流程,其中主要介绍了局域网传输和广域网(跨网络)传输,其中很重要的一点是关于数据包的封装和分用,最后介绍了关于端口号和 socket,得出了网络间通信的本质是进程间通信。

目录

网络协议

[1. OSI 七层模型](#1. OSI 七层模型)

[2. TCP/IP 五层协议](#2. TCP/IP 五层协议)

再识协议

[1. 为什么会有 TCP/IP 协议](#1. 为什么会有 TCP/IP 协议)

[2. 系统上的 TCP/IP 协议](#2. 系统上的 TCP/IP 协议)

网络传输基本流程

[1. 局域网通信原理](#1. 局域网通信原理)

[2. 数据包的封装和分用](#2. 数据包的封装和分用)

跨网络传输流程

端口号/socket

[1. 端口号](#1. 端口号)

[2. socket](#2. socket)
早期使用计算机的人群大多都是做实验的科学家,当在一台计算机中运行的数据想要传递个另一台计算机的时候,就需要使用软盘拷贝过去,不过这种方式也不是很方便,所以这就促使了通信的发展,一开始全球各地的实验室都在开发属于自己的通信方式,但是随着时间的流逝,现在留存下来的通信方式都是经过各种竞争保留下来的较好的网络通信方式(计算机作为人的工具,人要协同工作,注定了网络的产生)。

其中网络分为局域网和广域网:

局域网:计算机的数量太多通过交换机和路由器连接在一起网络;

广域网:通过多个路由器相互连接起来的网络。

当然,所谓的局域网和广域网都只是一个相对的概念。

网络协议

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

但是对于网络通信这样复杂的体系,就需要规定更加细致的规定,让需要通信的所有人都遵守约定。所以这个时候就需要有人站出来制定一个大家都遵守的共同标准,这就是网络协议。(一般具有制定协议或者标准的资格的组织或者公司都必须是业内公认或者具有一定地位的组织或公司)

1. OSI 七层模型

协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构。就比如我们平时打电话通信过程,表面上电话双方是直接的进行通信,实际上是一方的手机将声音转换成数据流然后通过通信设备将数据传递到另一方的手机上。

其中网络协议的分层结构就为OSI 七层模型:

OSI 七层网络模型称为开放式系统互联网参考模型,是一个逻辑上的定义和规范。

把网络从逻辑上分为了 7 层,每层都有相关、相对应的物理设备,比如路由器、交换机。

OSI 七层模型是一种框架性的设计方法,其主要功能就是帮助不同类型的主机实现数据传输。

其最大优点就是将服务、接口和协议这三个概念明确的区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通信。

但是对于 OSI 模型的七层协议而言,在实际的实现中只能实现五层,其中有三层只能实现在一层。

OSI 七层模型如下:

2. TCP/IP 五层协议

TCP/IP 是一组协议的代名词,包括许多协议,组成了 TCP/IP 协议簇。

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

**物理层:**负责光/电信号的传递方式.。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的 wifi 无线网使用 电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。

**数据链路层:**负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线 LAN 等标准。交换机 (Switch)工作在数据链路层。

网络层:负责地址管理和路由选择。例如在 IP 协议中, 通过 IP 地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器 (Router)工作在网路层。

**传输层:**负责两台主机之间的数据传输。如传输控制协议 (TCP),,能够确保数据可靠的从源主机发送到目标主机。

应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。

对于以上的五层协议,其中数据链路层(网卡)、物理层(硬件)是在设备驱动程序与网络接口中实现的;网络层和传输层是在操作系统层实现的;应用层则是在应用程序中实现的。

再识协议

上文中我们接触的只是网络协议中的一些概念,但是对于协议的理解还不够深刻,我们将在下文中更加深刻的剖析我们的协议。

1. 为什么会有 TCP/IP 协议

其实不管是网络连接通信,还是单机都是存在协议的,比如设备内的内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议。

但是相比网络通信和单机内设备通信,最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题,有问题就需要新的解决方法,所以就会诞生出新的协议(所以,TCP/IP 协议的诞生,本质是通信主机距离变远了)。其中远距离主机之间的通信需要解决一下问题:

  1. 转发数据到其他主机,首先需要的是将数据转发到路由器中,应该如何转发。

  2. 网上这么多主机,应该怎样定位我们需要通信的主句。

  3. 如果在网络中传递的数据丢失应该怎么办。

  4. 远端的主机拿到数据之后,应该怎样处理和使用发送过来的数据。

所以 TCP/IP 协议就是为了处理以上问题而诞生的。

2. 系统上的 TCP/IP 协议

TCP/IP 协议在操作系统中实现如下:

在不同的操作系统中网络协议栈必须按照标准进行相同的实现,这样才可以使得不同的主机之间可以相互通信。

在传输层中最著名的协议为 TCP,网络层中最著名的协议为 IP,对于传输层和网络层这辆层必须实现在操作系统内核中。

如上图,假设我们在任意一层中定义一个结构体 Protocol,从 windows 主机发送一个这样的数据给 Linux ,Liunx 可以收到吗?答案是肯定可以收到,因为在双方的底层都实现了这样的结构体(可能实现的方式不一样),但是都是可以收到的。

所以对于协议朴素的理解就是:协议就是通信双方都认识的结构化数据类型

因为协议栈是分层的,所以,每层双方都有协议,同层之间,互相可以认识对方的协议。

网络传输基本流程

1. 局域网通信原理

在局域网中,每台主机使用唯一的 mac 地址保证在局域网中的唯一性。

MAC 地址:

  1. MAC 地址用来识别数据链路层中相连的节点;

  2. 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19);

  3. 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址)。

以局域网中的以太网为例:

如上,主机 A 向主机 E 发送信息的时候,数据就会在以太网上传输,但是对于这个信息以太网中的主机都可以接收到,但是不同的是,只有是目的主机的主机才会处理该数据,不是的主机只会将这个信息给忽略。

局域网中通信的特点:

  1. 在任何时刻,只会允许一台机器向网络中发送数据;

  2. 若有多台同时发送,会发生数据干扰,也就是数据碰撞;

  3. 所有发送数据的主机要进行碰撞检测和碰撞避免;

  4. 没有交换机的情况下,局域网就是一个碰撞域;

  5. 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标 mac 地址判定;

2. 数据包的封装和分用

在每层中都有对应的协议,当我们进行上述流程传输的时候,都需要对我们的数据进行封装 和**解包,**如下:

当一个主机要向另一个主机发送信息的时候,信息会从应用层向下一直传递,在每一层都会封装自己的数据报头 ,然后向下运送,最后通过网卡传输到另一个主机中,当另一个主机接收到之后,在每一层都会将对应的数据报解包 ,然后向上传递,最后得到发送出的消息。这样的每一层封包,然后在每一层的解包,其实很像入栈和出栈,所以就有了网络协议栈的由来。

在每一层中,将数据报文分为报头和有效载荷,只有本层的数据报头才为报头,上层的报头和数据共同组成有效载荷

  1. 报头部分,就是对应协议层的结构体字段,我们一般叫做报头;

  2. 除了报头,剩下的叫做有效载荷;

  3. 报文 = 报头 + 有效载荷。

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

不同的协议层对数据包有不同的称谓,在传输层叫做段(segment) ,在网络层叫做数据报 (datagram) ,在链路层叫做帧(frame)

在接收方,会对接收到的数据进行解包,但是解包的数据还存在一个问题,交付给上层的哪一个协议(因为每层中都会有很多的协议,且封装的时候也是不同的协议进行封装的),这就涉及数据的分用了,分用就是将数据拆包之后将数据向上层对应的协议递交。如下图:

跨网络传输流程

对于 IP 协议有着两个版本,IPv4 和 IPv6。我们整个的课程,凡是提到 IP 协议,没有特殊说明的,都是默认 IPv4。对于 IP 地址:

  1. IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;

  2. 对于 IPv4 来说,IP 地址是一个 4 字节,32 位的整数;

  3. 我们通常也使用 "点分十进制" 的字符串表示 IP 地址,例如 192.168.0.1;用点分割的每一个数字表示一个字节,范围是 0 - 255。

对于跨网络传输就是数据通过一台主机到另一台主机传输过程中要经过一个或多个路由器。如下:

如上,当数据从主机 A 传输到主机 B,发现目的地址的 IP 不是在本局域网内,就会将其传给路由器(路由器通常会配有两个及以上的网卡,也就是有多个 IP 地址),转发给路由器的时候,需要向下交付报文,然后把目的 MAC 地址封装为路由器的 MAC 地址,这样才能将数据发送给路由器,送达路由器之后,就会对解包连路程的数据报,得到 MAC 地址,然后就会对我们的目的 IP 地址进行路由检索,查询如何到达目的 IP 地址,然后向下交付的时候再次封装报文的目的 MAC 地址,以此循环,直到到达目的 IP 地址的主机。

当通过路由器将信息发送到另一个局域网之后,就会修改在传输过程的数据中的 mac 地址(因为每个局域网内的 mac 地址不一样),但是 IP 地址始终都不会改变。所以对比 IP 地址和 MAC 地址,可以得出:

  1. IP 地址在整个路由过程中,一直不变(除了 NAT)

  2. MAC 地址会一直改变

  3. IP 地址是最终目标,而 MAC 地址只是阶段性目标,目的 IP 是路径选择的重要依 据,mac 地址是局域网转发的重要依据

网络通信的宏观流程:

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

端口号/socket

1. 端口号

上文中介绍了关于数据传输的基本流程,但是数据从一个主机传输到另一个主机就结束了吗?肯定是没有结束,只有将数据传输到目的主机对应的进程,因为数据是要交给进程的,比如发送 QQ 信息,是从一个主机的 QQ 发送到另一个主机的 QQ。

在一个主机中有着那么多的进程,当数据到达目的主机,应该传给哪个进程呢?

当数据向上交付的时候,从传输层向上交付给应用层,交付的是给应用层中的接口。那么我们在源主机封装的时候,在传输层也会将我们的接口给封装在传输层协议的报头中,所以端口号是传输层协议的内容。

端口号是一个 2 字节的 16 位的整数;

端口号可以用来标识一个进程,告诉操作系统,当前中国数据要交给哪一个进程来处理;

IP 地址 + 端口号就可以标识网络上的某一台主机的某一个进程;

一个端口号只能被一个进程占用。

端口号也存在范围划分:

0 - 1023:知名端口号,HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的。

1024 - 65535:操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围分配的。
对于进程,端口号和进程 PID 都可以唯一标识一个进程,那么为什么不直接使用其中一个来标识进程呢?

这是因为进程 PID 属于操作系统层面的概念,技术上是用操作系统实现的,而端口号是网络层面的概念,假若强行将这两个绑定起来,那么会导致系统进程管理和网络强耦合,一段出现问题就会导致操作系统层面和网络层面一起出问题。

一个进程可以有多个端口号,而一个端口号只能对应一个进程。在一个主机中可能有着许多的进程,但是需要网络通信的进程却相对较少。

2. socket

对于 IP 地址可以在网络中标识唯一的主机,对于端口号,可以在一个主机中标识唯一的进程,那么IP + 端口号就可以标识网络中的唯一进程 ,所以网络间通信实际上是互联网中的两个进程进行通信 ,进程间通信的本质是让两个不同的进程看到同一份资源,那么网络间进程通信看到的同一份资源就是网络

我们把IP + PORT 叫做套接字 socket

相关推荐
xiaoxiongip66630 分钟前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
JaneJiazhao36 分钟前
HTTPSOK:智能SSL证书管理的新选择
网络·网络协议·ssl
CXDNW36 分钟前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
无所谓จุ๊บ1 小时前
树莓派开发相关知识十 -小试服务器
服务器·网络·树莓派
道法自然04021 小时前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器
EasyCVR2 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
明月看潮生3 小时前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
龙哥说跨境4 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
懒大王就是我4 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
Elaine2023914 小时前
06 网络编程基础
java·网络