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

网络IP协议

IP(Internet Protocol,网际协议)是TCP/IP协议族中重要的协议,主要负责将数据包发送给目标主机。IP相当于OSI(图1)的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点对点(point-to-point)通信。

 图1:OSI参考模型

1. IP的功能作用

1)IP寻址

作为网络层的IP,一般称为IP地址,主要用于在连接到网络中的所有主机中识别出进行通信的目标地址,因此在TCP/IP通信中所有主机(在互联网中,将那些配有IP地址的设备叫主机,严格意义上说,配有IP地址且不进行路由控制的设备叫主机,既配有IP地址又具有路由控制能力的设备叫路由器,而节点则是主机和路由器的统称。)或路由器必须设定自己的IP地址。如图2所示,连接互联网的主机需要配置IP地址,不论哪一台主机与哪种数据链路连接,其IP地址的形式都一样,以太网、无线局域网、PPP等都不会改变IP地址的形式。另外,在网桥或交换机集线器等物理层或者数据链路层数据包转发设备中,不需要设置IP地址。因为这些设备只负责将IP包转化为0、1比特流转发或对数据链路帧的数据部分进行转发,而不需要应对IP协议。

图2:主机在互联网互联需要IP地址

2)路由

路由控制(Routing)是指将分组数据发送到最终目标地址的功能。即使网络很复杂,也可以通过路由控制确定到达目标地址的通路。一旦这个路由控制的运行出现异常,分组数据极有可能“迷失”,无法到达目标地址。因此,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。

IP包在网路中一个个跳间(一跳(1Hop)是指利用数据链路层以下分层的功能传输数据帧的一个区间。以太网等数据链路中使用MAC地址传输数据帧。此时的一跳是指从源MAC地址到目标MAC地址之间传输帧的区间。也就是说它是主机或路由器网卡不经其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间。在一跳的这个区间内,电缆可以通过网桥或交换集线器相连,不会通过路由器或网关相连)被转发,因此IP路由也叫多条路由。在每一个区间内决定着包在下一跳被转发的路径。

多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全都指定出来。因为每一个区间(跳)在转发IP数据包时会分别指定下一跳的操作,直至包达到最终的目标地址。

为了将数据包发给目标主机,所有主机都维护着一张路由控制表(Routing table)。该表记录IP数据在下一步应该发给哪个路由器。IP包将根据这个路由表在各个数据链路上传输。

  图3:路由控制表

3)IP分包和组包

 IP是失陷多个数据链路之间通信的协议。数据链路根据种类的不同各有特点。对不同数据链路的特异性进行抽象化也是IP的重要作用。不同数据链路有个最大的区别,就是各自的最大传输单位(Maximum Transmission Unit,MTU)不同。以太网的MTU是1500字节,FDDI(Fiber Distributed Data Interface,光纤分布式数据接口)的MTU是4352字节,ATM(Automated Teller Machine,自动取款机)的MTU是9180字节。IP的上一层会要求传送比MTU更多字节的数据,因此必须在线路上传送比包长还要小的MTU。为解决这个问题,IP进行分片处理(IP Fragmentation)。所谓分片处理就是将较大的IP包分成多个较小的IP包。分片的包到了对端目标地址后再被组合起来传给上一层。从IP的上层看,它完全可以忽略数据包在途中的各个数据链路上的MTU,而只需要按照源地址发送的长度接收数据包。IP就实现了数据链路层的抽象,使得从上层更不容易看到底层网络构造的细节。

4)IP属于无连接型

IP面向无连接,也就是在发包之前,不需要建立与目标地址之前的连接。当数据链路层有需要发送的数据,该数据会立即被压缩成IP包发送出去。而面向有连接的情况则不同,目标主机关机或者不存在则不可能建立连接,那么也不可能发送数据过去。为什么IP要采用面向无连接呢?原因在于简化和提速。有连接型要比无连接型复杂的多,如前期需要握手,而且在处理连接过程中,需要耗费时间。   

IP提供尽力服务(Best Effort),就是尽最大努力将数据包发送到最终目标地址,然而其并不做“最终是否收到的验证”。因此IP数据包在途中可能会发生丢失、错位以及数据翻倍等问题。为了提高通信的可靠性,TCP发挥重要作用,如果说IP只负责将数据发给目标主机,那么TCP则负责保证对目标确实收到数据。为什么不让IP具有可靠传输的功能呢?原因在于如果要一种协议规定所有的功能和作用,那么该协议的具体实现和编程会变得非常复杂,无法轻易实现,而且难以维护。相比而言,按照网络分层,明确定义每层协议的作用和责任后,针对每层具体的协议进行编程会更加有利于该协议的实现。   

2.   IP地址基础知识

1)IP地址定义

在使用TCP/IP通信时,用IP地址识别主机和路由器。为了保证正常通信,有必要为每个设备正确配置IP地址。IP地址分为IPv4和IPv6。IP地址(以IPv4为例)由32位正整数来表示。TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。IP地址在计算机内部以二进制(二进制是指用0、1表示数字的方法)方式被处理。而我们并不习惯用二进制方式计数,因而将32位的IP地址以每8位为一组,分为4组,每组以“.”隔开,再将每组数转为十进制数。以图4为例。注意在这里2进制转10进制=2^7 + 2^5 +2^3 + 2^2 = 172如图5,而10进制转2进制=10101100如图6。

 图4:IP地址数字表示

 

  图5:二进制转10进制计算方法

  图6:10进制转2进制计算方法

 将表示成IP地址的数字整体计算,最多大概允许2^32 = 4294967296台计算机连接到网络。

2)IP地址组成

IP地址由网络标识和主机标识两部分组成。例如IP地址192.168.128.10/24,“/24”表示从第一位到24位属于网络标识,在这里“192.168.128”属于网络标识也就是网络地址,而最后的“10”为主机标识也就是主机地址。网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的主机标识不允许在相同的网段内重复出现。由此,可以通过设置网络地址和主机地址在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠。即IP地址具有唯一性。如图7所示,IP包被转发到途中某个路由器时,正是利用目标IP地址的网络标识进行路由。路由器只要一看IP地址的网络标识就可以进行转发。

 

  图7:IP地址的网络标识

3)IP地址的分类

IP地址分为A类、B类、C类、D类四类。根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。如图8所示,A类IP地址是首位以“0”开头的地址从第1位到第8位是网络标识(去掉分类位剩下7位)。用十进制表示的话,0.0.0.0~127.0.0.0是A类的网络地址。A类地址的后24位相当于主机标识。因此一个网络内可容纳的主机地址上限为16,777,214个。B类地址是前两位为“10”的地址。从第1位到第16位是网络标识。用十进制表示的话,128.0.0.0~191.255.0.0是B类的网络地址。B类地址的后16位相当于主机标识。因此一个网络内可容纳的主机地址上限是65,534个。C类地址是前三位“110”的地址。从第1位到第24位是它的网络标识。用十进制表示的话,192.0.0.0~223.255.255.0是C类的网络地址。C类地址的后8位相当于主机标识,因此一个网络内可容纳的主机地址上限为254个。D类地址是前四位为“1110”的地址。从第1位到第32位是它的网路地址。用十进制表示的话,224.0.0.0~239.255.255.255是D类的网络地址。D类地址没有主机识别地址,常被用于多播。注意分配IP地址时,不可以全部为0或全部为1.因为全部为0在表示对应的网络地址或IP地址不可获知的情况下才使用。而全部为1的主机地址通常作为广播地址。因此C类地址的个数是2^8-2=254个。

 

  图8:IP地址的分类

 广播地址用于在同一个链路相互连接的主机之间发送数据包。将IP地址中的主机地址部分全部设置为1,就成了广播地址。在以太网中如果将MAC地址的所有位都改为1,则形成FF:FF:FF:FF:FF:FF的广播地址。因此广播的IP包以数据链路的帧的形式发送时,得通过MAC地址全为1比特的FF:FF:FF:FF:FF:FF转发。例如把172.20.0.0/16用二进制表示:10101100.00010100.00000000.00000000,将这个地址的主机部分全部改为1,则形成广播地址:10101100.00010100.11111111.11111111再将这个地址用十进制表示,则为172.20.255.255。

 广播分为本地广播和直接广播两种。在本网络内的广播叫做本地广播。例如网络地址为192.168.0.0/24的情况下,广播地址是192.168.0.255。因为这个广播地址的IP包会被路由器屏蔽,所以不会到达192.168.0.0/24以外的其他链路上。在不同网络之间的广播叫做直接广播。例如网络地址为192.168.0.0/24的主机向192.168.1.255/24的目标地址发送IP包。收到这个包的路由器,将数据转发给192.168.1.0/24,从而使得所有192.168.1.1~192.168.1.254的主机都能收到这个包,由于直接广播有一定的安全问题,所以多数情况下载路由器上设置为不转发。

2. IP数据报文格式

 图9:IPv4数据报格式

通过IP进行通信时,需要在数据的前面加入IP首部信息。IP首部中包含着用于IP协议进行发包控制时所有的必要信息。如图9所示为IPv4数据报格式。

1)IPv4首部

  • 版本(Version)

      由4比特构成,表示标识IP首部的版本号。IPv4的版本号为4,因此在这个字段上值也是4。

  • 首部长度(IHL:Internet Header Length)

      由4比特构成,表明IP首部的大小,单位为4字节(32比特)。对于没有可选项的IP包,首部长度则设为5.也就是说在没有可选项时,IP首部的长度为20字节。

  • 区分服务(TOS:Type Of Service)

      由8比特构成,用来表明服务质量。每一位的具体含义如表所示。

比特含义
0 1 2优先度
3最低延迟
4最大吞吐
5最大可靠性
6最小代价
(3~6)最大安全
7未定义

这个值通常由应用指定。而且现在也鼓励这种结合应用的特性设定TOS的方法。然而在目前,几乎所有的网络都无视这些字段。这不仅仅是因为在符合质量要求的情况下按其要求发送本身的功能实现起来十分困难,还因为若不符合质量要求就可能会产生不公平的现象。因此实现TOS控制变得极其复杂。这也导致TOS整个互联网几乎就没有被投入使用。不过已有人提出将TOS字段本身再划分为DSCP(Differentiated Services Codepoint)和ECN(Explicit Congestion Notification)两个字段的建议。在图10中DSCP和ECN分别为6比特和2比特。DSCP(Differential Services Codepoint,差分服务代码点)是TOS(Type Of Service)的一部分。现在统称为DiffServ,用来进行质量控制。ECN(Explicit Congestion  Notification,显示拥塞通告)用来报告网络拥堵情况。第6位的ECT用以通告上层TCP协议是否处理ECN。当路由器在转发ECN为1的包的过程中,如果出现网络拥堵的情况,就将CE位设置为1。

 图10:DSCP和ECN

比特简称含义
6ECTECN-Capable Transport
7CECongestion Experienced
  • 总长度(Total Length)

      表示IP首部与数据部分合起来的总字节数。该字段长16比特。因此IP包的最大长度65535(=2^16)字节。目前还不存在能够传输最大长度为65535字节的IP包的数据链路。不过由于有IP分片处理,从IP的上一层的角度看,不论底层采用哪种数据链路,都可以认为能够以IP的最大包长传输数据。

  • 标识(ID:Identification)

      由16比特构成,用于分片重组。同一个分片的标识值相同,不同分片的标识值不同。通常每发送一个IP包,它的值也逐渐递增。此外,即使ID相同,如果目的地址、源地址或协议不同的话,也会被认为是不同的分片。

  • 标志(Flags)

      由3比特构成,表示包被分片的相关信息。每一位的具体含义参考下表:

比特含义
0未使用。现在必须是0
1

指示是否进行分片(don't fragment)

0-可以分片

1-不能分片

2

包被分片的情况下,表示是否为最后一个包(more fragment)。

0-最后一个分片的包

1-分片中段的包

  • 片偏移(FO:Fragment Offset)

      由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的值为0.由于FO字段占13位,因此最多可以表示8192(=2^13)个相对位置。单位为8字节,因此最大可表示原始数据8*8192=65535字节的位置。

  • 生存时间(TTL:Time To Live)

      由8比特构成,它最初的意思是以秒为单位记录当前包在网络上应该生存的期限。然而在实际中它是指可以中转多少个路由器的意思。没经过一个路由器,TTL会减少1,直到变成0则丢弃该包。

  • 协议(Protocol)

      由8比特构成,表示的是IP包传输层的上层协议编号。目前常使用的协议如下表所示

分配编号简称协议
0HOPOPTIPv6 Hop-by-Hop Option
1ICMPInternet Control Message
2IGMPInternet Group Management
4IPIP in IP(encapsulation)
6TCPTransmission Control
8EGPExterior Gateway Protocol
9IGP any private interior gateway(Cisco IGRP)
17UDPUser Datagram
33DCCPDatagram Congestion Control Protocol
41IPv6IPv6
43IPv6-Route

Routing Header for IPv6

44IPv6-FragFragment Header for IPv6
46RSVPReservation Protocol
50ESPEncap Security Payload
51AHAuthentication Header
58IPv6-ICMPICMP for IPv6
59IPv6-NoNxtNo Next Header for IPv6
60IPv6-OptsDestination Options for IPv6
88EIGRPEIGRP
89OSPFIGPOSPF
97ETHERIPEthernet-within-IP Encapsulation
103PIMProtocol Independent Multicast
108IPComp IP Payload Compression Protocol
112VRRPVirul Router Redundancy Protocol
115L2TPLayer Two Tunneling Protocol
124ISIS over IPv4ISIS over IPv4
132SCTPStream Control Transmission Protocol
133FCFibre Channel
134RSVP-E2E-IGNORERSVP-E2E-IGNORE
135Mobility Header(IPv6)Mobility Header(IPv6)
136UDPLiteUDP-Lite
137MPLS-in-IPMPLS-in-IP

  • 首部校验和(Header Checksum)

      由16比特(2字节)构成,也叫IP首部校验和。该字段只校验数据报的首部,不校验数据部分。它主要用来确保IP数据报不被破坏。校验和的计算过程,首先要将该校验和的所有位置设置为0,然后以16比特为单位划分IP首部,并用1补数计算所有16位字的和。最后将所 得到这个和的1补数赋给首部校验和字段。

  • 源地址(Source Address)

      由32比特(4字节)构成,表示发送端IP地址

  • 目的地址(Destination Address)

      由32比特(4字节)构成,表示接收端IP地址

  • 可选项(Options)

      长度可变,通常只在进行实现或诊断时使用。该字段包含如下几点信息:

    • 安全级别
    • 源路径
    • 路径记录
    • 时间戳
  • 填充(Padding)

      也称为填充物。在有可选项的情况下,首部长度可能不是32比特的整数倍。为此,通过向字段填充0,调整为32比特的整数倍。

  • 数据(Data)

      存入数据。将IP上层协议的首部也作为数据进行处理。

相关文章:

网络IP协议

IP(Internet Protocol,网际协议)是TCP/IP协议族中重要的协议,主要负责将数据包发送给目标主机。IP相当于OSI(图1)的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…...

双指针算法详解

目录 一、双指针 二、双指针题目 1.移动零 解法: 代码: 2.复写零 ​编辑 解法: 代码: 边界情况处理: 3.快乐数 ​编辑 解法:快慢指针 代码: 4.盛水最多的容器 解法:(对撞指针)…...

MySQL的最左匹配原则是什么

最左匹配原则是应用于联合索引的规则。 对于以下表F:f1,f2,f3;建立了联合索引(f2,f3),那么我们在查询的时候如果是: select * from F where f2 ? and f3 ?; 或 sele…...

LeetCode:106.从中序与后序遍历序列构造二叉树

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:106.从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder …...

22. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--切换主币种

这篇文章我们将结合主币种设置以及收支记录实现切换主币种后重新计算以前记录的转换后的金额。那么,为什么要在切换主币种后要重新计算转换后的金额呢?有以下两个原因: 统一的币种,方便我们统计数据方便用户按照当地的币种查看收…...

01.02周四F34-Day43打卡

文章目录 1. 地是湿的。昨晚估计下雨了。2. 你可能把包丢在餐厅里了吧?3. 她说他可能误了航班。4. 我本来应该早点来的,但路上特别堵。5. 约翰可能在那次事故中受了重伤。6. 这是一个情景对话7. 我本可以走另一条路的。8. 我准是瘦了不少,你看我这裤子现在多肥。9. 钱没了!会…...

行业商机信息付费小程序系统开发方案

行业商机信息付费小程序系统,主要是整合优质行业资源,实时更新的商机信息。在当今信息爆炸的时代,精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览:用户在工作间隙或闲暇时间&#xff0c…...

cut-命令详解

一、命令 1.cut列截取命令 cut命令的默认分隔符是制表符 2.参数: -f 列号 #提取第几列-d 分隔符 #按照指定分隔符分割列-c 字符范围 #不依赖分隔符来区分列,而是通过字符范围(行首为0)来进行字段提取。“n-”表…...

Apache MINA 反序列化漏洞CVE-2024-52046

漏洞描述: Apache MINA 是一个功能强大、灵活且高性能的网络应用框架。它通过抽象网络层的复杂性,提供了事件驱动架构和灵活的 Filter 链机制,使得开发者可以更容易地开发各种类型的网络应用。 Apache MINA 框架的 ObjectSerializationDeco…...

二、AI知识(神经网络)

二、AI知识(神经网络) 1.常用算法 FNN CNN RNN LSTM DNN GRU 2.深度学习中概念及算法 1. 感知机 感知机(Perceptron)是一种最早的人工神经网络模型之一,通常用来解决二分类问题。它由弗兰克罗森布拉特&#…...

node.js之---子线程(child_process)模块

为什么需要子线程(child_process)模块 Worker Threads 的基本概念 如何使用 Worker Threads Worker Threads 的性能 Worker 线程的优势和限制 进阶用法:共享内存 为什么需要子线程(child_process)模块 在 Node.js…...

Json字符串解析失败

通过第三方服务,拿到响应体的data对象(拿到的时候对象是有值的) 通过JSON.parseObject方法,拿到的对象,值为null 通过查看对应的json字符串,发现命名不一样... JSONField SeriealizedName注解是用来解析j…...

LeetCode算法题——螺旋矩阵ll

题目描述 给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix 。 示例 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]题解 思路: 将整个过程分解为逐圈填充的过程&#xf…...

【开源社区openEuler实践】hpcrunner

title: 探索 Hpcrunner:高性能计算的得力助手 date: ‘2024-12-31’ category: blog tags: Hpcrunner高性能计算任务调度资源优化 sig: HPC archives: ‘2024-12’ author:way_back summary: Hpcrunner 作为高性能计算领域的一款实用工具,专注于优化任务…...

linux下安装达梦数据库v8详解

目录 操作系统、数据库 1、下载达梦数据库 2、安装前准备 2.1、建立数据库用户和组 2.2、修改文件打开最大数 2.3、挂载镜像 2.4、新建安装目录 3、数据库安装 4、配置环境变量 5、初始化数据库实例 6、注册服务 7、使用数据库 8、卸载数据库 9、多实例管理 10、…...

Redis的常用命令

Redis中文字典网站 redis 命令手册https://redis.com.cn/commands.html Keys * 查看当前库所有的key exists ke 判断某个key是否存在 type key查看你的key是什么类型 Del key删除执行的key数据 unlink key非阻塞删除,仅仅将keys从keyspace元数据中删除&#xf…...

Docker入门常用命令总结

1.从远程仓库拉取一个纯净的镜像 docker pull docker .io/centos 2.创建并进入容器(左外右内) docker run --name xxx -dit 镜像id(镜像名称:Tag) /bin/bash 【参数必须放在镜像ID之前】 -i 让Docker分配一个伪终端,并…...

【Qt】容器控件、布局管理控件

目录 容器控件 QGroupBox QTabWidget 布局管理控件 QVBoxLayout 例子: QHBoxLayout 例子: QGridLayout 例子: 例子: QFormLayout 例子: QSpacerItem 例子: 容器控件 QGroupBox 表示一个带有…...

cesium小知识:常见的20多种property详解

要详细解释 Cesium 中所有的 Property 类,内容确实会非常丰富且详尽。 Property 基础 Property 是 Cesium 中用于表示随时间或条件变化的值的基础类。它允许你定义属性值如何根据时间、用户交互或其他逻辑动态改变。Property 的设计使得你可以创建复杂的动画和交互效果,而…...

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中,探索了多种可能的系统扩展方式,以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能,以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...