【JAVAEE】网络原理之网络通信基础

news2024/11/15 11:35:19

目录

1. 💋IP地址

1.1 🍟IP地址的格式

1.2 🎁特殊IP地址

2. ✨端口号

2.1  🎃端口号的格式

3. 😘网络协议

3.1 🎨为什么需要网络协议?

3.2 💛网络协议的概念与组成

3.3 🍉知名协议的默认端口

3.4 🐷五元组

4. 🍳网络协议分层

4.1 🍭协议分层的好处

4.2 🎩网络协议的分层模型一——OSI七层网络协议

4.3 🏓网络协议的分层模型二——TCP/IP 五层网络协议

4.4 💪封装与分用


网络互连的目的是进行网络通信,也即是网络数据传输。(更多关于网络是如何互联的内容,请点开网络原理系列的网络原理之网络发展史)

1. IP地址

IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。

简单说,IP地址用于定位主机的网络地址,就像我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地。

1.1 IP地址的格式

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

通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如: 100.4.5.6。

1.2 特殊IP地址

127.* 的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。

本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。

IP地址解决了网络通信时,定位网络主机的问题,但是还存在一个问题,传输到目的主机后,由哪个进程来接收这个数据呢?这就需要端口号来标识。

2. 端口号

在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单说:端口号用于定位主机中的进程。类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货人(端口号)。

2.1  端口号的格式

端口号是 0 ~ 65535 范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。 注意事项两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号。 

注意事项:程序代码中,进行网络编程时,需要绑定端口号(收发数据的端口)来发送、接收数据。进程绑定一个端口号后,fork一个子进程,可以实现多个进程绑定一个端口号,但不同的进程不能绑定同一个端口号。

PS:一个进程A启动之后,调用了fork函数,其作用是创建一个几乎与A一样的新进程,而这个新进程就是A的子进程,而A是这个新进程的夫进程,此时两个进程的端口号一样。

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

3. 网络协议

3.1 为什么需要网络协议?

众多计算机生产厂商,生产了各种各样的计算机和手机。这些设备操作系统还不一定都一样,比如Microsoft Windows、Android、IOS、Linux、HUAWEI Harmony OS等等;这些设备的硬件设备也不一样。这时候问题就来了,如何让这些不同厂商生产的计算机能够互相通信呢?这就需要制定统一的标准,方便大家一起遵守,好互相通信。而这个标准就是网络协议。

3.2 网络协议的概念与组成

网络传输的本质是通过网线或者光纤或者无线这些电信号或光信号来进行传输的。比如网线,传输一系列高电平和低电平,就可以使用高电平和低电平来分别表示二进制中的 1 和 0 。而对于光纤来说,传输的是光信号,不同的波长产生不同频率的光,利用不同频率的光来表示 1 和 0 。既然传输的数据都是 1 和 0 ,那这些到底表示了什么意思呢?这就需要发送方和接收方事先约定好每一组 1 和 0 都是什么意思。而这种约定就是协议。

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

网络协议通常由三要素组成:

1. 语法:即数据与控制信息的结构或格式以及编码;就像各个国家说各个国家的语言,只有说相同语言的人,才能彼此进行沟通。

2. 语义:即需要发出何种控制信息,完成何种动作以及做出何种响应; 语义主要用来说明通信双方应当怎么做。用于协调与差错处理的控制信息。 类似打电话时,说话的内容。一方道:你瞅啥?另一方就得有对应的响应:瞅你咋的!

3. 时序,即事件实现顺序的详细说明。 时序定义了何时进行通信,先讲什么,后讲什么,讲话的速度等。比如是采用同步传输还是异步传输。 女生和男生的通话,总是由男生主动发起通话,而总是在男生恋恋不舍的时候,由女生要求结束通话。

协议最终体现为网络上传输的数据包的格式。

3.3 知名协议的默认端口

系统端口号范围为 0 ~ 65535,其中:0 ~ 1023 为知名端口号,这些端口预留给服务端程序绑定广泛使用的应用层协议,如:

22端口:预留给SSH服务器绑定SSH协议

21端口:预留给FTP服务器绑定FTP协议

23端口:预留给Telnet服务器绑定Telnet协议

80端口:预留给HTTP服务器绑定HTTP协议

443端口:预留给HTTPS服务器绑定HTTPS协议

需要补充的是: 以上只是说明 0 ~ 1023 范围的知名端口号用于绑定知名协议,但某个服务器也可以使用其他 1024 ~ 65535 范围内的端口来绑定知名协议,就好比餐厅的VIP包房是给会员使用,但会员也可以不坐包房,坐其他普通座位。

3.4 五元组

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

1. 源IP:标识源主机

2. 源端口号:标识源主机中该次通信发送数据的进程

3. 目的IP:标识目的主机

4. 目的端口号:标识目的主机中该次通信接收数据的进程

5. 协议号:标识发送进程和接收进程双方约定的数据格式

 五元组在在网络通信中的作用,类似于发送快递:

4. 网络协议分层

实现整个网络通信需要的协议其实是非常复杂的,这就需要人们将复杂协议拆分成多个协议。对这些多个“小的”协议进行分类的同时,对其进行分层。

4.1 协议分层的好处

网络协议到底是怎么样进行分层的呢?——分层其实就是定义好两层间的接口规范,让双方遵循这个规范来对接。在代码中,类似于定义好一个接口,一方为接口的实现类(发送方,提供服务),一方为接口的使用类 (接收方,使用服务)。

那这样的分层有什么好处呢?

1.对于接收方来说,并不关心发送方是如何实现的,只需要使用接口即可;对于发送发来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。

2. 方便对某一层的协议进行替换。

综上,分层之后,层次间的耦合程度降低,方便后续的扩展与维护。

4.2 网络协议的分层模型一——OSI七层网络协议

OSI:Open System Interconnection,开放系统互连

OSI 七层网络模型是一个逻辑上的定义和规范:把网络从逻辑上分为了7层,从下到上依次为:

物理层 -> 数据链路层 -> 网络层 -> 传输层 -> 会话层 -> 表示层 -> 应用层。

OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输; 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通 过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。

OSI 七层模型既复杂又不实用,只存在于教科书中。 实际组建网络时,只是以 OSI 七层模型设计中的部分分层,也即是以下 TCP/IP 五层(或四层)模型来实现。

4.3 网络协议的分层模型二——TCP/IP 五层网络协议

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

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

应用层:聚焦在传输过来的数据内容,关注数据的用途,负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。

传输层:不考虑这两个遥远节点中间的路径如何,只关注起点和终点节点,负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。

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

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

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

 程序员进行网络编程主要针对的是应用层,其他的四层操作系统内部已经封装好。

物理层我们考虑的比较少。因此很多时候也可以称为 TCP/IP四层模型。

4.4 封装与分用

在网络协议分层的背景下,数据到底是如何网络传输的呢?

回答这个问题,就需要了解以下两个概念:封装与分用。

封装:发送方发送数据,要把数据从上到下,依次交给对应层的协议进行封装。

分用:接收方接收数据,要把数据从下到上,依次交给对应层的协议进行分用。

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

以一方发送一条微信消息到另一方为例子(只是一个简单的例子而已,真实情况并非如此):

发送发:

1. 应用层:

在编辑框输入信息”( ๑ ᴖ ᴈ ᴖ)ᴖ ᴑ ᴖ๑)“,点击发送之后,微信应用程序拿到了上述数据,并将其封装成应用程序数据包

 上述应用程序数据包本质上是字符串的拼接,如:123456;654321;2023-04-23 15:51:00;( ๑ ᴖ ᴈ ᴖ)ᴖ ᴑ ᴖ๑),为了分割上述字段,会利用分割符或是长度信息,真实情况可能更为复杂。

2. 传输层:

应用层调用传输层提供的API(Application Programming Interface),于是传输层拿到了这个数据包。传输层里有许多协议,其中最典型的就是 TCP 与 UDP ,下面以 UDP 为例。UDP会针对上述数据包进行封装,即在这个数据包加上数据头部,两者共同组成一个 UDP 数据报。

 传输层协议,最关键的属性就是源端口与目的端口了。

3. 网络层:

网络层利用 IP协议(网络层不仅只有这么一个协议,还有其他的协议)对 UDP 数据报进行封装,再加上一个抱头,两者构成一个 IP 数据报。

 上述的源 IP 地址与目的 IP 地址描述了此次传输中的起点与终点。

4. 数据链路层:

这一层中,最典型的协议叫以太网

 mac 地址,也叫物理地址,描述一个主机在网络上的位置,与网卡绑定,每张网卡都有自己唯一的 mac 地址。它的用途与 IP 地址非常类似,但是人们将这两种地址用作不同用途,IP 地址是网络层用来路径规划的,而 mac 地址是数据链路层记录两个即将进行数据传输的数据节点地址的。

5. 物理层:

物理层将上述的以太网帧转换成二进制,再转换成光信号或电信号或者电磁波信号传输出去。

接收方:

接收过程跟上述的发送过程正好相反,接收是从下到上,依次分用,去掉报头,这里简单叙述一下:

1. 物理层,网卡接收到了电信号或是光信号或是电磁波信号,并将这些信号转换成二进制序列,最后把这些二进制序列当成是以太网数据帧传给了数据链路层去处理。

2. 数据链路层,将帧头、帧尾去掉,再上交给网络层。这是因为在帧头中会存储其上层是什么类型以及其使用的协议的相关信息。

后面依次分用,便不再赘述。一直到接收者的应用层,他的微信应用程序会解析应用数据包,取出一开始放入的字段( ๑ ᴖ ᴈ ᴖ)ᴖ ᴑ ᴖ๑),放入程序的界面中。

在真实的网络环境中,数据的传输可能要经过很多节点的转发:

 交换机会进行分用,从物理层到数据链路层。交换机会对这个数据进行重新封装,修改源 mac 与目的 mac 的值,从数据链路层到物理层,再把数据进行转发。

而路由器会把接收的数据从物理层分用到网络层,根据当前得到的目的 IP 进行下一阶段的寻路操作(IP 协议在一边传输的过程中,一边规划路径)。之后路由器又重新对数据包进行封装,从网络层到物理层,经过数据链路层的时候,也会调整 mac 的地址。

只有到达目的主机时,目的主机才会对数据包完成从物理层到应用层的分用过程。

上述过程便是一次完整的网络通讯过程。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

答题积分小程序云开发实战-界面交互篇:首页页面布局样式与逻辑交互开发

微信小程序云开发实战-答题积分赛小程序 界面交互篇:首页页面布局样式与逻辑交互开发 首页效果图 布局思路 5行布局,即5个块级元素,轮播图、通告栏、个人信息、功能区、版权。

将服务器select模型设置为非阻塞,处理更多业务

timeval结构体在头文件为sys/time.h中,定义如下: struct timeval {long tv_sec; /* seconds */long tv_usec; /* and microseconds */ }; 其中tv_sec是秒,tv_usec是微秒(microsecond )&#xff0…

[单片机框架][bsp层][cx32l003][bsp_tim] Baes TIM 基础定时器配置和使用

文章目录 一、基础定时器介绍二、功能描述(1) Buzzer 功能 三、示例代码(PWM) 一、基础定时器介绍 基础定时器 Base Timer 包含两个定时器 TIM10/11。TIM10/11 功能完全相同。TIM10/11 是同步定时/计数器,可以作为 16/32 位自动重装载功能的定时/计数器&#xff0c…

VS2022配置GDAL

GDAL(Geospatial Data Abstraction Library)是一个用于处理地理空间数据的开源库。它提供了一组功能丰富的API,用于读取、写入、转换和处理各种地理空间数据格式,包括栅格数据(如卫星图像、数字高程模型)和…

Jupyter创建Anaconda多个虚拟环境教程

这里写目录标题 1.1界面化创建虚拟环境1.2命令行创建虚拟环境2.查看是否创建成功3.激活虚拟环境pylessonppt4.更改工作目录5.删除6.查看是否删除成功 1.1界面化创建虚拟环境 1.2命令行创建虚拟环境 conda create -n myenv——name pythonx.xmyenv-name:自己定义的环境名称 pyt…

fastjson反序列化漏洞复现

fastjson反序列化漏洞复现 一.影响版本: Fastjson<1.2.24二.实验过程图三.实验步骤四&#xff0c;实验结果以及参考链接 一.影响版本: Fastjson<1.2.24 二.实验过程图 (踩坑) rmijndi环境&#xff1a;java.sql.SQLException: JdbcRowSet (连接) JNDI 无法连接 2、ldapjn…

上海无纺布制造商【盈兹】申请纳斯达克IPO上市,募资1100万美元

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;来自上海的无纺布制造商【盈兹】&#xff0c;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff08;ETZ&#…

Invalid bound statement (not found)的原因以及解决方法

相信我们在学习Mybatis的时候都出现过 Invalid bound statement (not found) 这个错误&#xff0c;一般由以下几种可能导致这个错误 一&#xff1a;mapper方法名 和 mapper.xml id名不对应 例如&#xff1a; mapper&#xff1a; 对应的mapper.xml 这里建议小伙伴们下载一个插…

Linux中的YUM源仓库和NFS文件共享服务

这里写目录标题 一 、YUM仓库源的介绍和相关信息1.1yum相关介绍1.2 Linux系统各家厂商用的安装源1.3 yum下载方式 二 、 yum 仓库源的三种搭建2.1yum 配置本地源2.2创建ftp源2.3 配置http源2.4 配置yum在线源 三 、NFS的简介3.1 什么是NFS3.2 linux中要使用NFS需要下载的软件包…

User Diverse Preference Modeling by Multimodal Attentive Metric Learning

BACKGROUND 现有模型通常采用一个固定向量去表示用户偏好&#xff0c;在假设——特征向量每一个维度都代表了用户的一种特性或者一个方面&#xff0c;这种方式似乎不妥&#xff0c;因为用户对于不同物品的偏好是不一样的&#xff0c;例如因演员喜欢一部电影&#xff0c;而因特…

C++中的vector容器

文章目录 vector的介绍vector的使用vector的定义vector初始化vector iterator的使用vector空间增长问题vector增删改查vector迭代器失效问题 vector的介绍 vector是封装动态数组的顺序容器。   就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。这也就意味着我…

Java核心技术 卷1-总结-15

自己实现的hashCode方法应该与equals方法兼容 Java核心技术 卷1-总结-15 视图与包装器子范围不可修改的视图同步视图受查视图 并发线程状态新创建线程可运行线程被阻塞线程和等待线程被终止的线程 视图与包装器 子范围 可以为很多集合建立子范围&#xff08;subrange&#x…

机器学习——朴素贝叶斯

目录 一、贝叶斯 1.什么是贝叶斯 3.贝叶斯下的朴素贝叶斯 二、朴素贝叶斯 1.高斯朴素贝叶斯 2.伯努利朴素贝叶斯 3.多项式朴素贝叶斯 前言 在所有的机器学习分类算法中&#xff0c;朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法&#xff0c;比如决策…

【业务数据分析】—— 用户留存分析(以挖掘Aha时刻为例)

目录 一、用户留存是什么 二、为什么要考虑用户留存 1、为什么要考虑用户留存&#xff1f; 2、影响用户留存的可能因素 3、用户留存的3个阶段 三、怎么进行用户留存分析(挖掘Aha时刻) 1、Aha时刻 2、Aha时刻的作用 3、挖掘Aha时刻 一、用户留存是什么 在互联网行业中…

Three——二、加强对三维空间的认识

Three——二、加强对三维空间的认识 接上个例子我们接着往下看 辅助观察坐标系 THREE.AxesHelper()的参数表示坐标系坐标轴线段尺寸大小&#xff0c;你可以根据需要改变尺寸。 使用方法&#xff1a; // AxesHelper&#xff1a;辅助观察的坐标系 const axesHelper new THRE…

Jetson nano B01学习笔记 -- 系统环境配置以及ROS安装

文章目录 一、Jetson nano 简介二、 系统环境配置1、系统镜像烧录2、CUDA环境配置 三、 ROS安装和环境配置总结 一、Jetson nano 简介 Jetson Nano是一款体积小巧、功能强大的人工智能嵌入式开发板&#xff0c;于2019年3月由英伟达推出。它预装Ubuntu 18.04LTS系统&#xff0c;…

有什么好用的远程工具吗

沟通在任何类型的工作中都扮演着重要的角色。但当谈到远程工作时&#xff0c;这一点就更为重要。因此&#xff0c;您的组织必须找到可以让您的团队保持一致的工具。 在某些方面&#xff0c;项目管理扮演着类似的角色。 您会注意到&#xff0c;下面的大多数工具都会直接影响您的…

Android进阶宝典—Koin使用和原理分析

一、理解设计模式 控制反转 是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。 实现控制反转最常见的方式叫做依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;&#xff0c;依赖注入(Dependency Injection)和控制反…

提高硬件设计能力的学习路线

不懂硬件的人&#xff0c;会觉得硬件高深莫测&#xff0c;“为什么他改几个电阻、电容就调出来&#xff0c;我弄个半天没搞定&#xff1f;”&#xff0c;“噢&#xff0c;靠的是经验”&#xff0c;但是经验又是什么呢&#xff1f;不能形容&#xff0c;反正就是不明觉厉。 就是…

Git(版本控制:前端git使用全流程)

1.版本控制&#xff08;简单理解&#xff1a;就是软件对每次操作之后提交的记录&#xff09; 文件版本 版本控制软件 版本控制的好处 版本控制的分类 本地版本控制系统 集中化版本控制系统 分布式版本控制系统 2. Git基础概念与工作流程 什么是Git&#xff1f; 开源的…