网络初识 二

news2025/6/9 8:50:43

一、TCP/IP五层协议

  ->   应用层 : 传输的数据在应用程序中如何使用

   ->   传输层 : 关注的是通信的起点终点

   ->   网络层 : 关注的是通信中的路线规划

   ->   数据链路层 : 关注的是相邻节点之间的通信细节

   ->   物理层 : 网络通信的基础设施

说是五层,实际上下面这四层都是在 操作系统内核,硬件,驱动程序中已经实现好了,(计算机内置了)

我们程序员在网络编程过程中能影响到的也就只有应用层了.

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

对于一台路由器,他实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;  ->  路由器工作在网络层

对于一台交换机,他实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;   ->  交换机工作在数据链路层

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

二、封装和分用

封装和分用,是网络传输数据过程中,最核心的流程.

例:

比如说,A通过QQ给B发送了一个hello   ->   会经历以下流程

2.1 分装

2.1.1 应用层(应用程序)

QQ从消息输入框获取到用户输入的hello

就要把这个字符串构造成一个应用层的数据包

QQ这样的程序就内置了一个应用层协议,应用层数据包就是按照这个应用层协议约定的格式来构造.

约定格式如下:

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

2.1.2 传输层

传输层就会把上述数据作为一个整体,再构造成一个传输层的数据包.

传输层涉及到的协议就是TCP和UDP

此处假定是使用UDP来进行通信.就会构造成一个UDP数据包.

这个数据包,由应用层传输过来的内容看作一个整体,叫做载荷,添加一个UDP报头,叫做报头.

这个整体就是我们的UDP数据包.

形容这样的添加报头的过程就叫做 " 封装 ",其实就是,字符串拼接.

只不过拼接的报头,具有一定的结构.

UDP报头,虽然不能保护数据,但是可以起到 " 贴标签 " 类似效果.

就能承载一些关键的用来转发数据的信息.

对于UDP报头来说,承载的最重要的信息就是 源端口 和 目的端口.

拼好传输层数据包后,就要把这个数据包进一步的交给下层,网络层继续进行了封装.

(交给下层,指的是,下层协议提供一组api(函数),上层调用这个api,并且把刚才构造好的数据通过参数传过去,下层协议就可以来处理这个数据了)

2.1.3 网络层 

网络层,这里涉及到了最核心的协议   ->   IP协议

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

构造成一个IP数据包.

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

2.1.4 数据链路层

数据链路层这里涉及到的核心协议   ->   以太网   ->   此处 " 以太 " 用来表示网络数据传输的介质.

以太网就是我们日常最常见到的有线网络.

我们日常用到的网线,也叫做 " 以太网线 ",日常用到的网口也叫做 " 以太网口 ".

用到的交换机,也叫做 " 以太交换机 '.

以太数据帧.也是以IP数据包作为一个整体,在这个基础上添加帧头和帧尾.

接下来,再把这个数据交给物理层.

2.1.5 物理层

物理层   ->   硬件设备

把上述这样的以太网数据帧,二进制结构( 一串0 1 0 1 这样的数据),转换成 光信号/电信号/电磁波,然后进行发送.

经过上述一些列的操作,数据就从电脑上发送出去了.

2.2 分用

暂时不考虑中间过程,假定数据包已经到达B网卡了,B如何处理,B的处理过程就称为 " 分用 ".

2.2.1 物理层

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

2.2.2 数据链路层   以太网

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

2.2.3 网络层 IP协议

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

2.2.4 传输层 UDP协议

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

2.2.5 应用层

按照应用程序的内部应用层协议来解析数据

例:

QQ在拿到信息后,就会在窗口中显示,让你看到信息(聊天消息).

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

真实情况下,两个主机不太会是通过网线直连的,通过一系列的交换机和路由器来进行数据转发的.

但是实际上,即使是经过交换机或者路由器,上述的分装分用过程,也是同样适用的.

只不过,封装分用的程度不一定是到应用层.

经典交换机来说,就只需要封装分用到数据链路层即可.

经典的路由器来说,就只需要封装分用到网络层即可.

交换机会把光电信号转换成以太网数据帧二级制数据,交给数据链路.

交换机的数据链路层就会对上述数据进行解析.

这个解析过程,一方面要取出载荷部分,另一方面,就要解析到帧头中的关键信息.

根据帧头中的关键信息,决定下一步把数据往哪里进行发送,根据这个情况再进一步的构造出新的以太网数据帧.

把这个新的数据通过物理层发送出去.

如果是路由器,情况稍微复杂一点点,就是封装分用到网络层.

先是物理层拿到光电信号,转成二进制数据交给数据链路层

IP协议对进行解析,取出载荷,再重新封装

继续交给数据链路层,继续加上帧头帧尾

这个数据再交给物理层,转成光电信号,继续传输.

三、几个术语

描述一个网络上传输的数据,单位"可能会用到这几个术语:

包   ->   packet

段   ->   segment

报   ->   datagram

帧   ->   frame

如 : IP数据包 / IP数据报

网络编程,本质上就是学习 传输层 给 应用层 提供的 API,就可以写入代码,把数据交给传输层,进一步通过层层封装,就可以把数据通过网卡发送出去了.

四、网络编程中一些重要的概念

4.1 客户端VS服务器

        再网络中,主动发起通信的这一方,称为 " 客户端 ",被动接受的这一方,称为 " 服务器 ".

同一个程序再不同的场景中,可能是客户端,也可能是服务器.

客户端给服务器发送的数据,称为 " 请求 " (request)

服务器给客户端返回的数据,称为 " 响应 " (response)

客户端和服务器之间的交互,也是有很多种模式的.

1   ->   一问一答

一个请求对应一个响应,一对一        常见于网页开发(web开发)

2   ->   一问多答

一个请求对应多个响应                常见于 "下载"

3   ->   多问一答

多个请求对应一个响应        常见于 "上传"

4   ->   多问多答

一个请求可能对应多个响应

一个响应也可能对应多个请求                常见于 "远程控制/远程桌面"

五、TCP和UDP特点上的差别

要想进行网络编程,需要使用系统的API,本质上是传输层提供的.

传输层涉及到的协议主要是两个,TCP,UDP

由于这两个协议,之间差异很大,他们的api差距也很大.

TCP和UDP特点上的差别:

        TCP                                   UDP

     有连接                                  无连接

     可靠传输                            不可靠传输

     面向字节流                         面向数据报

      全双工                                 全双工

有链接/无连接   ->   指的是抽象的,本质上就是是否有记录对方的信息

可靠传输/不可靠传输   ->   尽可能的完成数据传输,虽然无法确保数据到达对方,至少可以知道,当前这个数据对方是不是收到了.

ps : 网络上存在的 "异常情况" 是很多的,无论什么手段都无法保证这个数据100%能从A到达B

此处的可靠传输,主要是指发的数据到没到,发送方能知道.

面向字节流   ->   此处谈到的字节流与文件中的字节流完全一致.        TCP

网络中传输数据的基本单位是字节.

面向数据包   ->   每次传输的基本单位是一个 "数据报" 特定的结构   UDP

全双工   ->   一个信道,可以双向通信

半双工   ->   一个信道,只能单向通信

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

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

相关文章

【Python搞定车载自动化测试】——Python实现CAN总线Bootloader刷写(含Python源码)

系列文章目录 【Python搞定车载自动化测试】系列文章目录汇总 文章目录 系列文章目录💯💯💯 前言💯💯💯一、环境搭建1.软件环境2.硬件环境 二、目录结构三、源码展示1.诊断基础函数方法2.诊断业务函数方法…

GmSSL3.X编译iOS和Android动态库

一、环境准备 我用的Mac电脑编译,Xcode版本15.2,安卓的NDK版本是android-ndk-r21e。 1.1、下载国密源码 下载最新的国密SDK源码到本地。 1.2、安装Xcode 前往Mac系统的AppStore下载安装最新Xcode。 1.3、安卓NDK下载 下载NDK到本地,选…

leetcode每日一题第八十九天

class Solution { public:int subarraySum(vector<int>& nums, int k) {unordered_map<int,int> mp;mp[0] 1;int count 0,pre 0;for(auto x:nums){pre x;if(mp.find(pre-k) ! mp.end()){count mp[pre-k];}mp[pre];}return count;} };

OSM最新台湾电力数据(2024年5月23日数据)转换总结及与(2024年2月16日数据)转换结果对比

osm包含种类繁多&#xff0c;我们这里是只以刚转换的台湾电力设备为例抛砖引玉的进行说明。本次仅仅转换了&#xff0c;变电站、电厂和线路杆塔数据&#xff01; 这种带增强的文件&#xff0c;是我在基础规则之外增加的提取规则。是为了更多的将OSM相关类型数据过滤提取出来&am…

Meta发布Chameleon模型预览,挑战多模态AI前沿

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

LeetCode 279 —— 完全平方数

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此图利用动态规划进行求解&#xff0c;首先&#xff0c;我们求出小于 n n n 的所有完全平方数&#xff0c;存放在数组 squareNums 中。 定义 dp[n] 为和为 n n n 的完全平方数的最小数量&#xff0c;那么有状态…

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文&#xff0c;我们分别在个人笔记本电脑部署了Llama 3 8B参数大模型&#xff0c;并使用Ollama搭建了基于 Web 可视化对话聊天机器人&#xff0c;可以在自己电脑上愉快的与Llama大模型 Web 机器人对话聊天了。但在使用过程中&#xff0c;笔者发现Llama大模型经常出现…

【IC设计】牛客网-序列检测习题总结

文章目录 状态机基础知识VL25 输入序列连续的序列检测VL26 含有无关项的序列检测VL27 不重叠序列检测VL28 输入序列不连续的序列检测参考资料 状态机基础知识 VL25 输入序列连续的序列检测 timescale 1ns/1ns module sequence_detect(input clk,input rst_n,input a,output re…

乡村振兴的乡村环境治理与保护:加强乡村环境治理与保护,改善乡村环境质量,打造美丽宜居的乡村环境

一、引言 随着乡村振兴战略的深入实施&#xff0c;乡村环境治理与保护成为推动乡村全面振兴的关键环节。乡村环境是乡村发展的重要基础&#xff0c;关系到农民的生产生活和身心健康&#xff0c;也直接影响到乡村经济的可持续发展。因此&#xff0c;加强乡村环境治理与保护&…

Stable Diffusion——U-ViT用于扩散建模的 ViT 主干网

1.概述 扩散模型是最近出现的强大的深度生成模型&#xff0c;可用于生成高质量图像。扩散模型发展迅速&#xff0c;可应用于文本到图像生成、图像到图像生成、视频生成、语音合成和 3D 合成。 除了算法的改进&#xff0c;骨干网的改进在扩散建模中也发挥着重要作用。一个典型…

收集 VSCode 常用快捷键

快速复制行 Shift Alt ↑/↓ 都是往下复制行&#xff0c;区别是&#xff1a;按↓复制时光标会跟着向下移动&#xff0c;按↑复制时光标不移动。 向上/向下移动一行 Alt ↑/↓ 删除整行 Ctrl Shift KCtrl x 剪切快捷键在VSCode 可以直接删除一行 垂直编辑 Ctrl…

Vue 安装vue

1、官网安装下载安装nodejs 2、安装完成后&#xff0c;通过命令查看版本,可以查看到版本 node -v npm -v 3、安装Vue CLi npm install -g vue/cli 4、创建项目,vue create test 如果遇到报错&#xff1a; ERROR Error: spawn yarn ENOENT Error: spawn yarn ENOENT at ChildP…

Flash与EEPROM

文章目录 1. 分类2. 工作原理2.1 擦除操作2.2 写入操作 3. 参考资料 1. 分类 2. 工作原理 在存储数据之前&#xff0c;先擦除存储区域&#xff08;写成全1&#xff09;&#xff0c;进行存储时&#xff0c;将对应位写为0。 注&#xff1a;这里编程不能反向&#xff0c;若写错了…

牛客NC367 第K个n的排列【困难 dfs,全排列问题 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1595969179464e4c940a90b36abb3c54 思路 全排列问题本文提供的答案在力扣同一道题60. 排列序列&#xff0c;超时了但是截止文章发表日&#xff0c;牛客上是能通过全部测试用例的Java代码 import java.util.*;pu…

vue源码2

vue之mustache库的机理其实是将模板字符串转化为tokens 然后再将 tokens 转化为 dom字符串&#xff0c;如下图 对于一般的将模板字符串转化为dom字符串&#xff0c;这样不能实现复杂的功能 let data {name:小王,age:18 } let templateStr <h1>我叫{{name}},我今年{{ag…

Mybatis-Plus笔记

1.MP基础 1.1 MP常见注解 TableName(“指定表明”) TableName("tb_user") // 指定表名 Data NoArgsConstructor AllArgsConstructor Builder public class User {private Long id;private String userName;private String password;private String name;private I…

输入一串字符串,前中后都有*号,去掉字符串中间和后面的*号,保留前面的*号和字母

#include <stdio.h> void fun(char* a) {//***df**fr*fg***int i 0, j 0,n0,m0;char* p;p a;while (p[i] ! \0){i;//i是一共的字符的个数}printf("%d\n",i);while (a[n] *){n;//计算字母前的*的个数}printf("%d\n", n);m n;for (j n; j < …

【排序算法】快速排序(四个版本以及两种优化)含动图)

制作不易&#xff0c;三连支持一下吧&#xff01;&#xff01;&#xff01; 文章目录 前言一.快速排序Hoare版本实现二.快速排序挖坑法版本实现三.快速排序前后指针版本实现四.快速排序的非递归版本实现五.两种优化总结 前言 前两篇博客介绍了插入和选择排序&#xff0c;这篇博…

nuxt: generate打包后访问资源404问题

现象 使用Nuxt.js开发的个人页面&#xff0c;部署到nginx服务器中&#xff0c;/_nuxt/*.js、/_nuxt/*.css等静态问题不能访问&#xff0c;提示404错误。 而我们的这些资源文件是存在的。 解决方法 加上此处代码进行上下文配置 baseURL: /nuxt/ 此时在nginx配置 /nuxt 代理 lo…

使用 Django Admin 进行高效的后台管理

文章目录 创建超级用户注册模型到 Admin 后台自定义 Admin 后台界面定制 Admin Actions结语 当使用 Django Admin 进行后台管理时&#xff0c;开发者可以通过简单的配置和定制来满足项目的需求。可以根据不同的模型和数据结构&#xff0c;轻松地创建和管理数据条目、进行搜索和…