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

【JavaEE】初识计算机网络(TCP/IP五层模型及封装和分用)

一、 网络通信基础

网络互连的目的是进行网络通信,也即是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据。
那么,在组建的网络中,如何判断到底是从哪台主机,将数据传输到那台主机呢?这就需要使用IP地址来标识。

1.1 IP地址

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

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

1.2 端口号

在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单说:端口号用于定位主机中的进程。

注意:两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号。

1.3 协议

协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。

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

1.4 五元组

在TCP/IP协议中,用五元组来标识一个网络通信:
1. 源IP:标识源主机
2. 源端口号:标识源主机中该次通信发送数据的进程
3. 目的IP:标识目的主机
4. 目的端口号:标识目的主机中该次通信接收数据的进程
5. 协议号:标识发送进程和接收进程双方约定的数据格式

在这里插入图片描述

1.5 协议分层

协议分层类似于打电话时,定义不同的层次的协议:
在这里插入图片描述

1.6 TCP/IP五层模型(important)

应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
传输层:不关注中间路径,只关心起点和终点(负责两台主机之间的数据传输)
网络层:两个遥远节点之间的路径规划(负责地址管理和路由选择)
数据链路层:关注两个相邻结点的传输(设备之间的数据帧的传送和识别)
物理层:网络通信的基础设施。网线、光纤、网络接口等。(负责光/电信号的传递方式)

在这里插入图片描述

1.7 封装和分用

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

下面以QQ发消息为例说明封装和分用的过程:
我作为发送方,在编辑框输入一个消息:“吃饭了吗”。发给姐姐。
则会有如下过程:

(1)应用层(qq)拿到上述用户数据进行封装,封装成应用层数据包(本质就是字符串拼接)
在这里插入图片描述
(2)传输层拿到上述数据:
应用层调用传输层的api来处理这个数据
传输层有很多协议,其中最典型的就是TCP和UDP

此处以UDP为例:
UDP针对上述数据包在进行封装:

在这里插入图片描述
就是给上述应用层数据包加了“报头”变成数据报,一个典型的数据报结构就是:“报头”+”载荷“。这里应用层数据包作为UDP数据报的”载荷“

(3)传输层到网络层:
此时是一个UDP数据报,接下来把他交给网络层的协议
网络层最常见的协议就是IP协议

加上一个IP协议的报头,整个UDP数据报作为载荷
在这里插入图片描述
源IP和目的IP就描述了这次传输最初的起点和最终的终点

4)网络层交给数据链路层
最典型的协议:以太网(数据链路层和物理层)

给上述的IP数据报加上以太网帧头和帧尾变成以太网数据帧
在这里插入图片描述
其中mac地址也叫物理地址,也是描述一个设备在网络上的位置,和IP很相似

(5)数据链路层把上述以太网数据帧交给物理层

物理层把上述二进制数据转换成光信号/电信号/电磁信号,进行传输

以上的操作咱们的操作系统都已经封装好了

而接受的过程和上述刚好相反:从下到上,依次分用:

(1)物理层收到高低电平二进制数据
会对这些信号解析,变成二进制序列

(2)从物理层到数据链路层
把上述二进制序列当成一个以太网数据帧,去掉帧头和帧尾交给网络层:

在这里插入图片描述

(3)网络层
此时由网络层的IP协议进行解析数据报,去掉IP报头和其他工作

在这里插入图片描述
(4)传输层:
由UDP进行解析,将载荷交给应用层

在这里插入图片描述
(5)由qq程序解析应用层数据报并取出下列字段放在程序的界面中
在这里插入图片描述

真实的网络传输可能还会经过多个节点:
在这里插入图片描述

http://www.lryc.cn/news/206095.html

相关文章:

  • 在nodejs中实现实时通信的几种方式
  • 【tg】 7 GroupInstanceCustomImpl
  • kubernates 集群实战-安装K3s集群
  • 通俗介绍:什么是 Redis ?
  • 蓝桥算法赛(摆玩具)
  • vueDay04——v-if else show
  • 大数据技术学习笔记(二)—— Hadoop 运行环境的搭建
  • leetcode系列(双语)002——GO两数相加
  • 废柴勇士(据说没有人能坚持37秒)
  • buuctf_练[羊城杯2020]easyphp
  • 【Linux】安装配置虚拟机及虚拟机操作系统的安装
  • hugo-stack for github
  • 【uniapp】proxy 代理切换至线上测试地址调试接口
  • 对比Vue2和Vue3的自定义指令
  • Python:实现日历到excel文档
  • C++ 异常和错误处理机制:如何使您的程序更加稳定和可靠
  • 第1章 Java、IDEA环境部署与配置
  • 如何进行二进制文件的读写操作?
  • python实现PDF表格与文本分别导出EXCEL
  • Java开发-WebSocket
  • SpringDoc API文档工具集成SpringBoot - Swagger3
  • Java将djvu文件转成pdf
  • 【机器学习合集】激活函数合集 ->(个人学习记录笔记)
  • 【从0到1设计一个网关】什么是网关?以及为什么需要自研网关?
  • Tp框架如何使用事务和锁,还有查询缓存
  • Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行
  • 【产品经理】APP备案(阿里云)
  • Overmind VS Redux
  • 0基础学习PyFlink——流批模式在主键上的对比
  • Java学习笔记(五)——数组、排序和查找