【网络编程】网络通信基础——简述TCP/IP协议
个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】【Java系列】
本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌
目录
- 一、ip地址
- 二、端口号
- 三、协议分层
- 四、封装和分用
- 五、总结
一、ip地址
ip地址简单来说就是用来描述网络上一个设备的所在位置。
二、端口号
端口号用于区分一个主机上不同的应用程序。
一个网络程序在启动的时候都需要绑定一个或多个端口号,后续的通信过程都需依赖端口来进行展开的。
网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则(协议就只是表示一种约定,然而这种约定可以是任意的),之所以有统一的协议标准以便大家可以相互通信。
三、协议分层
网络通信是一个非常庞大的工作,其中会涉及到一系列非常繁琐,非常细节的工作,靠一个协议解决所有问题说明这个协议非常庞大。因此我们就需要对协议进行分类
(把功能差不多的协议放到一起)、分层
(上层协议调用下层协议,下次协议为上层协议提供支持,以避免跨层级所引起的混乱);另外上层协议不需要了解下层协议的细节(封装),我们可以灵活的调整替换某层协议。
协议分层就是为这些协议明确层级关系,避免跨层之间的交互,降低耦合,提高整个系统的稳定性。
协议分层有两种主要的方式:一种方式是OSI七层网络模型(目前只是在教科书中提到,在真实世界并没有对其进行应用),另一种是TCP/IP五层网络模型。
- 物理层:描述网络通信中的一些基础设施需要遵守的规范。(比如网口、网线是什么样的)
- 数据链库层:负责相邻两个节点的数据如何传输。
- 网络层:负责地址管理和路由选择。
- 传输层:管理两个节点之间的数据传输,只关注起点和终点。
- 应用层:简单来说就是这个数据被用来干什么。
- 对于应用程序来说:不同的应用程序使用不同的协议(当然也能是使用相同的协议)。
- 传输层协议和网络层协议都是操作系统已经内置好的。
- 驱动程序都是硬件厂商提供的,驱动程序会和系统内核进行适配,系统就可以进一步的通过驱动来操作硬件了。数据链路层和物理层一般就是由硬件和驱动程序搭配来进行提供的。
四、封装和分用
网络数据传输的基本流程总结起来就是:封装和分用。
我们现在通过QQ发送消息为例来描述网络数据传输的基本流程。即主机A通过QQ把消息发送给主机B:
-
应用层方面:首先QQ这个应用程序先从输入框中获取到输入的信息,并将其构成
应用层数据报
(当然这里是根据应用层协议去进行数据报构造的,构建的应用层数据报的过程是按照一定的格式进行字符串拼接的)。这里我们要知道不同的应用程序使用的应用层协议是不同的,而其中很多一部分的应用程序会自定义应用层协议。当应用层数据报准备好之后,应用程序就会调用传输层提供的接口,然后把上述的数据报交给传输层去进行处理。 -
传输层方面:传输层的协议有很多,最主要的协议就是TCP和UDP。此处我们这里假设使用的协议是UDP。当应用层把应用层的数据传到了传输层之后,并交给UDP,UDP会把应用层数据当作一个字符串,并构造出UDP数据报,然后把UDP数据报进一步的交给网络层。
-
网络层方面:网络层最主要的协议就是IP协议。IP协议会根据自己的格式来构造出IP数据报。IP协议并不关心IP数据报的载荷是啥,只是单纯的把IP数据报载荷当作一个字符串,在这个基础上拼接一个IP报头以获取更大的字符串。
注意,源ip和目的ip都是在ip报头中,而源端口和目的端口都是在UDP报头中
一次通信往往包括这5个信息:源IP、目的IP、源端口、目的端口、协议类型。此五点称为网络通信的五元组
。
之后对数据进一步传输,即把数据传输到数据链路层。
数据链路层
:数据链路层比较重要的协议就是以太网协议。以太网(平时上网插入的一个网线,这根网线就遵守以太网协议)又会针对IP数据报进行进一步的封装,即在IP数据报的基础上加上数据头
和数据尾
。以太网依然不关心载荷是什么,以太网只是把载荷当作字符串,进一步的拼接上枕帧头帧尾以构造成以太网数据帧
。至此,上述的数据还需要交给物理层。
物理层
:物理层这里就涉及到硬件设备了(比如网卡)。之前的以太网数据帧本质上是二进制的数据,这个时候硬件设备就需要对上述的数据进行转换(由物理层的这些设备把上述的数据转换称光信号、电信号、电磁波等)
至此,主机A就完成了发送过程。即上述的过程是主机A,即发送消息方的情况。
现在来看接收方(即主机B)的情况:
物理层
:硬件设备(如网卡)接收到光信号、电信号、电磁波。需要把接收到的信号解调(调制:就是把我们要传输的信息放到光电信号中
;解调:就是把光电信号中的信息提取出来
;还有一个叫做调制解调器【俗称猫🐱】,调制解调器就是负责调制和解调的硬件设备:光猫🐱就是针对光信号进行调制解调的
),解调之后我们就可以得到0101这样的二进制数据序列,这个序列就是以太网数据帧。此时我们经过解调得到的信息就会交给上一层,即交给数据链路层。好了,下面来看数据链路层的方面。数据链路层
:数据链路层得到来自硬件设备解调出来的信息之后,数据链路层的以太网协议就会按照以太网数据帧的格式对信息进行解析。解析之后,就来到了网络层。下面来看网络层。
网络层
:ip协议会对从数据链路层那里得到的数据报进行解析(去掉ip报头,取出载荷部分的信息并将其交给传输层),好了现在就来到了传输层。
传输层
:传输层会根据ip报头中的字段就知道当前这个载荷是一个UDP数据报,并将该数据报交给UDP处理。然后UDP也会针对这个数据报进行解析(即去掉报头,取出载荷),然后进一步交给应用程序。好了,现在来到了应用程序层。应用程序层
:UDP报头中有一个字段是目的端口,然后根据目的端口找到关联的应用程序,然后把数据交给应用程序即可。此时QQ程序就会按照QQ的应用层协议对数据进行解析,进一步把这里的数据显示到界面上。更进一步的此时我们的QQ头像就一直进行闪烁。
至此,主机A从上到下依次添加报头的过程称为封装。主机B从下到上依次解析报头的过程称之为分用。每次网络数据的传输都会经过封装和分用这样的过程。
我们可以简单理解:封装就是在打包快递,而分用就是在拆快递
。封装和分用相互配合,就可以完成数据的传输。上面的描述是针对消息发送方和消息接收方的进行分析的。
然后主机A和主机B之间还会有很多交换机和路由器进行转发。
消息转发到某个设备(即中间过程的交换机和路由器)时,每个设备的处理流程和上面封装分用是一样的
。如果是交换机的话,交换机封装和分用到数据链路层即可。交换机解析出以太网数据帧之后,就会进一步获取到帧头中的mac地址(交换机通过在以太网数据帧中查找目标MAC地址来实现数据的转发),然后根据mac地址查询到交换机内部的转发表,然后接下来决定数据从哪个网口发出,在发送之前又会把以太网数据帧封装好。
(我们举个栗子来更好的理解交换机这里,比如我们拿到一个快递之后,打开快递盒子并查看其中的标签以便我们可以知道这个快递发往哪里,之后我们得知快递发往哪里之后我们把这个快递盒子重新封装起来即可)
路由器则是封装分用到网络层即可。即先从物理层中解析出以太网数据帧(以太网数据帧是计算机网络中物理层和数据链路层之间的数据传输单位;计算机设备之间的通信都是通过以太网数据帧进行的),然后再去交给网络层(即交给ip协议)解析出ip数据包,进一步获取到ip报头,然后根据ip报头来进一步规划接下来的路线(不要忘记网络层的任务就是规划路线,而数据链路层的任务就是当路线确定好了之后再来确定我们应该怎么走;由此可以看到数据链路层和网络层是相互配合的),确定好路线之后,接下来又会把数据进行重新封装然后转发。
注意
:上述的交换机路由器只是经典的交换机路由器,而现在的交换机路由器可以做到更多的事情,比如有的现代的交换机路由器很有可能封装分用到应用层
。
五、总结
- TCP/IP五层协议:应用层(对应应用程序)、传输层(两点之间的传输)、网络层(规划路线)、数据链路层(负责两个相邻节点之间的传输),物理层(描述硬件设备),其中传输层会为应用层提供API,我们如果要编写一个具体的网络程序,此时就会经常使用到传输层的API。
- 封装和分用:从上到下依次添加报头的过程称为封装。从下到上依次解析报头的过程称之为分用。
本文到这里就结束了,希望友友们可以支持一下一键三连哈。嗯,就到这里吧,再见啦!!!
相关文章:

【网络编程】网络通信基础——简述TCP/IP协议
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、ip地…...
观察者模式 Observer
观察者模式属于行为型模式。在程序设计中,观察者模式通常由两个对象组成:观察者和被观察者。当被观察者状态发生改变时,它会通知所有的观察者对象,使他们能够及时做出响应。 三要素:观察者(Observer&#…...

Hadoop入门学习笔记——七、Hive语法
视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 七、Hive语法7.1. 数据库相关操作7.1.1. 创建数据库7.1.2…...

采用SpringBoot框架+原生HTML、JS前后端分离模式开发和部署的电子病历编辑器源码(电子病历评级4级)
概述: 电子病历是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图表、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。 医院通过电子病历以电子化方式记录患者就诊的信息,包括&…...

HTML表单
<!DOCTYPE html> <html><head><meta charset"utf-8"><title>招聘案列</title></head><body><h1>午睡操场传来蝉的声音</h1><hr /><form>昵称:<input type"text" …...
Http 请求体和响应体中重要的字段
Http 请求体 Accept:用于告诉服务器客户端能够处理哪些媒体类型。Accept 头中的值通常是一个或多个 MIME 类型,并按优先级排序。服务器会根据 Accept 头中的值来决定响应的内容类型。例如,Accept: text/plain, text/html。Content-Type&…...

最新国内可用使用GPT4.0,GPT语音对话,Midjourney绘画,DALL-E3文生图
一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而,GP…...

【量化金融】证券投资学
韭菜的自我修养 第一章: 基本框架和概念1.1 大盘底部形成的技术条件1.2 牛市与熊市1.3 交易系统1.3.1 树懒型交易系统1.3.2 止损止损的4个技术 第二章:证券家族4兄弟2.1 债券(1)债券,是伟大的创新(2&#x…...
【Bash】重点总结
文章目录 1. 总体认识1.1. Shell概述1.2. 第一个Shell脚本 2. 变量2.1. 定义变量2.2. 使用变量2.3. 只读变量2.4. 删除变量2.5. 变量类型2.5.1. 字符串变量 1. 总体认识 1.1. Shell概述 Shell是一个用C语言编写的程序,这个程序提供了一个界面,用户通过…...

Git安装和使用教程,并以gitee为例实现远程连接远程仓库
文章目录 1、Git简介及安装2、使用方法2.1、Git的启动与配置2.2、基本操作2.2.1、搭建自己的workspace2.2.2、git add2.2.3、git commit2.2.4、忽略某些文件不予提交2.2.5、以gitee为例实现git连接gitee远程仓库来托管代码 1、Git简介及安装 版本控制(Revision cont…...

Hadoop入门学习笔记——一、VMware准备Linux虚拟机
视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 一、VMware准备Linux虚拟机1.1. VMware安装Linux虚拟机1.…...

CSS3新增特性
CSS3 CSS3私有前缀 W3C 标准所提出的某个CSS 特性,在被浏览器正式支持之前,浏览器厂商会根据浏览器的内核,使用私有前缀来测试该 CSS 特性,在浏览器正式支持该 CSS 特性后,就不需要私有前缀了。 查询 CSS3 兼容性的网…...

Unity中Shader观察空间推导
文章目录 前言一、本地空间怎么转化到观察空间二、怎么得到观察空间的基向量1、Z轴向量2、假设 观察空间的 Y~假设~ (0,1,0)3、X Y 与 Z 的叉积4、Y X 与 Z 的叉积 三、求 [V~world~]^T^1、求V~world~2、求[V~world~]^T^ 四、求出最后在Unity中使用的公式1、偏移坐标轴2、把…...
信息学奥赛一本通2034:【例5.1】反序输出
2034:【例5.1】反序输出 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 79280 通过数: 35643 【题目描述】 输入nn个数,要求程序按输入时的逆序把这nn个数打印出来,已知整数不超过100100个。也就是说,按输入相反顺序打印这nn个…...

使用教程之【SkyWant.[2304]】路由器操作系统,破解移动【Netkeeper】校园网【小白篇】
许多高校目前饱受Netkeeper认证的痛苦,普通路由器无法使用, 教你利用SkyWant的Netkeeper认证软件来使你的SkyWant路由器顺利认证上网,全宿舍又可以合作共赢了! 步骤一:正确连接网线,插电开机 正确连接网…...
模式识别与机器学习(十):梯度提升树
1.原理 提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。提升树模型可以表示为决…...
《剑指offer》Java版--12.矩阵中的路径(DFS+剪枝)
剑指offer原题:矩阵中的路径 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再…...
AI智能体的介绍
最近几个月 随着大语言模型的持续火爆 利用大模型来构建AI智能体的研究呢 也陆续进入了人们的视野 AI智能体这个概念呢 也逐渐的流行开来 先是斯坦福大学谷歌的研究者们 成功的构建了一个虚拟小镇 小镇上的居民呢不再是人 而是25个AI的智能体 他们的行为呢 比人类角…...
Java设计模式-单例模式(Singleton)
Java中实现单例模式有几种不同的方式,每种方式都有其特点和适用场景。下面是两种常用的实现方式:懒汉式和饿汉式。 懒汉式(线程安全) 懒汉式单例是指在第一次被引用时才会创建实例。为了确保线程安全,可以使用同步方法或同步块。 public class SingletonLazy {private sta…...

若依vue如何展示一个HTML页面(或者展示Markdown文档)
一. 前言 ⚠ 本文是展示Markdown的方法,不能直接前端编辑Markdown文档. 二. 准备部分 用Typora编辑器打开需要导出html页面,我这里使用Typora来导出 1. 先将md文件导出成html 2. 将导出好的文件放在若依vue的pubilc下(文件可以是中文) 三. 代码部分 1.使用v-html来展示HT…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...