前言:
大家好,我是良辰丫,今天我们一起来学习网络原理,了解一些网络的基本知识以及面试题.💞💞💞
🧑个人主页:良辰针不戳
📖所属专栏:javaEE初阶
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。
目录
所谓
独立模式,就是计算机之间相互独立,也就是单机模式.
- 每台计算机拥有自己的资源.
- 资源不能远程共享.
独立模式的局限性太大了,随着时代的发展,人们的思维也不再只局限于单机模式,而是将一个个的计算机连在一起,形成一个计算机网络.
- 多台计算机可以实现资源共享.
- 可以远程共享资源.
数据共享本质是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。根据网络互连的规模不同,可以划分为局域网和广域网。
局域网是本地,局部组建的一种私有网络。- 局域网内的主机之间能方便的进行网络通信,又称为内网。
- 局域网和局域网之间在没有连接的情况下,是无法通信的。
局域网有很多组建网络的方式
- 网线直连.
- 集线器组建.
- 交换机组建.
- 交换机和集线器组建.
通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了
广域网,广域网内部的局域网都属于其子网。

其实局域网和广域网是一个相对的概念,广域网也可以看做是一个比较大的局域网.
- 网络互连的目的是进行网络通信,也即是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据。
- 那么,在组建的网络中,如何判断到底是从哪台主机,将数据传输到那台主机呢?这就需要使用IP地址来标识(也就是原地址找目的地址)。
IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说,IP地址用于定位主机的网络地址。我们给某个主机发送信息就需要知道目的主机的IP,就像我们寄快递需要提前知道快递的收货地址.
IP的表示方法: IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节),通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数),例如168.10.20.30.
本机环路IP: 这是一种特殊的IP,主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。当客户端和服务器都在一个主机上的时候,我们为了测试,可以用环路IP,我们通常用的环路IP地址为127.0.0.1
- 网络通信时信息传到了你的主机上,但是这是和你主机上的哪个程序进行通信呢?我们不得而知,于是乎,引进了端口,端口号可以具体定位到主机上的某个程序.快递到达了你们的城市,但是还需要具体的门牌地址,才能送货上门.微信发消息不能客串到QQ上吧.
- 咱们之前学过数据库的JDBC编程,其中有个3306就是MySQL的端口号.
那么
端口号是什么呢?
- 在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单说:
端口号用于定位主机中的进程。- 端口号是0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
注意:
两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号(了解)。
- 一个进程启动后,系统会随机分配一个端口(启动端口)程序代码中,进行网络编程时,需要绑定端口号(收发数据的端口)来发送、接收数据.
- 进程绑定一个端口号后,fork一个子进程,可以实现多个进程绑定一个端口号,但不同的进程不能
绑定同一个端口号.
其实,
协议就是一种约定,发送方约定了自己要发送怎样格式的信息,比如文本或者图片等,接收方也得用这个格式进行接收,这样才能进行通信.协议最终体现为在网络上传输的数据包的格式.
- 网络传输本质上都是通过网线/光纤/无线电信号或者光信号来进行传输.
- 其中网线传输的是一系列的高电平和低电平(用1和0表示).
- 光纤传输的是光信号,光表示波长和频率,不同的频率来表示1和0.
- 会有一个约定记录一连串的1和0表示什么.(协议)
- 语法:即数据与控制信息的结构或格式.例如是文本文件还是图片文件.
- 语义:即需要发出何种控制信息,完成何种动作以及做出何种响应.
- 时序,即事件实现顺序的详细说明.时序定义了何时进行通信,先讲什么,后讲什么,讲话的速度等,比如是采用同步传输还是异步传输.
- 源IP:标识源主机.
- 源端口号:标识源主机中该次通信发送数据的进程.
- 目的IP:标识目的主机.
- 目的端口号:标识目的主机中该次通信接收数据的进程.
- 协议号:标识发送进程和接收进程双方约定的数据结构.
在网络通信中,许多协议是非常复杂的,于是乎,我们就需要把复杂的协议拆分成一些小的协议,可以针对这些小的协议进行分层,这相当于约定了层级与层级的调用关系.这就要求上层协议调用下层协议,下层协议给上层协议提供服务,不能跨层调用.
- 层次之间耦合度比较低,上层协议不必了解下层协议的细节,下层也不必了解上层的细节.这就相当于我们打电话,我们只在乎电话是否能打通,并不关心电话的工作原理.
- 方便对某一层协议进行替换,能促进标准化工作,因为每一层的功能及其所提供的服务都已有了精确的说明,标准化的好处就是可以随意替换其中的某一层,对于使用和科研来说十分方便。
- 易于实现和维护.
教科书上经常看到OSI七层网络协议,但是我们经常见到是TCP/IP五层网络模型,这是最广泛使用的.
OSI七层网络模型图

我们主要关注OSI五层网络模型,有的资料没有物理层,可能叫做四层网络模型.

- 应用层:关注传输过来的数据的用途.
- 传输层:不考虑中间路径,只关注起点和终点.
- 网络层:负责两个遥远的节点之间的路径规划.
- 数据链路层:关注的是两个相邻节点之间的传输.
- 物理层:网络通信的基础措施,网线,光纤,网络接口等.
咱们程序员主要关注应用层,实现某个软件的功能是什么.
协议分层的情况下,数据如何进行网络传输?
- 发送方发送数据,要把数据从上到下,依次交给对应的层次上的协议进行封装.
- 接收方收到数据,要把数据从下到上,依次交给对应的层次的协议进行解析.
发送方:你好
应用层(QQ程序)拿到上面用户信息,封装成数据包,本质就是字符串拼接,下面是我简化的数据包封装图.
| 发送方QQ号 | 接收方QQ号 | 时间与日期 | 消息内容(你好) |
|---|
应用层要调用传输层提供的api来处理这个数据.传输层有许多协议,其中最常见的就是TCP和UDP.
这里以UDP举例.
UDP针对上述数据包再进行封装,一个典型的数据包都是通过报头+载荷构成的,下面的豆蔻信息就是报头,后面的部分就是载荷.
| 源端口(发送方程序端口号) 目的端口(接收程序端口号) | 发送方QQ号 | 接收方QQ号 | 时间日期 | 内容(你好) |
|---|
上述就是UDP协议再给应用层数据包加了一个UDP报头,目的就是为了再贴一层标贴,在标签上可以添加一些属性(源端口和目的端口),在传输层协议中,源端口和目的端口非常重要.
UDP封装好数据包后,接下来就要交给网络层,网络层最常见的协议就是IP协议,IP协议还要继续封装数据包,添加上IP协议包头.
| 源IP 目的IP | 源端口(发送方程序端口号) 目的端口(接收程序端口号) | 发送方QQ号 | 接收方QQ号 | 时间日期 | 内容(你好) |
|---|
源IP和目的IP描述了这次数据传输,起点和终点.
这里最典型的协议是以太网协议(数据链路层与物理层的协议)
- 以太网是最常见的数据链路层的网络.
- 使用网线上网的时候就是在用以太网(以太网线).
- 以太网数据帧的帧头是用mac地址进行描述的.
我们还需要再IP数据包前面加上mac地址(源mac地址和目的mac地址).
- mac地址也叫物理地址,也是用来描述一个主机在网络上的位置.
- mac地址和IP地址很相似,但是有很大的不同.IP地址是进行网络层的路径规划,而mac地址是进行描述数据链路层,两个即将进行传输的相邻节点.
- mac地址和网卡进行绑定的,全世界的网卡,每个设备都有一个唯一的mac地址.
数据链路层就会把上述的以太网数据帧交给物理层,物理层要把上述的01二进制转换成光信号/电信号/电磁波信号进行传输.
接收数据包的过程与发送数据包的过程整合相反,在这里我就不做描述了.
真实的网络环境中,应用层封装到物理层会有很多复杂的过程.
- 交换机会进行分用,从物理层分用到数据链路层,判断当前这个数据包的目的IP对不对.
- 交换机会针对这个数据重新封装,从数据链路层封装到物理层,把数据继续转发.
- 物理层收到数据,会从物理层分用到网络层,根据当前得到的目的IP进行下一阶段的寻路操作(IP协议是在一边传输的过程中,一边规划路径)
- 把数据包重新封装,从网络层封装到物理层,此时经过数据链路层的时候也会调整mac地址
- 直到到达目标主机,才会完成从物理层分用到应用层这个过程.
- 每次消息的传输都会涉及到封装分用.
- 重新封装的时候源mac和目的mac就变了.
- 中间的交换机只需要封装分用到数据链路层(只需要改变源mac和目的mac)
- 中间的路由器,需要封装分用到网络层(需要改变mac,同时也需要根据目的ip进行下一阶段的路径规划)
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层.
- 对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层.
- 对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层.
- 对于集线器,它只实现了物理层.
- 发送方发送数据,要把数据从上到下,依次交给对应的层次的协议,进行
封装

- 接收方收到数据,要把数据从下到上,依次交给对应的层次的协议,进行解析(分用)

后序:
看到这里想必大家已经入门网络原理知识了,希望小小的文章可以帮到大家,我们下一篇文章再见.
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~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} 最佳答案
我在这方面尝试了很多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
尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify
深度学习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
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据