TCP/IP ⽹络模型
TCP/IP ⽹络模型
对于同⼀台设备上的进程间通信,有很多种⽅式,⽐如有管道、消息队列、共享内存、信号等⽅式,⽽对于不同设备上的进程间通信,就需要⽹络通信,⽽设备是多样性的,所以要兼容多种多样的设备,就协商出了⼀套通⽤的⽹络协议。
应⽤层
在OSI模型或TCP/IP模型中,应用层位于层次结构的最上层,直接服务于最终用户的应用程序。这一层的重点是如何提供网络服务或数据给用户应用,而不涉及数据传输的底层细节。
应用层协议定义了运行在不同终端设备上的应用程序如何进行通信。这些协议包括但不限于HTTP(超文本传输协议),用于网页浏览;FTP(文件传输协议),用于文件下载和上传;SMTP(简单邮件传输协议),用于电子邮件发送;DNS(域名系统),用于解析域名到IP地址;Telnet,用于远程登录。
当应用层的一个程序需要与另一个程序通信时,它会将应用数据发送给传输层。传输层的主要职责是提供端到端的数据传输服务,确保数据能够从源头安全、准确地传送到目的地。传输层使用的协议包括TCP(传输控制协议)和UDP(用户数据报协议)。
值得注意的是,应用层工作在操作系统的用户态,而传输层及其以下的层次(如网络层、数据链路层、物理层)则工作在内核态。用户态和内核态是操作系统的两种不同的权限模式。用户态允许用户应用程序运行,而内核态则有更高的权限,能够直接访问硬件和执行关键的系统任务。
这种分层的设计使得应用程序开发者可以专注于应用逻辑和用户体验,而无需关心数据如何在网络中传输的复杂细节。这也使网络通信更加模块化,有助于不同层次的技术和协议的独立发展和改进。
传输层
应⽤层的数据包会传给传输层,传输层(Transport Layer)是为应⽤层提供⽹络⽀持的。
在传输层会有两个传输协议,分别是 TCP 和 UDP。
TCP (Transmission Control Protocol)
TCP 是一种面向连接的、可靠的传输层通信协议,设计目的是确保数据包能够可靠地、按顺序地从源传输到目的地。TCP 实现了几个关键特性以保证这种可靠性:
- 流量控制:通过控制数据传输的速率,防止网络中的任一部分被过量的数据流淹没。
- 超时重传:如果一个数据包在设定的时间内未被确认收到,则会重新发送该数据包。
- 拥塞控制:在网络拥堵时减少数据的发送速率。
- 有序数据传输:确保数据包按照发送顺序到达接收方。
- 错误检测:通过校验和等方法检测数据在传输过程中的任何错误。
TCP 适用于那些需要高可靠性的应用,如网页浏览、文件传输、电子邮件等。
UDP (User Datagram Protocol)
UDP 是一种无连接的协议,相对于 TCP 来说,它简单得多,提供的是一种不可靠的服务。UDP 只是将应用层数据打包并发送,不保证数据包的可靠到达,也不进行错误检测、流量控制或拥塞控制。UDP 的这种设计使其在实时性要求较高的场景中(如视频会议、实时游戏)更为适用,因为即使丢失一些数据包,也不会像 TCP 那样等待重传,从而避免了延迟。
虽然 UDP 本身不提供可靠性保证,应用层可以在需要的情况下实现类似于 TCP 的可靠传输机制,如通过数据包重传、数据完整性校验等方式来确保数据的可靠到达。但是,实现一个商业级的可靠 UDP 传输协议是复杂的,需要在保持 UDP 高效率和低延迟的特点的同时,增加额外的可靠性机制。
数据分块和TCP段
对于大数据传输,TCP 采用分段的方法来优化传输过程。这意味着大块数据会被切分成更小的段,每个段都有自己的序号和校验和。这样,如果某个段在传输过程中丢失或损坏,只需重新传输那个特定的段,而不是整个数据包。MSS(最大报文段长度)是一个重要的参数,它定义了TCP段的最大数据量,帮助优化网络传输,避免因数据包过大而导致的网络拥堵。
总的来说,TCP和UDP各自服务于不同类型的网络应用需求,前者侧重于可靠性和顺序性,后者则侧重于低延迟和高效率。
端口号的作用
- 区分服务:在一个网络通信过程中,IP地址用来识别目标设备,而端口号则用来指定该设备上的特定应用。这样,即使多个应用同时使用同一网络协议(例如TCP或UDP)进行通信,它们也可以通过各自的端口号被正确区分和识别。
- 实现多任务:同一台计算机上可以同时运行多个网络服务(如Web服务、邮件服务等),通过使用不同的端口号,这些服务可以同时监听网络请求,无需相互干扰。
常见端口号
- 80端口:通常被HTTP服务使用,用于Web服务器。
- 22端口:常用于SSH服务,用于安全的远程登录和其他安全网络服务。
- 443端口:用于HTTPS服务,即加密的HTTP通信,提供安全的Web浏览。
- 21端口:FTP服务使用,用于文件传输。
对于客户端应用程序(如Web浏览器中的标签),操作系统会分配临时端口号(也称为动态端口号)。这些端口号通常从一个特定的范围内选择,不用于标准网络服务。动态端口的使用允许多个网络应用并发运行,而不冲突。
当数据包在网络中传输时,它们的头部信息包括源端口号和目标端口号。这样,当数据包到达目标设备时,传输层可以通过目标端口号确定哪个具体的应用程序应该接收这些数据。同样地,源端口号告诉接收方如何回应消息,确保响应能返回给正确的应用程序。
端口号的这种设计极大地增强了网络通信的灵活性和效率,使得复杂的网络应用和服务得以在同一台设备上协同工作。
传输层的职责
传输层主要负责应用程序之间的数据传输服务,确保数据可以在应用程序之间准确无误地传递。它不直接处理数据的路由选择或跨网络的传输。传输层的职责包括:
- 确保数据完整性:通过校验和等方法检测传输过程中的错误。
- 保持数据顺序:确保数据包的顺序与发送时一致。
- 流量控制和拥塞避免:防止网络过载。
- 多路复用和分解:允许多个应用程序通过不同的端口同时使用网络。
⽹络层
网络层的职责
网络层负责数据包在网络中的传输和路由选择。这一层涉及到数据包在整个网络中从源头到目的地的传递,包括跨越不同的网络和中间设备(如路由器)。网络层的核心协议是IP(Internet Protocol),它定义了数据包的路由方式和地址格式。网络层的主要职责是:
- 路由:决定数据包从源到目的地的路径。
- 分片和重组:根据网络的MTU(最大传输单元),可能需要将大的数据包分成较小的片段进行传输,目的地再将这些片段重组。
- 寻址:使用IP地址标识发送者和接收者。
传输层可能⼤家刚接触的时候,会认为它负责将数据从⼀个设备传输到另⼀个设备,事实上它并不负责。
实际场景中的⽹络环节是错综复杂的,中间有各种各样的线路和分叉路⼝,如果⼀个设备的数据要传输给另⼀个设备,就需要在各种各样的路径和节点进⾏选择,⽽传输层的设计理念是简单、⾼效、专注,如果传输层还负责这⼀块功能就有点违背设计原则了。也就是说,我们不希望传输层协议处理太多的事情,只需要服务好应⽤即可,让其作为应⽤间数据传输的媒介,帮助实现应⽤到应⽤的通信,⽽实际的传输功能就交给下⼀层,也就是⽹络层(Internet Layer)。

⽹络层最常使⽤的是 IP 协议(Internet Protocol),IP 协议会将传输层的报⽂作为数据部分,再加上 IP 包头组装成 IP 报⽂,如果 IP 报⽂⼤⼩超过 MTU(以太⽹中⼀般为 1500 字节)就会再次进⾏分⽚,得到⼀个即将发送到⽹络的 IP 报⽂。
数据包的封装过程
- 当数据从应用层下发到传输层,如使用TCP或UDP协议,它会被封装成一个段(TCP)或数据报(UDP),并附加上相应的端口号。
- 传输层的数据随后下发到网络层,网络层将传输层的数据段或数据报封装在IP包中,加上IP头部信息,这些头部信息包括源IP地址和目标IP地址等。
- 如果IP包的大小超过网络的MTU,网络层会将包分片。每个片段都能独立路由到目的地,在那里它们会被重新组装成原始的IP包。

⽹络层负责将数据从⼀个设备传输到另⼀个设备,世界上那么多设备,⼜该如何找到对⽅呢?因此,⽹络层需要有区分设备的编号。
我们⼀般⽤ IP 地址给设备进⾏编号,对于 IPv4 协议, IP 地址共 32 位,分成了四段(⽐如,192.168.100.1),每段是 8 位。只有⼀个单纯的 IP 地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道⼀个⼀个去匹配?这显然不科学。
因此,需要将 IP 地址分成两种意义:
⼀个是⽹络号,负责标识该 IP 地址是属于哪个「⼦⽹」的;
⼀个是主机号,负责标识同⼀「⼦⽹」下的不同主机;
怎么分的呢?这需要配合⼦⽹掩码才能算出 IP 地址 的⽹络号和主机号。
IP地址
IP地址是分配给每个连接到网络的设备的唯一标识符。对于IPv4,它是一个32位的数字,通常表示为四个十进制数(每个范围从0到255),用点分隔,例如192.168.100.1。这种结构允许大约42亿(2^32)的唯一地址。
子网掩码
子网掩码用于确定IP地址中哪一部分表示网络地址,哪一部分表示主机地址。通过将IP地址与子网掩码进行按位与(AND)运算,可以得到网络地址。子网掩码通常也是一个32位的数字,表示为与IP地址相同的点分十进制格式,例如255.255.255.0,或者作为CIDR表示法中的斜杠后数字,例如/24。
网络地址和主机地址的计算
- 网络地址的计算:将IP地址与子网掩码按位与运算得到。这表示了IP地址所在的子网。
- 主机地址的计算:将IP地址与子网掩码的反码按位与运算得到。这表示了子网中特定设备的标识。
例子
以IP地址10.100.122.2和子网掩码255.255.255.0(/24)为例:
- 子网掩码/24表示前24位是网络部分,后8位是主机部分。
- 网络地址计算:10.100.122.2 AND 255.255.255.0 = 10.100.122.0
- 主机地址计算:10.100.122.2 AND 0.0.0.255(255.255.255.0的反码)= 0.0.0.2
网络地址10.100.122.0表示所有以此地址开始的设备都位于同一子网内。主机号2指的是该子网内的特定设备。
子网掩码的作用
通过改变子网掩码,可以控制子网的大小。更多的位分配给网络部分意味着更多的子网,但每个子网中可以有的主机数就更少;相反,更多的位分配给主机部分意味着更少的子网,但每个子网可以包含更多的主机。子网掩码的设计使得网络管理员可以根据需要灵活地划分网络,以适应不同的网络规模和需求。
IP寻址
IP寻址的基本过程包括确定目标设备的IP地址,然后利用子网掩码来区分网络地址和主机地址。在数据包的传输过程中,网络地址用于确定目标设备位于哪个子网,而主机地址则用于识别该子网内的具体设备。只有当数据包到达了正确的子网,它才能被送达给正确的主机。
路由
路由是决定数据包从源头到目的地之间传输路径的过程。路由器在这个过程中起着至关重要的作用:
- 路径决定:路由器利用路由表来决定数据包的最佳路径。路由表包含了不同目的地的IP地址范围和对应的下一跳地址。下一跳可以是另一个路由器,这样数据包就通过一系列跳跃,最终到达目的地。
- 子网间转发:当数据包到达一个网络节点(如路由器)时,路由器检查目标IP地址,确定下一步应该转发到哪个子网或直接到达的主机。
- 动态路由协议:在复杂的网络环境中,路由器通过动态路由协议(如OSPF、BGP)自动更新路由表信息,以应对网络变化,确保数据包沿着最佳路径传输。
数据包转发
当路由器接收到一个数据包时,它首先检查数据包的目标IP地址,然后与路由表中的记录进行匹配,找出最合适的下一跳。如果目标地址在直接连接的网络中,数据包将直接发送到目标主机。如果不在,数据包将被转发到下一跳路由器。这一过程会一直重复,直到数据包到达最终目的地。
通过这种方式,即使在一个由数以千计的网络和设备构成的复杂互联网环境中,数据包也能够通过寻址和路由的机制找到一条路径,从而成功地从发送者传输到接收者。
所以,IP 协议的寻址作⽤是告诉我们去往下⼀个⽬的地该朝哪个⽅向⾛,路由则是根据「下⼀个⽬的地」选择路径。寻址更像在导航,路由更像在操作⽅向盘。
⽹络接⼝层(数据链路层)
网络接口层,也称为链路层或数据链路层,是负责网络物理实体间数据传输的网络模型的一部分。它直接与网络的物理连接(如以太网、WiFi)打交道,确保数据能够在物理网络上有效地传输。
MAC地址
- 定义:MAC(媒体访问控制)地址是链路层地址,用于标识网络上的设备。每个网络接口卡(Network Interface Card, NIC)都有一个全球唯一的MAC地址,确保在局域网中每个设备都可以被唯一识别。
- 作用:在数据链路层,数据包是通过MAC地址来寻址的,而不是IP地址。这意味着,为了在局域网内部发送数据包,发送方需要知道接收方的MAC地址。
ARP协议
ARP(地址解析协议)是一种网络协议,用于将网络层的地址(如IP地址)解析为链路层的地址(如MAC地址)。当一个设备想要与同一局域网内的另一个设备通信时,但只知道其IP地址,它可以使用ARP协议来查询对应的MAC地址。
数据包的封装过程
-
网络层:数据包在网络层被赋予一个IP头部,标识了数据包的源IP地址和目标IP地址。
-
链路层:数据包下发到链路层时,链路层会在IP头部的前面加上MAC头部,其中包含了源MAC地址和目标MAC地址。这个过程中,如果不知道目标MAC地址,会先使用ARP协议进行查询。
-
发送数据帧:经过MAC头部封装的数据包变成了一个完整的数据帧,然后通过物理介质(如以太网线、WiFi信号)发送出去。
综上所述,TCP/IP ⽹络通常是由上到下分成 4 层,分别是应⽤层,传输层,⽹络层和⽹络接⼝层。

每⼀层的封装格式:

⽹络接⼝层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报⽂(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
相关文章:

TCP/IP ⽹络模型
TCP/IP ⽹络模型 对于同⼀台设备上的进程间通信,有很多种⽅式,⽐如有管道、消息队列、共享内存、信号等⽅式,⽽对于不同设备上的进程间通信,就需要⽹络通信,⽽设备是多样性的,所以要兼容多种多样的设备&am…...

云原生:重塑未来应用的基石
随着数字化时代的不断深入,云原生已经成为了IT领域的热门话题。它代表着一种全新的软件开发和部署范式,旨在充分利用云计算的优势,并为企业带来更大的灵活性、可靠性和效率。今天我们就来聊一聊这个热门的话题:云原生~ Ǵ…...
蓝桥杯day4刷题日记
P8605 [蓝桥杯 2013 国 AC] 网络寻路 思路来源于https://www.luogu.com.cn/article/iat8irsf #include <iostream> using namespace std; int n,m; int q[10010]; int v[100010],u[100010]; long long res;int main() {cin>>n>>m;for(int i0;i<m;i){cin…...

[Qt学习笔记]Qt下使用Halcon实现采图时自动对焦的功能(Brenner梯度法)
目录 1、介绍2、实现方法2.1 算法实现过程2.2 模拟采集流程 3、总结4、代码展示 1、介绍 在机器视觉的开发中,现在有很多通过电机去做相机的聚焦调节,对比手工调节,自动调节效果更好,而且其也能满足设备自动的需求,尤…...

常州IGM机器人RTE497的日常维修保养方法
一、IGM机器人RTE497日常检查 每日工作前,进行以下检查: 外观检查:确认IGM机器人RTE497本体无明显损伤,各部件连接稳固。 电缆检查:检查所有电缆、气管等是否完好,无磨损、无挤压。 润滑检查:确…...
如何利用机器学习和Python编写预测模型来预测设备故障
预测设备故障是机器学习和数据科学的一个常见问题,通常可以通过以下几个步骤来解决: 1. 数据收集 首先,需要收集与设备运行相关的数据,包括: 设备的历史数据环境数据(如温度、湿度等)使用时间…...

mysql部署(2)主从复制
在前面的基础上,现有26、41两个mysql8的实例,下面以26为主41为从搭建主从复制: 机器主从端口号root密码主从复制账号密码xxx.xx.xxx.26主3306Mysql#26user1/user1#26xxx.xx.xxx.41从3306Mysql#41 一、master主库配置 1、修改mysql配置文件…...

FX-数组的使用
1一维数组 1.1一维数组的创建和初始化 1.1.1数组的创建 //代码1 int arr1[10]; char arr2[10]; float arr3[1]; double arr4[20]; //代码2 //用宏定义的方式 #define X 3 int arr5[X]; //代码3 //错误使用 int count 10; int arr6[count];//数组时候可以正常创建࿱…...

springboot283图书商城管理系统
图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理…...
FFmpeg-- c++实现:音频流aac和视频流h264封装
文章目录 流程api核心代码muxer.hmuxer.cpp aac 和 h264 封装为视频流,封装为c的Muxter类 流程 分配视频文件上下文 int Init(const char *url); 创建流,赋值给视频的音频流和视频流 int AddStream(AVCodecContext *codec_ctx); 写视频流的head int Se…...
单片机烧录方式,JTAG,ISP,SWD,
常见的词汇 参考 ISP:In System Programing,在系统编程 IAP:In Application Programing,在应用编程 ICP:In Circuit Programing,在电路编程 ICSP全称是In Circuit Serial Programming JTAG(Joint Test Act…...

【项目管理后台】Vue3+Ts+Sass实战框架搭建一
项目管理后台 建立项目最好是卸载Vetur 新建.env.d.ts文件安装Eslint安装校验忽略文件添加运行脚本 安装prettier新建.prettierrc.json添加规则新建.prettierignore忽略文件 安装配置stylelint新建.stylelintrc.cjs 添加后的运行脚本配置husky配置commitlint配置husky 强制使用…...

基于python 变配电室运行状态评估与预警系统flask-django-nodejs-php
变配电室电气设备运行状态和环境信息缺乏必要的监测评估预警手段,如有一日遭遇突发情况,将危及电气设备安全稳定运行,易造成设备损坏和电力供应中断[2]。 目前,我国变配电室常采用无人管理的室内站设计方案,长期以来变配电室运维工…...
【自记录】VS2022编译OpenSSL1.0.2u
因为突然要编译一个老工程,老工程里面用到了OpenSSL 1.0.x。 于是官网下载了最后一个1.0.x版本1.0.2u。 1 下载安装Perl 去Perl官网下载即可。 使用vcpkg直接安装也可以,比前者更方便 vcpkg install perl #根据实际路径调整 set PATHD:\vcpkg\downloa…...
ES代替品:轻量级搜索引擎MeiliSearch
痛点 虽然Elasticsearch足够灵活强大、扩展性和实时性也较好。但是对于中小型项目来说,Elasticsearch还是显得有些庞大,对硬件设备的要求也较高。那么,在要求不是很高的情况下,我们可以考虑另一种搜索引擎方案:MeiliSe…...

用C语言打造自己的Unix风格ls命令
在Unix或类Unix操作系统中,ls是一个非常基础且实用的命令,它用于列出当前目录或指定目录下的文件和子目录。下面,我们将通过C语言编写一个简化的ls命令,展示如何利用dirent.h头文件提供的函数接口实现这一功能。 #include "…...

git的起源
开篇一张图: 开源项目linux kernel开发,参与开发与维护者众多。1991至2005年期间绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上。 在2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维…...

软件杯 深度学习 python opencv 火焰检测识别
文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…...
C# double类型计算精度问题解决
问题:res 的值0.112450000001,精度不对,预期是0.11245 double force112.45; double res force / Math.Pow(10, index * 3); double force112.45; double res force / Math.Pow(10, index * 3); string str res.ToString(&qu…...

基于Springcloud+Vue校园招聘系统 Eureka分布式微服务
以行动研究为主,辅以文献法、教育实验法和个案研究法等方法相结合的研究方法。在研究方法,遵循软件工程中软件生命周期的规则。概括来讲可以划分成三大步:系统规划、系统开发和系统运行维护。将其上述步骤细分下来,可以分为以下8小…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...