草庐IT

【JavaWeb】网络原理初识

real Wangyanbin 2023-04-05 原文

网络原理初识

计算机网络的历史

计算机最初是为了打仗而来的,为了计算弹道导弹的轨迹。
计算机网络也是由于打仗而来的。是因为在冷战背景下,核威慑中如何才能用拥有足够的威慑力呢?后来想到了一个办法,就是二次核打击能力,二次核打击能力就是:是指在己方核武器 基地 遭到敌方打击后,仍能保存足够的 核 力量对敌方实施有效的核反击。那就需要一种通讯网络不怕核打击,在被核打击之后,通过网络通信进行发起二次核打击命令。
在上述背景下互联网就应运而生了。互联网很冗余,两点之间的路径有很多条,核打击不能全部打断网络连接的话,只要有一条路径还通畅,通信就还可以继续。
在上个世纪80年代左右,计算机还处于萌芽阶段,有些学校/研究所,已经尝试把计算机进行相连,可以进行简单的网络通信了。
后来大家发现民用更加有利,就衍生出了很多的互联网公司和产品,构建了咱们今天丰富的互联网世界。

局域网和广域网

计算机之间的网络连接连接后来就发展成为了局域网和广域网。

  • 局域网:把一些设备,通过交换机和路由器连接在一起。局域网要求这些设备不能距离太远。(同一个学校,同一个网吧,同一个公司……)
  • 广域网:范围更大的局域网,把更多的局域网连接到一起,把一个城市的电脑连接起来,再把城市和城市之间的网络也连接起来,越来越多,越来越大,从此就成了广域网了。

网络组件中的重要设备

  • 集线器:把一根网线,岔出来两根(很古老的东西了)
  • 交换机:组件局域网(不能跨局域网)
  • 路由器:本质上就是把两个局域网连接起来.(wifi本质上就是个无线路由器)。

使用交换机(或者路由器)对这些设备进行彼此相连

使用路由器和交换机进行连接主机

当然现在带有路由器功能(三层转发)功能的交换机也越来越常见,交换机和路由器之间的界限也越来越模糊。

我么家用的光猫就属于路由器,是由电口(插网线的),也有光口的(插光纤的)
网络通信信号传递:

  1. 电信号(网线)
  2. 光信号(光纤,电磁波)

上述两种都可以进行传递信息

  • 对于电信号,可以使用 低电平表示 1,高电平表示 0
  • 对于光信号,可以使用 高光频表示 1,低光频表示 0

网络通信基础

基本概念

  • IP地址:标识了网络上设备所在的位置。
  • 端口号:标识了一个具体的应用程序
  • 协议: 就是通讯双方进行的一种约定,发送方约好了我发的数据是啥样的。接收方按照这个固定的格式来进行解析。
  • 五元组:源IP 源端口 目的IP 目的端口 协议类型

协议是网络通信最最核心的概念。约定商量好数据是啥样的格式进行传输的。有了这个约定,才能让双方互相理解对方的含义。一个协议,可以很简单,也可以很复杂,像咱们日常说话,使用的”普通话“,“闽越话”, “川渝话”,也是属于协议的。
一次网络通信中最基础的是五元组。就类比于发一个快递有寄件人地址,寄件人姓名,收件人地址,收件人姓名,快递公司

协议分层

网络通信是一个比较复杂的事情,需求场景复杂了,实现功能也比较复杂。
如果这个协议太复杂了,学习成本,使用成本,理解成本,维护成本都会非常高。因此实际采用的做法,是针对这个复杂的大协议,拆分成若干个相对简单的小协议。
随着把一些小的协议(每个协议负责一部分功能),此时就发现,某些协议之间,起到的功能和作用是类似的……
就针对这些小协议,再进行分类(分层),这就好比代码拆分出很多类,有的类功能相同,就可以放到同一个包中。
当前咱们要学习的网络协议就是在 分层 大背景下进行展开

协议分层类似于打电话时,定义不同的层次的协议:

在打电话时候,人只需要会打电话和说话就够了,不需要进行了解电话机协议和手机协议。在改变某一层协议的时候只需要改变该层协议对其他层协议没有影响。

协议其实有很多好处:

  1. 降低了学习和维护成本
  2. 灵活针对这里某一协议进行替换。
  3. 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。

OSI七层模型

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

TCP/IP 是 OSI 简化的实现方式。

  • 物理层:约定了网络通信中基础的硬件是张什么样子的。比如像通信使用的网线,网口等设备。因此,咱们使用网线网口都是相同发规格的。
  • 数据链路层:主要负责相邻的 两个结点 之间,具体是怎么进行传输的。
  • 网络层:负责任意两个结点之间的传输。主要负责规划路径,走那条路比较划算。
  • 传输层:只关心 起点 和 终点 ,这个过程,就是传输层做的工作,端到端 之间的传输。
  • 应用层:应用程序,描述了传输的数据,用户要怎么样来使用。

举个例子:
比如我要在淘宝上买件衣服,这个衣服要干什么,功能怎么样,用来自己穿,或者送人,又或者放在房间当饰品。这些都是应用层的职责。
买衣服要有收件人地址和收件人姓名,商家根据地址负责发快递,不关心传输的过程,只关心起点和终点。这些是传输层的职责。
买了衣服快递公司就要想从那条路径发,比如从 深圳 -> 石家庄,有很多路径选择:深圳 -> 武汉 -> 石家庄 ;深圳 -> 上海 -> 石家庄 …… 这个路线的选择就是网络层的职责。
比如选择了深圳 -> 上海 -> 石家庄,从深圳 -> 上海是飞机还是卡车?这个就是数据链路层的职责。
飞机飞行的航线,和卡车走的公路,就是物理层的职责了

越接近应用层就越接近用户,越接近物理层就越接近硬件设备

这五层协议各司其职,为什么还把这个叫做四层??

这个主要是因为物理层是属于纯硬件的,和程序员关系不大,所以有的资料就把TCP/IP模型中的物理层去掉了。

关于网络层和数据链路层的区别解析


节点:上述设备的统称 ,任何一个连入网络的交换机,路由器,电脑都可以称为”结点“。
相邻结点就是一根线连在一起的结点
网络层:考虑的是从电脑1 到电脑2 的路径规划
数据链路层:当数据到达目标电脑时,是通过网线传输,还是通过光纤传输,还是通过WiFi 无线传输……通过哪个网口出

  • 数据链路层和物理层是通过硬件和驱动程序来实现的。
  • 传输层和网络层是通过操作系统内核来进行操作的。(驱动程序和硬件设备是关联的。每个硬件厂商都会提供对应的驱动软件,操作系统内核通过驱动程序来控制硬件。)
  • 应用层是应用程序实现的(程序员自己写的代码相关的)。

所以咱们直接打交道的其实是应用层。下面四层,都是现成的。只需要知道怎么工作就行了。不需要你实现一个(但是经常涉及到,实现一个应用层协议……)。后面会继续重点解析的就是 应用层传输层

封装和分用

下面来解析一下网络传输的基本流程(站在分层的背景下来理解)
以qq为例,A给B发送一个 doge

发送方

  1. 应用层

用户在输入框中输入 doge ,qq这个应用程序,就把这个字符串,构造成了一个应用层数据报。
应用层数据报,具体的数据格式,咱们是不清楚的。每个应用程序都不一定一样,只有开发qq的这群程序员才知道。
一个假定的应用层协议的格式:
发送方qq;发送时间;接收方qq;消息内容

所谓的”应用层数据报“本质上就是一个遵守了约定格式的字符串。
程序要调用操作系统的API,把这个应用层数据,交给传输层

  1. 传输层

到了传输层就进入了操作系统内核,在传输层中,就要把上述应用层数据报,构造成传输层的数据报。传输层使用到的协议,最知名的就是 UDP 和 TCP。假设在此处用到的是UDP,就需要构造出UDP 数据报(在 应用层数据报 基础上,加个 UDP 报头)

为什么要加报头呢?类似于发快递要把物品套上包装(还不止一层)。一方面是防止物品脏了。另一方面也可以在包装上面贴标签,标签上可以写一些信息。这是快递传输中必要的内容。

报头是另一个特定格式的字符串(具体细节后面说–涉及到源端口和目的端口),此处就像所谓的字符串拼接一样,这个报头和后面的数据拼到一起。所谓的“报头”就是一个“标签”,通过标签表示出当前这个消息是怎样进行传输的。
传输层就把这这个 UDP 数据报 交给网络层

  1. 网络层

最知名是协议就是 IP协议,IP协议要基于上述数据,打包成一个 IP数据报。

IP报头也是相当于一个字符串,包含了一组信息(最核心的信息,源IP 和 目的IP)。
网络层数据报准备好,还需要进一步交给数据链路层

  1. 数据链路层

最知名的协议叫做 ”以太网“ 。基于上述数据报打包成一个”以太网数据帧报“

表示一个网络传输的数据的单位:
包(packet)
报(datagram)
帧(frame)
段(segment)
……
在此不做过多介绍

接下来这个数据继续向下传输,交给物理层。

  1. 物理层

把上述二进制的数据(一串 0101) 转化成 电信号 / 光信号,此时就真正的把数据给发送出去了。

上述过程,从应用层,到物理层,层层加码,这个过程称为”封装“(这个风封装不是面向对象的封装)

接收方

接收方的工作只考虑接收设备,省略中间经过各个结点的中间装啊过程。

  1. 物理层

网卡接收到的是 光信号 和 电信号。在物理层,把这个光电信号转化回二进制 数据,这个数据其实就是一个以太网数据帧。

  1. 数据链路层

把这个数据交给 数据链路层 解析。

数据链路层,需要去点帧头 帧尾,取出中间的载荷,交给上层的网络层。以太网数据帧的帧头里也会有记录,这个载荷是不是一个 IP数据报。

  1. 网络层

IP协议针对这里进行解析,解析出 IP 报头,取出 IP 协议的载荷,把这里得到的 传输层数据报 ,交给上层传输层

IP 报头里面会记录,载荷是 UDP 还是 TCP。

  1. 传输层

UDP 再进行解析,解析报头,取出载荷,再把这个载荷交给对方的应用程序。

UDP 报头里有一个重要的字段”目的端口“,目的端口是一个具体的应用程序,关联在一起的。因此就可以根据这个端口来把数据交给应用程序了。

  1. 应用层

就是qq应用程序。qq就会针对应用层协议也进行解析。显示到界面上。

上述,从下到上 层层解析,这个过程称为 ”分用“
对比快递就是:封装 – 包快递 。 分用 – 拆快递。

整个网路协议中,协议分成了很多层。上层协议要调用下层协议(下层协议把数据交给下层,继续封装)。下层协议要给上层协议提供支持(下层协议解析好数据,交给上层)。这里的几层协议之间是有明确的层级关系的。只有相邻的两层之间才能进行交互。(不能进行跨层交互)。上述的这些约束让通信过程变得简单,清晰起来了。

不能跨层交互 是 一个 让内容不混乱 的重要约束 。一个公司里面也有层级结构

如果基层员工可以直接能够向老板汇报工作,老板就忙不过来了。

三层转发和二层转发

  • 交换机在这里只是封装分用到数据链路层就可以完成后续转发(也叫做,二层转发)
  • 路由器在这里只封装分用到网络层,就能够完成后续的转发。

此处指的是”传统意义“ 的是一个路由器和交换机,也就是教科书里写的路由器和交换机。但是实际上,真实情况是不一样的。有些路由器/交换机是可以封装分用到应用层的。这些路由器/交换机网络设备都是运营商提供的。运营商有的时候要需要做些别的事情,就需要进行应用层级别的封装分用。
一个典型的例子:舆情分析。网民通过互联网传播一些言论,这个时候其实数据是啥时候发送到哪里的,通过运营商这样的设备都是可以检测到的。

有关【JavaWeb】网络原理初识的更多相关文章

  1. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  2. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  3. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  4. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

  5. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  6. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  7. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  8. 常见网络安全产品汇总(私信发送思维导图) - 2

    安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un

  9. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  10. ruby - 在 Ruby 中训练神经网络 - 2

    在神经网络方面,我完全是个初学者。我整天都在与ruby​​-fann和ai4r搏斗,不幸的是我没有任何东西可以展示,所以我想我会来到StackOverflow并询问这里的知识渊博的人。我有一组样本——每天都有一个数据点,但它们不符合我能够找出的任何明确模式(我尝试了几次回归)。不过,我认为看看是否有任何方法可以仅从日期预测future的数据会很好,而且我认为神经网络将是生成希望表达这种关系的函数的好方法.日期是DateTime对象,数据点是十进制数,例如7.68。我一直在将DateTime对象转换为float,然后除以10,000,000,000得到一个介于0和1之间的数字,我一直在将

随机推荐