当前位置: 首页 > article >正文

网络原理(1)—— 初识

目录

一. 网络发展史

1.1 单机时代(20世纪50年代至60年代)

1.2  局域网阶段(20世纪70年代至80年代)

1.3 广域网阶段(20世纪80年代至90年代)

1.4 移动互联网阶段(21世纪初至今)

二. 网络基础概念

2.1 IP地址

2.2 端口号

2.3 协议(最核心)

2.4 协议分层

三. 封装和分用

3.1 发送流程

3.2 接收流程


一. 网络发展史

1.1 单机时代(20世纪50年代至60年代)

    早期计算机主要是独立工作的,没有网络连接。计算机科学家们主要研究如何提高单机的计算能力。这个时期的代表成果包括第一台电子计算机ENIAC的诞生,以及晶体管和集成电路的发展。当时计算机主要用于科学计算和军事领域。 

1.2  局域网阶段(20世纪70年代至80年代)

    随着计算机技术的发展,越来越需要计算机之间互相通信,实现资源共享,即以多个计算机协同工作来完成业务,就有了网络互连。局域网(LocalAreaNetwork,LAN)应运而生。

    网络互连:将多台计算机连接在一起,完成数据共享。数据共享本质是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。

军事领域历史背景:

     20世纪50年代,正值冷战时期,美国和苏联之间的紧张关系不断升级。在这一背景下,美国国防部意识到需要一种能够经受住核攻击或其他灾难性事件影响的通信系统传统的集中式通信系统在遭受攻击时容易失效,因此美国国防部开始寻求一种更可靠、分布式的通信解决方案。

    1960年代,ARPA(高级研究计划局)开始资助一系列的研究项目,其中包括著名的ARPANET项目。1969年,ARPANET项目成功实现了不同地理位置的计算机之间的连接,开发了世界上第一个网络—— ARPANET,奠定了互联网的基础,标志着现代计算机网络的诞生。ARPANET的设计理念是创建一个去中心化的网络,即使部分网络遭到破坏,其他部分仍能保持通信能力。

    ARPANET采用了分组交换技术,这是一种将数据分割成小块(称为分组)进行传输的方法。这种技术提高了网络的可靠性和效率,因为即使某些分组在传输过程中丢失,其他分组仍可以到达自的地,并且可以重新发送丢失的分组。

    ARPANET在技术上的另一个重大贡献是开发了TCP/IP协议簇。这些协议定义了数据如何在网络中传输和路由,以及如何确保数据的完整性和可靠性。TCP/IP协议后来成为互联网的标准通信协议。

    局域网内的主机之间能方便的进行网络通信,又称为内网;局域网和局域网之间在没有连接的情况下,是无法通信的。

局域网的组建:

(1)路由器

(2)交换机和路由器:由于一个路由器上面的口比较有限,就引入了交换机(交换机就相当于是对路由器的端口进行扩展)

    把这些路由器设备越连越多,导致构成非常大非常复杂的网络,把一个城市 / 一个国家,所有的设备都连在一起 。现在见到的 “万维网” 就属于是把全世界的设备都连在一起的巨大广域网。

1.3 广域网阶段(20世纪80年代至90年代)

    随着局域网技术的成熟,人们开始将不同地区的局域网连接起来,形成广域网(WideArea
Network, WAN)。

    1990年代,互联网商业化进程加速,万维网(WorldWideWeb)的诞生使得互联网开始走进普通家庭。这一时期,互联网用户数量迅速增长,网络基础设施不断完善。 

    通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。

   如果有北、中、南等分公司,甚至海外分公司,把这些分公司以专线方式连接起来,即称为“广域网”;如果属于全球化的公共型广域网,则称为互联网(又称公网,外网)。

    广域网可以是互联网的一部分,即它可以通过互联网服务提供商(ISP)连接到互联网;互联网可以看作是特殊的广域网,因为它连接了全球范围内的网络,而普通的广域网则通常限于特定的组织或地区。

1.4 移动互联网阶段(21世纪初至今)

    2007年左右,互联网圈子发生了一件惊天动地的大事——乔布斯发布苹果手机(当时不起眼,主流手机是诺基亚、摩托罗拉....)。iPhone的成功推动了移动互联网的快速发展,从此,智能手机时代/ 移动互联网时代拉开序幕。 

    2011年左右,苹果发布了 iPhone4(经典之作),同时,三星、小米、华为入局,安卓手机也开始崛起。

    2013年左右,移动互联网全面到来,相当于智能手机全面普及。“应用商店”的兴起 也催生出一批开发应用的公司,吸引大量的资本入局,开启了“全面创业时代”。

    2017年左右,有一个比较火的方向,差点称为“下一代”—— VR / AR,但由于当年显卡算力不够,难以渲染出足够真实的画面。

二. 网络基础概念

2.1 IP地址

概念

    IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址描述了一台主机在互联网上所处的位置

    就像我们发送快递一样,需要知道对方的收货地址(IP地址),快递员才能将包裹送到目的地。

格式

    IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节,整数) 如:
01100100.00000100.00000101.00000110

    通常用“点分十进制” 的方式来表示IP地址,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)如:100.4.5.6。这样表示之后,方便进行阅读。

2.2 端口号

概念

   一个主机上,使用网络的程序有很多个,通过端口号区分当前主机收到的数据是要交给哪个程序来处理使用。

   类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)

· 唯一标识端口号是一个16位的数字,范围从0到65535,它附加在IP地址上,端口号可以标识主机中发送数据、接收数据的进程,用于唯一标识主机上的一个网络进程。

· 分层结构在TCP/IP模型中,IP地址负责将数据包路由到正确的计算机,而端口号则负责将数据包路由到正确的进程或服务。

格式

    端口号是0~65535范围的数字(2个字节)。虽然范围是 0~65535,但实际上,0~1023 这些端口都有一些特定含义,我们自己写代码使用的端口一般都是剩下的。

分类

  1. 知名端口:范围在0~1023,这些端口由IANA(互联网号码分配机构)分配给特定的服务。例如:端口20和21用于FTP(文件传输协议),端口22用于SSH (安全外壳协议),端口80用于HTTP(超文本传输协议),端口443用于HTTPS(安全的超文本传输协议)
  2. 注册端口 :范围在1024~49151,这些端口通常用于用户自定义的服务,但需要向IANA注册
  3. 动态端口或私有端口:范围在49152~65535,这些端口通常由客户端程序动态分配,用于临时的通信会话。

问题:
     有了IP地址和端口号,可以定位到网络中唯一的一个进程,但还存在一个问题,网络通信是基于二进制数据0 1 0 1...来传输,如何告诉对方发送的数据是什么样的呢?
    网络通信传输的数据类型可能有多种:图片,视频,文本等。同一个类型的数据,格式可能也不同,如发送一个文本字符串“你好!”。如何标识发送的数据是文本类型,及文本的编码格式呢?
    基于网络数据传输,需要使用协议来规定双方的数据格式。 协议是网络中最核心的概念,是进行一切通信的基础。

2.3 协议(最核心)

   协议是进行一切通信的基础,通信至少有两个主机,让发送方的数据,接收方能够理解。双方需要按照同样的规则来构造/解析数据。协议就是在约定通信双方,交互数据的“规则”,协议确定了双方就在一个频道上了,才能进行有意义的通信。 

   如何进行网络通信 --> 就转为了如何设计网络通信协议~~

概念

   协议(protocol),网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。如怎样建立连接、怎样互相识别、数据通信的格式等。协议确定了,双方就在一个频道上了,才能进行有意义的通信。只有遵守这个约定,计算机之间才能相互通信交流。

   网络上传输的数据形式有多种,本质上都是传输 01这样的二进制数字:

  • 电信号(网线里传播的信号,高电平与低电平信号)
  • 光信号(光纤通信,高电平与低电平信号)
  • 电磁波(wifi,5G....)

   因此,通信的时候就要规定好传输的一大串 0 1 0 1...都是什么意思,这个就是“网络通信协议”要完成的核心工作。


   由于网络通信非常复杂,如果使用一个协议约定所有的网络细节,就会导致这个协议变得非常庞大与复杂。因此,需要将协议拆分,即将一个大的协议,拆分成多个小的协议,让每个小的协议专注于解决一个/一类问题,再让这些协议相互配合。为了更好的组织拆出来的协议,就要对协议分层(把功能定位类似的协议,放到一层里,并且约定好层和层之间的关系)

   并且约定好协议之间不能随意相互交互,只能是相邻层之间才可以:上层协议调用下层协议,下层协议给上层协议提供服务。我们也把这样的分层效果称作 “协议栈”/“协议层”

   协议进行分层后带来的最大好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接

  1. 降低使用成本:使用某个协议的时候,不需要关注其他层协议的实现细节,只需要使用接口即可。比如 打电话这个事情,不需要理解电话机的工作原理,只要会说话即可~~
  2. 降低整个体系的耦合性,可以灵活变更某个层次的协议。
  3. 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。

2.4 协议分层

当前互联网协议分层,具体是怎么分的呢?

 · OSI 七层网络模型(了解):

   OSI(开放式系统互联)七层网络模型是一个概念性框架,用于理解和设计网络体系结构的功能分层。它由国际标准化组织(ISO)提出,以促进不同网络技术之间的互联和互操作性。OSI模型将网络通信过程抽象为七个层次,每一层都执行特定的功能,以下是各层的简要介绍:
1. 物理层:
   最底层,负责在物理媒体上实现原始的比特流传输,涉及电气特性、机械特性、功能特性等。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
2. 数据链路层:
   负责在相邻节点之间的可靠连接,处理帧的传输,并进行差错控制和流量控制。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
3. 网络层:
   负责数据包从源到目的地的传输和路由选择,实现不同网络之间的通信。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
4. 传输层:
   确保数据的正确顺序传输和错误恢复,提供端到端的通信控制,包括流量控制、错误控制和数据重传。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。

5. 会话层:
   负责建立、管理和终止会话,会话可以被理解为不同应用程序之间的对话或交互。
6. 表示层:
   负责数据的转换、加密和压缩,确保数据在网络中传输前后的表示格式是一致的。
7. 应用层:
   最接近用户的一层,为应用程序提供服务,如HTTP、FTP、SMTP等,负责处理高级应用程序间的通信。我们的网络编程主要就是针对应用层。

   OSI模型虽然是一个理论上的模型,但它为网络通信提供了一个清晰的结构,帮助网络工程师理解、设计和解决网络问题。在现实中,互联网协议套件(TCP/IP)是实际应用最广泛的网络模型,它部分采用了OSI模型的层次结构。
 

· TCP/IP五层网络模型(最主流)

· 物理层:描述的是硬件设备(网线...)需要满足的条件,相当于“公路” “铁路” “航线”....

传输层、网络层、数据链路层相互配合,共同完成数据转发的过程:

· 传输层:主要就是关注网络通信中的“起点”和“终点”(端到端),并不关心通信的中间细节。

比如 网上购物下单的时候,买家要填写“收件人地址”与“收件人姓名”,卖家要发快递,填写“发件人地址”和“发件人姓名”,卖家就把商品交给快递小哥。

· 网络层:

  • 主要进行网络通信的路径规划。网络是一个很复杂得结构,因此从A到B中间有很多不同路线,要进行“路由选择”

比如 收件人在西安,发件人在上海,快递运输路线可以是 上海->南京->西安,也可以是广州-> 北京->西安...... 我们要根据实际情况选择一条合适(最快、路径最短、花费最少....)的路径。还有,使用地图导航,也是类似于 网络层 “路由选择” 的过程。

  • 另外,网络层还需要负责地址管理

· 数据链路层:针对上述规划好的路径,进行具体的实施。实施过程中,具体又是怎样的情况。

比如 从上海->南京,可以选择走水路 坐船;从南京-> 西安,走铁路火车;从西安到收件人地址附近的集散点,走公路 卡车运输;集散点->收件人家,快递小哥骑电三轮运输过来。

形象的比喻:

   上述的几层,是程序员无法干预的,属于操作系统/硬件设备已经实现好的;而应用层是程序员可以干预到的。

· 应用层:在拿到数据后,具体如何处理这些数据,比如计算、显示到屏幕上.....

比如 收件人收到商品后,具体用商品做什么。


· TCP/IP 中,把 OSI 协议的表示层和会话层,和应用层融合到一起了。

   如果有谈到“TCP/IP”四层模型,是不算物理层了。因为物理层和硬件相关,距离程序员非常遥远,不需要我们关心。

五元组
在TCP/IP协议中,用五元组来标识一个网络通信:

  1. 源IP:标识源主机
  2. 源端口号:标识源主机中该次通信发送数据的进程
  3. 目的IP:标识目的主机
  4. 目的端口号:标识目的主机中该次通信接收数据的进程
  5. 协议号:标识发送进程和接收进程双方约定的数据格式

   可以在cmd中,输入netstat -ano查看网络数据传输中的五元组信息:

   如果需要过滤(一般是通过端口号或进程PID过滤),可以使用 netstat-ano | findstr 过滤
字符串

三. 封装和分用

   数据在网络通信中的整体流程,涉及两个关键词:封装分用。下面举一个网络通信的实例:通过 QQ发送一个hello给另一个人经历的过程

3.1 发送流程

1. 用户在输入框中输入hello字符串,并点击发送,QQ程序就会把hello这个内容从输入框读取到,构造成一个“应用层数据包”,应用层的网络协议,就描述了这个数据包的构造。此处的应用层协议往往是开发QQ的程序员自行定义的。

   QQ应用层数据包的结构,可能会按照某个方式定义,比如

  • 数据包格式:发送者的qq号;接收者的qq号;发送时间;消息正文;\n(结束标志)(分号用来分隔二进制字符串,也可以使用其他的符号来分隔)
  • 数据包样例:1234567890;0987654321;2024-12-06 12:00:00;hello\n

   进行网络传输数据时,通常需要把一个“结构化”数据(类似于c的结构体或java的类) 转成  “二进制字符串”,这个过程就称为“序列化”;接收方又会将“二进制字符串”转化为“结构化数据”,这个过程称为“反序列化”。

   应用层将“结构化”数据转化为“二进制字符串”就是一个序列化过称,具体转化的格式有很多种。


2. QQ这样的应用程序就会调用操作系统提供的API(即应用层调用传输层提供的API)
   
比如 操作系统会提供一个类似于“发送数据”的API,应用程序就会把上述组织好的应用层数据包,作为参数传进来,于是应用层数据包就到了系统内核里,进入到传输层的代码部分了。
    此时,传输层就会把上述应用层数据进一步封装成一个传输层数据包,由于传输层有多种协议,其中最主要的时两个,TCP 和 UDP,这两个协议给应用层提供的API是两组不同的,根据应用层使用的是哪组API,就是使用的哪个协议。
   假设此处使用的是 UDP 协议,此时就会将将应用层数据包中的数据,进一步包装成UDP数据包,即在应用层数据包中的字符串前拼接一个前缀。

报头(Header)

   报头是数据传输中的一个结构,它包含了用于数据传输控制的信息。报头通常位于数据包的开始部分,它为接收方提供了如何处理数据包的信息。

载荷(Payload)

   载荷是指数据包中实际传输的数据部分,即除去报头之外的内容。

载荷是数据传输的最终目的,报头则是为了确保载荷能够被正确地发送和接收。

   其实,计算机网络中的“封装”就是进行字符串的拼接 ,提供一些额外的信息,为后续的转发打下基础(不同于快递的标签,贴一个标签就会包含所有信息;网络中有多层协议,每一层协议都要贴标签,且每一层协议的侧重点不同,贴上的标签也不一样)


3. 传输层构造好数据后,就会继续调用网络层提供给传输层的API,把数据进一步交给网络层。由于传输层和网络层,都是“操作系统内核”里面实现好的,上述调用过程,应用层程序员无需关心,也感知不到。

   网络层也有多种协议,其中最主要的是 IPv4 协议(简称为 IP协议,默认为IPv4。虽然也有IPv6,但是IPv4仍然是主导地位)
   IP协议,就会把上述拿到的传输层数据包,构造成网络层数据包。

4. 网络层继续调用数据链路层的API,将数据交给数据链路层处理。数据链路层的常见协议--> 以太网(平时插网线,进行上网的这种方式)

   以太网(Ethernet)是一种广泛使用的局域网技术,它定义了在物理媒介上传输数据的方法以及在网络设备之间建立通信的标准。

物理学中的“以太”
   在19世纪和20世纪初,物理学家普遍认为“以太”是一种充满整个宇宙的非物质介质,它是光波和其他电磁波传播的媒介。“以太”被认为是绝对静止的,提供了一个统一的参考框架,用于解释光速的恒定性和电磁现象。

“以太网”名称的由来
   罗伯特•梅特卡夫(Robert Metcalfe)在发明以太网时,选择了“Ethernet”这个名称,是因为他受到了物理学中“以太”概念的启发。在他的设想中,计算机可以通过一种类似“以太”的媒介相互通信,而这种媒介不是物理介质,而是一种能够在不同计算机之间传输数据的方法。
   尽管物理学中的以太理论后来被证明是错误的,但“以太网”这个名称却被保留了下来,并成为了计算机网络技术中的一个重要术语。

   在IP数据包的基础上,进一步包装,即前面拼接“以太网帧头”,后面拼接“以太网帧尾”,统称为“以太网数据帧”。

网络传输数据的基本单位,大概有这么几个:

  1. 数据包(packet)(IP 数据包)
  2. 数据报(Datagram)(UDP 数据报)
  3. 数据段(segment)(TCP 数据段)
  4. 数据帧(frame)(以太网数据帧)

这几个术语严格来说是有区别的,但是平时日常交流的时候,不会可以区分。

5. 上述得到的数据,需要进一步交给物理层(硬件设备),网卡就会针对上述的二进制数据,进行真正的传输操作,即将上述“二进制字符串”序列,转为光信号/电信号/电磁波......这些信号就会顺着网线/光纤进行传输。


   对于传输转发流程,这里暂时不过多讨论。

3.2 接收流程

1. 接收方物理层接收到光电信号后,将这样的光电信号还原成“二进制字符串”

2. 物理层将转换后的数据,交给数据链路层。以太网拿到这个数据包,就会对这个数据包进行解析:取出报头与载荷,根据报头的信息做一些处理(决定这个数据包要丢弃,还是转发,还是自己保留,进行向上解析,交给上层协议)。由于此处考虑的是接收方视角,接收方肯定要自己保留,就要将数据包的载荷交给上层协议,做进一步解析。

3. 网络层拿到了上述解析好的数据,网络层的IP协议也要对这个数据包进行解析:取出IP报头与载荷,也是根据报头信息进一步处理。由于此处考虑的是接收方视角,接收方肯定要自己保留,就要将数据包的载荷交给上层协议,做进一步解析。

4. 传输层这边(UDP协议)也要针对数据进行解析,取出UDP报头和载荷,解析报头,将载荷的内容进一步交给应用层协议(但不像数据链路层、物理层要考虑转发问题,传输层只需要考虑是否要丢弃的问题)要交给具体哪个应用程序,依赖于UDP报头中的“端口号”(用于区分不同的进程)

5. 最后数据就到了QQ这样的应用程序,QQ就要针对上述数据进行“反序列化”,针对数据进行进一步逻辑了,比如: 1)将收到的消息显示到界面上 2)播放“滴滴滴”的声音,提醒收到消息 3)显示弹窗,提示收到消息 4)更新未读消息列表 ......

   此处接收方做的工作(“分用”),就是发送方的“逆向工作”(“封装”)(发送方的“封装”,认为是“打包快递”;接收方的“分用”,认为是“拆快递”)


   由于两台主机,并不是直接通过一根网线直接相连。实际情况可能是两台主机之间要经过好多的路由器与交换机等设备,来完成转发过程,才能到达目标主机。数据包到达目的主机后,每层协议再剥掉相应的报头,根据报头中的“上层协议字段”,将数据交给对应的上层协议处理。

   中间过程的交换机和路由器也会涉及到“封装”和“分用”,但不会像主机那么复杂:

  1. 交换机封装分用到数据链路层,就可以决定数据是丢弃还是继续转发,不再往上继续分用(只是经典教科书上的交换机,真实的交换机还会有更多的功能,继续分用)。
  2. 路由器封装分用到网络层,就可以决定数据是丢弃还是转发,不再继续分用(也是经典教科书上的路由器)

网络设备所在分层:

  1. 1. 主机  : 物理层->数据链路层->网络层->传输层->应用层(五层)
  2. 2.路由器:物理层->数据链路层->网络层(下三层,三层转发)
  3. 3.交换机:物理层->数据链路层(下两层,二层转发)
  4. 4.集线器:物理层(最后一层)

问题:

封装分用这么麻烦,会不会导致交换机路由器主机,通信过程的效率很低呢?

   如果拿网络通信与人的反应时间去比,速度还是非常快的;如果拿网络通信和读写硬盘相比,通常认为网络的速度比读写硬盘的速度慢,更不必说和内存比了。但也有特殊情况,假如将网络中最强的“万兆网卡”(10000Mbps-->1GBps),与硬盘中最弱的机械硬盘比(300MBps-->400MBps),确实会更快,但是与固态硬盘比(能轻松几个GBps),更慢。


http://www.kler.cn/a/501177.html

相关文章:

  • Termora 一个开源的 SSH 跨平台客户端工具
  • poi处理多选框进行勾选操作下载word以及多word文件压缩
  • Elasticsearch学习(2) :DSL和RestClient实现搜索文档
  • 浅谈计算机网络01 | 计算机网络数据平面
  • MongoDB实践
  • 电脑提示directx错误导致玩不了游戏怎么办?dx出错的解决方法
  • 【Linux系列】`find / -name cacert.pem` 文件搜索
  • 16.C语言预处理指令详解:#define、#include、#ifdef 等高效用法
  • Java 常用符号和运算符总结
  • Java 数组与集合的深度解析与应用场景选择
  • 深度学习中常见的激活函数详解
  • html使用css外部类选择器
  • Elasticsearch:使用 Playground 与你的 PDF 聊天
  • 使用正则表达式读取文本数据【Python】
  • 【记录基于Python tkinter的音乐播放器的实现过程】
  • NS3学习——fifth基础上运行tcpVegas算法(附完整源码)
  • Qt天气预报系统获取天气数据
  • STM32: 输入捕获基本结构
  • 阿里云-Centos9-安装Docker-配置镜像拉取加速地址-开机自启
  • 【深度学习】Pytorch:加载自定义数据集
  • java导出pdf文件
  • idea系列---【idea中的Debug常用功能】
  • 【漫话机器学习系列】046.弹性网络(Elastic Net)
  • 《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(一)
  • 解读Linux Bridge中的东西流向与南北流向
  • MySQL教程之:常见查询示例