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

[JavaEE] 网络初识(网络通信 及 TCP / UDP / IP 封装分用 )

Author:MTingle
major:人工智能

---------------------------------------

Build your hopes like a tower!

文章目录

目录

文章目录

一. 网络通信基础

1. 局域网LAN 

2. ⼴域⽹WAN

3. IP地址

4. 端口号

二.协议

1. 五元组

2. 协议分层

协议分层的优点:

3. OSI七层协议:

4. TCP / IP 协议

⽹络设备所在分层

三.封装和分用

1. 封装

2.分用

3. 路由器和交换机的封装分用



一. 网络通信基础

1. 局域网LAN 

局域⽹,即 LocalAreaNetwork ,简称 LAN 。 Local 即标识了局域⽹是本地,局部组建的⼀种私有⽹络。 局域⽹内的主机之间能⽅便的进⾏⽹络通信,⼜称为内⽹;局域⽹和局域⽹之间在没有连接的情况下,是⽆法通信的。

2. ⼴域⽹WAN

⼴域⽹,即 WideAreaNetwork ,简称 WAN 。 通过路由器,将多个局域⽹连接起来,在物理上组成很⼤范围的⽹络,就形成了⼴域⽹。⼴域⽹内部 的局域⽹都属于其⼦⽹。

3. IP地址

概念:IP地址⽤于定位主机的⽹络地址,就像我们发送快递⼀样,需要知道对⽅的收货地址,快递员才能将包裹送到⽬的地。(设备在网络上的位置)

格式:IP地址是⼀个32位的⼆进制数,通常被分割为4个“8位⼆进制数”(也就是4个字节),如: 01100100.00000100.00000101.00000110。 通常⽤“点分⼗进制”的⽅式来表⽰,即a.b.c.d的形式(a,b,c,d都是0~255之间的⼗进制整数)。 如:100.4.5.6。

4. 端口号

概念:端⼝号⽤于定位主机中的进程。类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货⼈(端⼝号)。有了IP可以确定主机,但是一个主机有多个程序在使用网络,这个时候就需要区分出主机收到的网络数据需要交给哪个程序

格式:端⼝号是0~65535范围的数字,在⽹络通信中,进程可以通过绑定⼀个端⼝号,来发送及接收⽹络数据。

二.协议

概念:协议,就是一种通信过程中的约定,发送方和接收方都提前商量好数据的格式,才能确保两者之间能够正确地进行沟通,确保不同厂商之间生产出的设备能够相互配合

1. 五元组

在TCP/IP协议中,⽤五元组来标识⼀个⽹络通信:

1. 源IP:标识源主机

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

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

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

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

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

2. 协议分层

网络通信过程中,需要涉及到的细节很多,如果单纯用一个协议来完成网络通信,就需要约定要方方面面的内容,就会导致协议非常复杂,所以我们就要将协议拆分,拆分成一个个功能更单一,"小而美"的协议,拆分出来的协议多了,于是就引入了协议分层

网络通信协议拆分的多了之后也是分层了许多层,把功能相似的协议放到同一层之中,上层协议会调用下层协议的功能,下层协议给上层协议提供服务,只有相邻的层次之间可以进行沟通,不能跨层次调用

协议分层的优点:

1). 上层协议直接调用下层协议即可,不需要了解下层协议的细节,相当于下层协议直接被封装好了

2). 某一层协议被替换后,对于其他层协议没有影响

当前网络现状,有很多协议都是按照分层来组织的.

3. OSI七层协议:

7 应用层

6 表示层

5 会话层

4 传输层

3 网络层

2 数据链路层

1 物理层

最初设计的时候给出的方案,但是由于过于麻烦,后续被简化成了五层: => TCP / IP 协议

4. TCP / IP 协议

应用层: 程序拿到数据之后,要用来干啥,解决什么问题

传输层:负责关注 网络数据包 的 起点和终点 (从哪儿来到哪儿去) 端到端之间的传输 比如确定起点 西安到上海

网络层: 负责关注 起点和终点 之间,要走那一条路 (路径规划) 比如确定路线:西安 -> 南京 -> 上海

数据链路层:负责两个相邻节点直接的传输 无锡到西安 (火车运输)  南京到上海 (飞机空运) 

物理层: 通信过程中的基础设施. 例如: 公路,铁路,航线

⽹络设备所在分层

• 对于⼀台主机, 它的操作系统内核实现了从传输层到物理层的内容也即是TCP/IP五层模型的下四层;

• 对于⼀台路由器, 它实现了从⽹络层到物理层,也即是TCP/IP五层模型的下三层;(工作在网络层)

• 对于⼀台交换, 它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;(工作在数据链路层)

• 对于集线器,它只实现了物理层;

事实上 真实世界中的交换机/路由器要更复杂,功能更强大很多交换机,也具有一些路由器的功能,也能工作在网络层很多路由器,也具备一些交换机的功能,也能工作在数据链路层.

三.封装和分用

1. 封装

1. 应用层(应用程序)

此处用 QQ 举例:

QQ从消息输入框中获取到用户输入的 hello ,就要把这个字符串构造成一个应用层数据包,QQ这样的程序内部就设置了一个应用层协议,应用层数据包就是按照这个应用层协议约定的格式来构造的.

应用程序就会调用操作系统提供的 api ,把这个数据包交给传输层.

2. 传输层: TCP 和 UDP 协议

传输层就会把上述的数据作为一个整体,再构造成一个传输层的数据包,传输层涉及到的协议,最主要的就是 TCP 和 UDP 协议,此处假定使用 UDP 来进行通信,就会构造出一个 UDP 数据包

形如上述添加报头的过程就是封装,本质上字符串的拼接,只不过拼的报头,具有一定的结构

拼好的传输层数据包会被进一步交给下层(网络层),网络层继续封装 (交给下层指的是,下层协议提供一组 api ,上层调用这个 api 并且把刚刚构造好的参数传下去,下层协议就可以处理这个数据了)

3. 网络层: IP协议

网络层 IP 协议,把刚才得传输层的 UDP 数据包作为一个整体,再拼上 IP 协议的报头,构成一个 IP 数据包

这里构造成完整的 IP 数据包之后, IP 协议继续调用数据链路层的 api ,把数据交给数据链路层,数据链路层的协议继续对数据包进行处理

4.数据链路层: 以太网

数据链路层的核心协议是,以太网,此处的"以太"二字用于表述 网络数据传输的介质 ,以太网就是我们日常最常见到的 有线网络 ,日常用的网线称作 "以太网线" ,日常用到的网口叫做 "以太网口", 以太网数据帧 也是以 IP 数据包作为一个整体,在这个基础上添加帧头和帧尾.

这样的数据再往下交给物理层

5.物理层: 硬件设备

物理层把上述这样的以太网数据帧(二进制结构)转换成 光信号 / 电信号 / 电磁波

经过上述的一系列操作,数据终于从电脑上发出去了!!!

2.分用

我们暂时不考虑中间过程,假定数据包已经到达了 B 网卡,看一下 B 网卡会如何处理数据包,这个处理过程就叫做 "分用"

1. 物理层

B的物理层收到了 光信号 / 电信号 / 电磁波 ,就会把这些物理信号转换成数字信号(二进制的0/1),得到一个以太网数据帧,再进一步把这个数据帧交给数据链路层

2.数据链路层: 以太网

按照以太网数据帧的格式来解析,去除其中的载荷交给上层协议

3.网络层: IP协议

按照 IP 协议的格式进行解析,去除其中的载荷,再交给上层协议

4. 传输层: TCP / UDP 协议

按照 UDP 协议格式来解析,去除其中的载荷,再交给上层协议

5.应用层: QQ 应用程序

按照 QQ 应用程序内部的应用层协议格式来解析数据,QQ程序拿到这个数据后,就会在窗口给你弹出提示,消息就被显示到聊天框上

分用的过程,就是封装的逆过程

3. 路由器和交换机的封装分用

真实情况下,两个主机不太会直接通过网线直连的,而是通过一系列的交换机和路由器进行数据转发的.但是上述的封装分用过程同样适用.

如果是交换机,交换机就会把上述的光电信号转换成以太网数据帧数据,交给数据链路层,交换机的数据链路层就会对上述数据进行解析,这个解析过程,一方面要去除载荷部分,另一方面,就要解析帧头的关键信息,根据帧头的信息,决定下一步把数据往哪里发送,根据这个情况再进一步构造出新的以太网数据帧(交换机工作在数据链路层)

再把这个数据通过 物理层 发送出去

如果是路由器,情况会稍微复杂,此时就是封装分用到网络层

物理层先拿到光电信号,转换成二进制数据交给数据链路层,数据链路层再对数据进行解析,拿到载荷,交给网络层( IP 协议), IP 协议会对上述数据进一步解析,去除载荷(也会解析此处的报头),拿出数据后, IP 协议会进行重新封装,再交给数据链路层,数据链路层给数据加上新的帧头和帧尾,这个数据再交给物理层,转换成光电信号,继续传输



http://www.kler.cn/news/315863.html

相关文章:

  • 强大的重命名工具 | Bulk Rename Utility v4.0 便携版
  • 【Linux】入门【更详细,带实操】
  • flask + vue
  • CCF CSP题解:字符串变换(str)(202409-2)
  • 多态对象的内存结构
  • [Python学习日记-27] 文件操作练习题解析
  • Java的IO流(二)
  • 基于STM32残疾人辅助行走系统
  • Kotlin 基本介绍(二)
  • macos pyenv 安装python tk 、tkinter图形库方法步骤和使用总结
  • jQuery Mobile 方向改变事件
  • 01 基础request
  • Python进阶学习笔记(一)对象
  • vue的基本原理
  • linux下共享内存的3种使用方式
  • 串的存储实现方法(与链表相关)
  • centos7 源码编译安装faiss
  • 3、论文阅读:EnYOLO:一种基于图像增强的水下目标区域自适应实时检测框架
  • 【Unity设计模式】Unity MVC/MVP架构介绍,及MVC/MVP框架的简单应用
  • Linux —— 网络基础(一)
  • 设计模式中工厂模式的C语言实现
  • python是什么语言写的
  • 一个基于Java SSM框架(Spring、SpringMVC、MyBatis)的沙县小吃点餐系统
  • 基于微信小程序的智慧物业管理系统
  • Codeforces Round 974 (Div. 3)
  • VSCode引用Eigen库无法识别问题解决
  • LEAN 赋型唯一性(Unique Typing)之 Church-Rosser 定理 (Church-Rosser Theorem)及 赋型唯一性的证明
  • 交换机中的信号线需要差分布置吗?
  • 深度学习自编码器 - 随机编码器和解码器篇
  • Kotlin while 和 for 循环(九)