首页
关于
留言
壁纸
更多
直播
统计
友链
Search
1
好用的软件分享
354 阅读
2
最新Navicat 15 for MySQL破解+教程 正确破解步骤
261 阅读
3
面试常见问题100问
218 阅读
4
一个人要走的时候,千万别问原因
182 阅读
5
直击心灵的唯美句子
144 阅读
日常记录
后端
PHP
NodeJs
Python
Java
前端
JavaScript
数据库
MySQL
服务器
美文
微信开发
微信公众号
微信小程序
编程
登录
Search
标签搜索
mysql
python
django
express
面试
axios
thinkphp
PHP
励志
哲理
九九乘法表
node
cors
跨域
唯美句子
美文
文件上传
ajax
算法
jwt
公子初心
累计撰写
74
篇文章
累计收到
9
条评论
首页
栏目
日常记录
后端
PHP
NodeJs
Python
Java
前端
JavaScript
数据库
MySQL
服务器
美文
微信开发
微信公众号
微信小程序
编程
页面
关于
留言
壁纸
直播
统计
友链
搜索到
74
篇与
的结果
2023-12-17
揭开HTTPS神秘面纱
http是非常常见的应用层协议,是超文本传输协议的简称,其传输的内容都是明文的。在这个混乱的世界,明文传输信息想想就可怕,网络“小混混”的手段远比我们这些凡人高明得多,他们有一万种方式劫持,篡改我们的数据。对于一个网站或者服务,如果你给你的用户两个选择:通讯数据明文传输,速度快;通讯数据加密传输,但是速度可能会稍微慢一点.我想,只要脑袋没有长歪的用户都宁愿牺牲一点速度去换取数据传输的安全。这样,https的存在就具备了合理性,https中的s表示SSL或者TLS,就是在原http的基础上加上一层用于数据加密、解密、身份认证的安全层。一层层揭开HTTPS神秘面纱本文试图通过层层渐进方式来通俗的阐述https的原理,若有错误,欢迎大家指正。虽然要层层渐进,但是我们不妨先奉上刚画好的还热乎着的https通信完整流程图:从上图可以看到,右边有一堆钥匙,一看到钥匙我们就能想到这个过程免不了加密。另外,那些钥匙长得还不一样,有些只有一把,有些是一对,嗯,是的,你看得真仔细。好的,扯远了,现在开始层层渐进。第一层(安全传输数据)假如我们要实现一个功能:一个用户A给一个用户B发消息,但是要保证这个消息的内容只能被A和B知道,其他的无论是墨渊上神还是太上老君都没办法破解或者篡改消息的内容。如上图,需求就是这么简单,A给B发一条消息,因为比较私密,不想被其他人看到。由于消息不想被其他人看到,所以我们自然而然就会想到为消息加密,并且只有A和B才有解密的密钥。这里需要考虑几点:使用什么加密方式?密钥怎么告知对方?对于第一个问题,加密算法分为两类:对称加密和非对称加密,这里我们选择对称机密,原因有如下几个:对称加密速度快,加密时CPU资源消耗少;非对称加密对待加密的数据的长度有比较严格的要求,不能太长,但是实际中消息可能会很长(比如你给你女朋友发情书),因此非对称加密就满足不了;对于第二个问题,这是导致整个https通信过程很复杂的根本原因。如果A或B直接把他们之间用于解密的密钥通过互联网传输给对方,那一旦密钥被第三者劫持,第三者就能正确解密A,B之间的通信数据。第二层(安全传输密钥)通过第一层的描述,第二层需要解决的问题是:安全地传输A,B之间用于解密数据的密钥。因为如果传输过程中这把密钥被第三者拿到了,就能解密传通信数据,所以,这把密钥必须得加密,就算第三者劫持到这把加密过的密钥,他也不能解密,得到真正的密钥。这里有一个问题,那要用什么方式加密这把密钥呢?如果使用对称加密,那这个对称加密的密钥又怎么安全地告诉对方呢?完了,陷入死循环了.... 所以,一定不能用对称加密那就是用非对称加密咯,那如何应用非对称加密来加密那把密钥呢?考虑如下方式:客户端: 我要发起HTTPS请求,麻烦给我一个非对称加密的公钥;服务器: (生成一对非对称加密的密钥对,然后把公钥发给客户端),接着,这是公钥;客户端:(收到公钥,生成一个随机数,作为上图中那一把密钥,用刚才收到的公钥加密这个密钥,然后发给服务器)这是我刚生成的加密过的密钥;服务器:(收到加密后的密钥,用本地的第一步自己生成的非对称加密的私钥解密,得到真正的密钥);现在,客户端和服务器都知道了这把密钥,就能愉快地用这个密钥对称加密数据...分析一下上面步骤的可行性:上述步骤中最终用于加密数据的密钥是客户端生成并且用公钥加密之后传给服务器的,因为私钥只有服务器才有,所以也就只有服务器才能解开客户端上报的密钥;要保证传输的密钥只能被服务器解密,就得保证用于加密密钥的公钥一定是服务器下发的,绝对不可能被第三方篡改过;因为还可能存在一种"中间人攻击"的情况,如下图:感谢XngPro的指正,上图第7步,应该是『坏人用B私钥解密得到K,然后使用A公钥加密发给服务器』这种情况下,客户端和服务器之间通信的数据就完全被坏人破解了。第三层(安全传输公钥)从上一层可以知道,要保证数据的安全,就必须得保证服务器给客户端下发的公钥是真正的公钥,而不是中间人伪造的公钥。那怎么保证呢?那就得引入数字证书了,数字证书是服务器主动去权威机构申请的,证书中包含了上一个图中的加密过的A公钥和权威机构的信息,所以服务器只需要给客户端下发数字证书即可。现在流程图如下:那数字证书中的A公钥是如何加密的呢?答案是非对称加密,只不过这里是使用只有权威机构自己才有的私钥加密。等一下,既然A公钥被权威机构的私钥加密了,那客户端收到证书之后怎么解密证书中的A公钥呢?需要有权威机构的公钥才能解密啊!那这个权威机构的公钥又是怎么安全地传输给客户端的呢?感觉进入了鸡生蛋,蛋生鸡的悖论了~~别慌,答案是权威机构的公钥不需要传输,因为权威机构会和主流的浏览器或操作系统合作,将他们的公钥内置在浏览器或操作系统环境中。客户端收到证书之后,只需要从证书中找到权威机构的信息,并从本地环境中找到权威机构的公钥,就能正确解密A公钥。这样就绝对安全了吗?既然权威技能能给服务器签发数字证书,那为什么就不可能给中间人签发数字证书呢?毕竟赚钱的生意权威机构也不会拒绝的呀。试想一下:服务器给客户端下发数字证书时证书被中间人劫持了,中间人将服务器的证书替换成自己的证书下发给客户端,客户端收到之后能够通过权威机构的公钥解密证书内容(因为中间人的证书也是权威机构私钥加密的),从而获取公钥,但是,这里的公钥并不是服务器原本的A公钥,而是中间人自己证书中的B公钥。从第二层可知,如果不能保证客户端收到的公钥是服务器下发的,那整个通信数据的安全就没法保证。简单总结就是证书被调包~所以,还得保证客户端收到的证书就是服务器下发的证书,没有被中间人篡改过。第四层(安全传输证书)这一层,我们的任务是:保证客户端收到的证书是服务器下发的证书,没有被中间人篡改过。所以,这里就有两个需求:证明证书内容没有被第三方篡改过;证明证书是服务器下发的;其实这些问题,数字证书本身已经提供方案了,数字证书中除了包含加密之后的服务器公钥,权威机构的信息之外,还包含了证书内容的签名(先通过Hash函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名。这样一来,客户端收到证书之后:使用权威机构的公钥解密数字证书,得到证书内容(服务器的公钥)以及证书的数字签名,然后根据证书上描述的计算证书签名的方法计算一下当前证书的签名,与收到的签名作对比,如果一样,表示证书一定是服务器下发的,没有被中间人篡改过。因为中间人虽然有权威机构的公钥,能够解析证书内容并篡改,但是篡改完成之后中间人需要将证书重新加密,但是中间人没有权威机构的私钥,无法加密,强行加密只会导致客户端无法解密,如果中间人强行乱修改证书,就会导致证书内容和证书签名不匹配。所以证书签名就能判断证书是否被篡改再考虑证书被掉包的情况:中间人同样可以向权威机构申请一份证书,然后在服务器给客户端下发证书的时候劫持原证书,将自己的假证书下发给客户端,客户端收到之后依然能够使用权威机构的公钥解密证书,并且证书签名也没问题。但是这个时候客户端还需要检查证书中的域名和当前访问的域名是否一致。如果不一致,会发出警告!从上面的分析可以看到,数字证书中的信息确实能让客户端辨别证书的真伪。
2023年12月17日
20 阅读
0 评论
0 点赞
2023-12-17
PHP生成二维码
本地下载 二维码是一个近几年来移动设备上超流行的一种编码方式,最早出现在20世纪20年代,到1988年才引入中国。现在,日常生活中更是随处可见。它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。下面通过一些小案例,不靠第三方平台,轻松制作自己的二维码图片QRCodeQR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。超高速从QR Code码的英文名称Quick Response Code可以看出,超高速识读特点是QR Code码区别于四一七条码、Data Matrix等二维码的主要特性。由于在用CCD识读QR Code码时,整个QR Code码符号中信息的读取是通过QR Code码符号的位置探测图形,用硬件来实现,因此,信息识读过程所需时间很短,它具有超高速识读特点。用CCD二维条码识读设备,每秒可识读30个含有100个字符的QR Code码符号;对于含有相同数据信息的四一七条码符号,每秒仅能识读3个符号;对于Data Matrix矩阵码,每秒仅能识读2~3个符号。QR Code码的超高速识读特性使它能够广泛应用于工业自动化生产线管理等领域。全方位QR Code码具有全方位(360°)识读特点,这是QR Code码优于行排式二维条码如四一七条码的另一主要特点,由于四一七条码是将一维条码符号在行排高度上的截短来实现的,因此,,它很难实现全方位识读,其识读方位角仅为±10°。能够有效地表示汉字由于QR Code码用特定的数据压缩模式表示汉字,它仅用13bit可表示一个汉字,而四一七条码、Data Matrix等二维码没有特定的汉字表示模式,因此仅用字节表示模式来表示汉字,在用字节模式表示汉字时,需用16bit(二个字节)表示一个汉字,因此QR Code码比其它的二维条码表示汉字的效率提高了20%。参数$level表示容错率,也就是有被覆盖的区域还能识别。它有四个级别,分别是 L, H, M, QQR_ECLEVEL_L, 最大 7% 的错误能够被纠正;QR_ECLEVEL_M, 最大 15% 的错误能够被纠正;QR_ECLEVEL_Q, 最大 25% 的错误能够被纠正;QR_ECLEVEL_H, 最大 30% 的错误能够被纠正;include 'phpqrcode.php'; $value = 'https://www.itnan.cc'; //二维码内容 $errorCorrectionLevel = 'L';//容错级别 $matrixPointSize = 6;//生成图片大小 QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2); //生成二维码图片 $logo = 'logo.jpg';//准备好的logo图片 $QR = 'qrcode.png';//已经生成的原始二维码图 if ($logo !== FALSE) { $QR = imagecreatefromstring(file_get_contents($QR)); $logo = imagecreatefromstring(file_get_contents($logo)); $QR_width = imagesx($QR);//二维码图片宽度 $QR_height = imagesy($QR);//二维码图片高度 $logo_width = imagesx($logo);//logo图片宽度 $logo_height = imagesy($logo);//logo图片高度 $logo_qr_width = $QR_width / 5; $scale = $logo_width/$logo_qr_width; $logo_qr_height = $logo_height/$scale; $from_width = ($QR_width - $logo_qr_width) / 2; //重新组合图片并调整大小 imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height); } //输出图片 imagepng($QR,'phpmaster.png');
2023年12月17日
34 阅读
0 评论
0 点赞
2023-12-16
HTTP常见状态码
HTTP状态码说明1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码 说明100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。2xx (成功)表示成功处理了请求的状态代码。代码 说明200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。201 (已创建) 请求成功并且服务器创建了新的资源。202 (已接受) 服务器已接受请求,但尚未处理。203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。204 (无内容) 服务器成功处理了请求,但没有返回任何内容。205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。206 (部分内容) 服务器成功处理了部分 GET 请求。3xx (重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。代码 说明300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。4xx(请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。代码 说明400 (错误请求) 服务器不理解请求的语法。401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。403 (禁止) 服务器拒绝请求。404 (未找到) 服务器找不到请求的网页。405 (方法禁用) 禁用请求中指定的方法。406 (不接受) 无法使用请求的内容特性响应请求的网页。407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。408 (请求超时) 服务器等候请求时发生超时。409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。415 (不支持的媒体类型) 请求的格式不受请求页面的支持。416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。代码 说明500 (服务器内部错误) 服务器遇到错误,无法完成请求。501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
2023年12月16日
24 阅读
0 评论
0 点赞
2023-12-16
通俗讲解OSI七层模型
国际标准化组织 ISO 于 1983 年正式提出了开放式系统互联模型(通称 ISO/OSI)。将整个网络通信的功 能划分为 7 个层次OSI参考模型将整个网络通信的功能划分为 7 个层次,这些层 就像我们吃的洋葱、卷心菜的一样:每一层都将其下面的层遮起来。 下一层次的细节被隐藏起来。如果你将洋葱皮剥开往里看,你一 定会流下许多眼泪,OSI模型也是如此,越往下看越难理解,只要你 不怕流泪、麻烦,不放弃你就会成功。物理层:网卡,网线,集线器,中继器,调制解调器数据链路层:网桥,交换机网络层:路由器网关工作在第四层传输层及其以上集线器是物理层设备,采用广播的形式来传输信息。交换机就是用来进行报文交换的机器。多为链路层设备(二层交换机),能够进行地址学习,采用存储转发的形式来交换报文.。路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。选择通畅快捷的近路,能大大提高通信速度,减轻网络系统通信负荷,节约网络系统资源,提高网络系统畅通率。交换机和路由器的区别交换机拥有一条很高带宽的背部总线和内部交换矩阵。交换机的所有的端口都挂接在这条总线上,控制电路收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部交换矩阵迅速将数据包传送到目的端口,目的MAC若不存在则广播到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部MAC地址表中。使用交换机也可以把网络“分段”,通过对照MAC地址表,交换机只允许必要的网络流量通过交换机。通过交换机的过滤和转发,可以有效的隔离广播风暴,减少误包和错包的出现,避免共享冲突。交换机在同一时刻可进行多个端口对之间的数据传输。每一端口都可视为独立的网段,连接在其上的网络设备独自享有全部的带宽,无须同其他设备竞争使用。当节点A向节点D发送数据时,节点B可同时向节点C发送数据,而且这两个传输都享有网络的全部带宽,都有着自己的虚拟连接。假使这里使用的是10Mbps的以太网交换机,那么该交换机这时的总流通量就等于2×10Mbps=20Mbps,而使用10Mbps的共享式HUB时,一个HUB的总流通量也不会超出10Mbps。总之,交换机是一种基于MAC地址识别,能完成封装转发数据包功能的网络设备。交换机可以“学习”MAC地址,并把其存放在内部地址表中,通过在数据帧的始发者和目标接收者之间建立临时的交换路径,使数据帧直接由源地址到达目的地址。从过滤网络流量的角度来看,路由器的作用与交换机和网桥非常相似。但是与工作在网络物理层,从物理上划分网段的交换机不同,路由器使用专门的软件协议从逻辑上对整个网络进行划分。例如,一台支持IP协议的路由器可以把网络划分成多个子网段,只有指向特殊IP地址的网络流量才可以通过路由器。对于每一个接收到的数据包,路由器都会重新计算其校验值,并写入新的物理地址。因此,使用路由器转发和过滤数据的速度往往要比只查看数据包物理地址的交换机慢。但是,对于那些结构复杂的网络,使用路由器可以提高网络的整体效率。路由器的另外一个明显优势就是可以自动过滤网络广播。集线器与路由器在功能上有什么不同?首先说HUB,也就是集线器。它的作用可以简单的理解为将一些机器连接起来组成一个局域网。而交换机(又名交换式集线器)作用与集线器大体相同。但是两者在性能上有区别:集线器采用的式共享带宽的工作方式,而交换机是独享带宽。这样在机器很多或数据量很大时,两者将会有比较明显的。而路由器与以上两者有明显区别,它的作用在于连接不同的网段并且找到网络中数据传输最合适的路径。路由器是产生于交换机之后,就像交换机产生于集线器之后,所以路由器与交换机也有一定联系,不是完全独立的两种设备。路由器主要克服了交换机不能路由转发数据包的不足。总的来说,路由器与交换机的主要区别体现在以下几个方面:(1)工作层次不同最初的的交换机是工作在数据链路层,而路由器一开始就设计工作在网络层。由于交换机工作在数据链路层,所以它的工作原理比较简单,而路由器工作在网络层,可以得到更多的协议信息,路由器可以做出更加智能的转发决策。(2)数据转发所依据的对象不同交换机是利用物理地址或者说MAC地址来确定转发数据的目的地址。而路由器则是利用IP地址来确定数据转发的地址。IP地址是在软件中实现的,描述的是设备所在的网络。MAC地址通常是硬件自带的,由网卡生产商来分配的,而且已经固化到了网卡中去,一般来说是不可更改的。而IP地址则通常由网络管理员或系统自动分配。(3)传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域由交换机连接的网段仍属于同一个广播域,广播数据包会在交换机连接的所有网段上传播,在某些情况下会导致通信拥挤和安全漏洞。连接到路由器上的网段会被分配成不同的广播域,广播数据不会穿过路由器。虽然第三层以上交换机具有VLAN功能,也可以分割广播域,但是各子广播域之间是不能通信交流的,它们之间的交流仍然需要路由器。(4)路由器提供了防火墙的服务路由器仅仅转发特定地址的数据包,不传送不支持路由协议的数据包传送和未知目标网络数据包的传送,从而可以防止广播风暴。1、物理层物理层是OSI 参考模型的最低层,且与物理传输介质相关联, 该层是实现其他层和通信介质之间的接口。是整个开放系统的基 础。它的主要任务就是描述为确定与传输媒体的接口的一些特性, 即机械特性、电气特性、功能特性以及规程特性,如规定了使用电 缆和接头的类型、传送信号的电压(水晶头、脉冲电压 5v)等,在这 一层数据还没有被组织,仅作为原始的位流或电气电压处理。 物理层的主要功能:(1)为数据端设备提供传送数据的通路, 无论花费多少电缆、光纤、双绞线,都把通信的两个数据终端(电脑、 路由器、交换机)设备连接起来,形成一条通路;(2)传输数据。一 是要保证数据能在其上正确通过,必须保证一方发出“1”时(你 好!),另一方接收到的也是“1”(你好!)而不是“0”(再见!)。二 是要提供足够的带宽,以减少信道上的拥塞。三传输数据的方式 串行或并行,半双工或全双工,同步或异步传输的需要;(3)完成物 理层的管理工作,如监视物理层所有连接,任何的连接断开都会立 即得到检测。 物理层相应设备包括网络传输介质(如同轴电缆、双绞线、光 缆、无线)和连接器等,以及保证物理通信的相关设备,如中继器、 共享式 HUB、放大设备等。2、数据链路层数据链路层是 OSI 参考模型的第 2 层,数据链路层将物理层 不可靠的传输媒体变成可靠的传输通路提供给网络层,它把从物 理层来的原始数据打包成帧。负责帧在计算机之间的无差错信息 传递。物理层的传输媒体及其连接是长期的,网线、光纤时刻和终 端设备(电脑、路由器)连接着。而数据链路连接是有生存期的,在 连接生存期内,收发两端可以进行不等的一次或多次数据通信。就 像打电话,电话拨通后就建立了一次电话连接(数据链路),通话完 毕要挂掉,通话结束了但电话线还连接着,每次打电话都要拨通号 建立连接,当然电脑的每次通信也都要经过建立通信联络和拆除 通信联络两过程。这种建立起来的数据收发关系就叫作数据链路。3、网络层网络层是 OSI 参考模型中最复杂、最重要的一层。网络层的 产生也是网络发展的结果,当数据终端增多时,它们之间需要中继 设备相连。此时会出现一台终端要求不只是与唯一的一台而是能 和多台终端通信的情况,这就产生了把任意两台数据终端设备的 数据链接起来的问题,也就是路由,进而实现两个端系统之间的数 据传送。工作在网络层的协议有 TCP/IP、IPX/SPX、AppleTalk 等。 网络层的主要提供以下功能:(1)路径选择与中继。物理层和数据链路层都只解决直接相连的两节点间的数据传输问题,网络 层则是 OSI 模型中第一个能实现不一定需要直接相连的节点或设 备间的数据传输问题的协议层;(2)拥塞控制、流量控制。当通信 子网中有太多的分组时,网络性能降低,这种情况就叫拥塞,是一 个全局性问题,涉及主机、路由器等很多因素。流量控制则与点到 点的通信量有关,主要解决快速发送方与慢速接收方的问题,是局 部问题,一般都是基于反馈进行控制的。网络中链路层、网络层、 传输层等都存在,其控制方法大体一致,目的是防止通信量过大造 成通信于网性能下降。在实现网络层功能时,需要解决的主要问题如下:寻址:数据链路层中使用的物理地址(如MAC地址)仅解决网络内部的寻址问题。在不同子网之间通信时,为了识别和找到网络中的设备,每一子网中的设备都会被分配一个唯一的地址。由于各子网使用的物理技术可能不同,因此这个地址应当是逻辑地址(如IP地址)。交换:规定不同的信息交换方式。常见的交换技术有:线路交换技术和存储转发技术,后者又包括报文交换技术和分组交换技术。路由算法:当源节点和目的节点之间存在多条路径时,本层可以根据路由算法,通过网络为数据分组选择最佳路径,并将信息从最合适的路径由发送端传送到接收端。连接服务:与数据链路层流量控制不同的是,前者控制的是网络相邻节点间的流量,后者控制的是从源节点到目的节点间的流量。其目的在于防止阻塞,并进行差错检测。4、传输层传输层是 OSI 参考模型的第 4 层中,介于应用层和网络层之 间的传输层是分层网络体系结构的重心部分。是惟一负责总体数 据传输和控制的一层。它的重要任务就是直接给运行在不同主机 上的应用程序提供通信服务,而网络层协议为不同主机提供逻辑 通信。 在 OSI 模型中传输层是负责数据通信的最高层,又是面向网 络通信的低三层和面向信息处理的高三层之间的中间层。因为网 络层不一定保证服务的可靠,用户也不能直接对通信子网加以控 制,因此在网络层之上加一层即传输层以改善传输质量。原因世 界上各种通信子网在性能上存在着很大差异。如电话交换网,分 组交换网,局域网等通信子网都可互连,但它们提供的吞吐量,传 输速率,数据延迟通信费用各不相同,传输层就承担了调节上述通 信子网的差异,使会话层感受不到。此外传输层还具备差错恢复, 流量控制等功能。传输层支持的协议有:TCP/IP 的传输控制协议 TCP、Novell的顺序包交换SPX及Microsoft NetBIOS/NetBEUI等。主要功能如下:传输连接管理:提供建立、维护和拆除传输连接的功能。传输层在网络层的基础上为高层提供“面向连接”和“面向无接连”的两种服务。处理传输差错:提供可靠的“面向连接”和不太可靠的“面向无连接”的数据传输服务、差错控制和流量控制。在提供“面向连接”服务时, 通过这一层传输的数据将由目标设备确认,如果在指定的时间内未收到确认信息,数据将被重发。监控服务质量。5、会话层会话层的主要功能是在两个节点间建立、维护和释放面向用 户的连接,对进行会话的两台机器间建立对话控制,管理会话如管 理哪边发送、何时发送、占用多长时间等,保证会话数据可靠传送。 会话层还提供了同步服务,例如你正在下载一个 100M 的文件,当 下载到 95M 时,网络断线了,这时是不需要重头再传的。 会话层需要决定使用全双工通信还是半双工通信。如果采用 全双工通信,则会话层在对话管理中做的工作就很少;如果采用半 双工通信,会话层则通过一个数据令牌来协调会话,保证每次只有 一个用户能够传输数据。当建立一个会话时,先让一个用户得到 令牌。只有获得令牌的用户才有权进行发送数据。会话层的具体功能如下:会话管理:允许用户在两个实体设备之间建立、维持和终止会话,并支持它们之间的数据交换。例如提供单方向会话或双向同时会话,并管理会话中的发送顺序,以及会话所占用时间的长短。会话流量控制:提供会话流量控制和交叉会话功能。寻址:使用远程地址建立会话连接。l出错控制:从逻辑上讲会话层主要负责数据交换的建立、保持和终止,但实际的工作却是接收来自传输层的数据,并负责纠正错误。会话控制和远程过程调用均属于这一层的功能。但应注意,此层检查的错误不是通信介质的错误,而是磁盘空间、打印机缺纸等类型的高级错误。6、表示层表示层是处理所有与数据表示及传输有关的一层,为异种机 通信提供一种公共语言,为上层用户提供数据信息的语法表示变 换,屏蔽不同计算机在信息表示方面的差异,即用一种大家一致同 意的标准方法对数据编码。进行数据加密、数据压缩传输、字符集 转换等以便能进行互操作。这种类型的服务之所以需要,是因为 不同的计算机体系结构使用的数据表示法不同。表示层的具体功能如下:数据格式处理:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。数据的编码:处理字符集和数字的转换。例如由于用户程序中的数据类型(整型或实型、有符号或无符号等)、用户标识等都可以有不同的表示方式,因此,在设备之间需要具有在不同字符集或格式之间转换的功能。压缩和解压缩:为了减少数据的传输量,这一层还负责数据的压缩与恢复。数据的加密和解密:可以提高网络的安全性。7、应用层应用层是最终用户应用程序访问网络服务的地方,它负责识 别并证实通信双方的可用性,进行数据传输完整性控制,使网络应 用程序(如电子邮件、P2P文件共享、多用户网络游戏、网络浏览、目 录查询等)能够协同工作。应用层是 OSI 参考模型的最高层,它为 用户的应用进程访问 OSI 环境提供服务。应用层关心的主要是进 程之间的通信行为,因而对应用进程所进行的抽象只保留了应用 产程与应用进程间交互行为的有关部分。这种现象实际上是对应 用进程某种程度上的简化。用户接口:应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。实现各种服务:该层具有的各种应用程序可以完成和实现用户请求的各种服务。8、结语OSI 模型(应称为 OSI 理想化的模型)本身不是网络体系结构 的全部内容,这是因为它并未确切地描述用于各层的协议和服务, 它仅仅告诉我们每一层应该做什么。各层之间相互独立,某一层 只要了解下一层通过接口所提供的服务,而不需了解其实现细节。 它的灵活性好,若某一层的内容发生变化,只要接口关系不变,上 下层均不受影响,同时也便于程序的实现、调试和维护。不过它仅 仅是一种网络教学模型,到目前为止,OSI 模型还没有实现。由于OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。在7层模型中,每一层都提供一个特殊的网络功能。从网络功能的角度观察:下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。
2023年12月16日
21 阅读
0 评论
0 点赞
2023-12-16
layui文件上传+ThinkPHP
1.前端html代码<div class="layui-form-item"> <label class="layui-form-label">修改头像</label> <div class="layui-input-inline uploadHeadImage"> <div class="layui-upload-drag" id="headImg"> <i class="layui-icon"></i> <p>点击上传图片,或将图片拖拽到此处</p> </div> </div> <div class="layui-input-inline"> <div class="layui-upload-list"> <img class="layui-upload-img headImage" src="" id="demo1"> <p id="demoText"></p> </div> </div> </div>2.前端js代码<script>layui.use(['form', 'layer','upload',"element"], function() { $ = layui.jquery; var form = layui.form, upload = layui.upload, layer = layui.layer; //拖拽上传 var uploadInst = upload.render({ elem: '#headImg' , url: '{:url("uploadImg")}' , size: 500 , before: function (obj) { //预读本地文件示例,不支持ie8 obj.preview(function (index, file, result) { $('#demo1').attr('src', result); //图片链接(base64) }); } , done: function (res) { console.log(res); //如果上传失败 if (res.code > 0) { return layer.msg('上传失败'); } var demoText = $('#demoText'); // demoText.html('<span style="color: #8f8f8f;">上传成功!!!</span>'); $("#imagepath").val(res.image) layer.msg("上传成功") } , error: function () { //演示失败状态,并实现重传 var demoText = $('#demoText'); demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-mini demo-reload">重试</a>'); demoText.find('.demo-reload').on('click', function () { uploadInst.upload(); }); } }); element.init(); });3.后台php代码 // 图片上传 public function uploadImg(){ // 上传代码 $file = request()->file('file'); // 上传到本地服务器 $savename = \think\facade\Filesystem::disk('public')->putFile( 'goods', $file); $data['image'] = $savename; $data['code'] = 0; return json($data); }
2023年12月16日
32 阅读
0 评论
0 点赞
2023-12-15
PHP调用QQ登录接口
public function login(){ $urlencode = urlencode("https://www.itnan.cc/index/Index/callback"); $url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=XXXXXXXX&redirect_uri={$urlencode}&state=shop"; $data = compact("url"); return view("",$data); } // 回调地址 public function callback($code){ // 1.获取code // 2.发起请求 获取access_token $urlencode = urlencode("https://www.itnan.cc/index/Index/callback"); $url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=XXXXXXX&client_secret=YYYYYYYYYYYY&code={$code}&redirect_uri={$urlencode}&fmt=json"; $json = file_get_contents($url); $obj = json_decode($json); $access_token = $obj->access_token; // 3.发起请求 获取openid $url = "https://graph.qq.com/oauth2.0/me?access_token={$access_token}&fmt=json"; $obj = json_decode(file_get_contents($url)); $openid = $obj->openid; // 4.获取用户的信息 $url = "https://graph.qq.com/user/get_user_info?access_token={$access_token}&oauth_consumer_key=XXXXXXXXX&openid={$openid}"; dump(file_get_contents($url)); // 1.qq_member表写入数据,id,openid,nickname,gender,login_num,mid // 2.写session // 3. 跳转到首页 }
2023年12月15日
20 阅读
0 评论
0 点赞
2023-12-15
PHP实现无限级分类
function getTree($data) { $items = []; foreach ($data as $v){ $items[$v['id']] = $v; // $items[1] = } $tree = array(); //格式化好的树 foreach ($items as $item) if (isset($items[$item['pid']])) $items[$item['pid']]['son'][] = &$items[$item['id']]; else $tree[] = &$items[$item['id']]; return $tree; }
2023年12月15日
12 阅读
0 评论
0 点赞
2023-12-14
PHP使用PHPmailer类和smtp发送邮件
1.开启邮件smtp服务2.设置授权码3.引入phpmailer类,smtp类本地下载 https://github.com/PHPMailer/PHPMailer4.示例代码//下载PHPMailer并开启php_openssl、php_socket扩展 include_once 'PHPMailer.php'; include_once 'SMTP.php'; $mail = new PHPMailer(); //实例化 $mail->IsSMTP(); // 启用SMTP $mail->Host = "smtp.yeah.net"; //SMTP服务器 以163邮箱为例子 $mail->Port = 25; //邮件发送端口 $mail->SMTPAuth = true; //启用SMTP认证 $mail->CharSet = "UTF-8"; //字符集 $mail->Encoding = "base64"; //编码方式 $mail->Username = "phpmaster@yeah.net"; //你的邮箱 $mail->Password = "EFWWFULFELKCUMQY"; //网易邮箱客户端授权码 $mail->From = "phpmaster@yeah.net"; //发件人地址(也就是你的邮箱) $mail->FromName = "张某某"; //发件人姓名 $address = "137647337@qq.com";//收件人email $mail->AddAddress($address, "亲");//添加收件人(地址,昵称) //附件 /*$mail->AddAttachment("logo.jpg"); $mail->AddAttachment("1.zip"); $mail->AddAttachment('1.xls','我的附件.xls'); // 添加附件,并指定名称*/ $mail->IsHTML(true); //支持html格式内容 //$mail->AddEmbeddedImage("logo.jpg", "my-attach", "logo.jpg"); //设置邮件中的图片 $mail->Subject = "你好"; //邮件标题 $mail->Body = '这是HTML邮件正文粗体,<a href="http://www.zhangxuhui.com">激活</a>'; //邮件主体内容 //发送 if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "success";5.场景:邮箱发送验证码类在php7.3+环境中报错:**filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated原因:查资料得知,php7.3+弃用了FILTER_FLAG_SCHEME_REQUIRED函数** 解决方式:PHPMailer.php 3599行 if (filter_var('http://' . $host, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED)) { //Is it a syntactically valid hostname? return true; } 更改为: if (preg_match('/http:\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is','http://' . $host)) { //Is it a syntactically valid hostname? return true; } 其实就是url地址地址的正则验证。
2023年12月14日
18 阅读
0 评论
0 点赞
2023-12-14
PHP实现CURL发送请求
public function curl($url, $params = false, $ispost = 0) { $httpInfo = array(); //初始化 $ch = curl_init(); /*CURL_HTTP_VERSION_NONE (默认值,让 cURL 自己判断使用哪个版本),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。 */ curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // 判断php版本 如果5.6+ 则含有CURLFILE 这个类 ,如果5.6-则设置如下,为解决php不同版本的问题 if (class_exists('\CURLFile')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); } else { if (defined('CURLOPT_SAFE_UPLOAD')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); } } //在HTTP请求中包含一个"User-Agent: "头的字符串。 curl_setopt( $ch, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' ); //尝试连接等待的时间,以毫秒为单位。设置为0,则无限等待。 如果 libcurl 编译时使用系统标准的名称解析器( standard system name resolver),那部分的连接仍旧使用以秒计的超时解决方案,最小超时时间还是一秒钟。 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); // 允许 cURL 函数执行的最长秒数。 curl_setopt($ch, CURLOPT_TIMEOUT, 60); //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向。(注意:这是递归的,"Location: " 发送几次就重定向几次,除非设置了 CURLOPT_MAXREDIRS,限制最大重定向次数。)。 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //FALSE 禁止 cURL 验证对等证书(peer's certificate)。 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 0 为不检查名称。 在生产环境中,这个值应该是 2(默认值)。 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //设置编码格式,为空表示支持所有格式的编码 curl_setopt($ch, CURLOPT_ENCODING, ''); if ($ispost) { // TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。 curl_setopt($ch, CURLOPT_POST, true); //全部数据使用HTTP协议中的 "POST" 操作来发送 curl_setopt($ch, CURLOPT_POSTFIELDS, $params); //需要获取的 URL 地址,也可以在curl_init() 初始化会话的时候。 curl_setopt($ch, CURLOPT_URL, $url); } else { if ($params) { curl_setopt($ch, CURLOPT_URL, $url . '?' . $params); } else { curl_setopt($ch, CURLOPT_URL, $url); } } $response = curl_exec($ch); if ($response === FALSE) { //echo "cURL Error: " . curl_error($ch); return false; } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $httpInfo = array_merge($httpInfo, curl_getinfo($ch)); curl_close($ch); return $response; }
2023年12月14日
39 阅读
0 评论
0 点赞
2023-12-14
Thinkphp6使用腾讯云发送短信步骤
1.前提条件国内短信地址:https://console.cloud.tencent.com/smsv2已开通短信服务,具体操作请参见 国内短信快速入门。如需发送国内短信,需要先 购买国内短信套餐包。已准备依赖环境:PHP 5.6.33 及以上版本。已在访问管理控制台 >API密钥管理页面获取 SecretID 和 SecretKey。SecretID 用于标识 API 调用者的身份。SecretKey 用于加密签名字符串和服务器端验证签名字符串的密钥,SecretKey 需妥善保管,避免泄露。2.安装 SDKcomposer require tencentcloud/tencentcloud-sdk-php3.查看thinkphp6是否已经安装成功了4.在框架中,控制器中建立一个方法(sendSms),用于发送短信5.框架中引入发送短信的类文件// 导入对应产品模块的client use TencentCloud\Sms\V20210111\SmsClient; // 导入要请求接口对应的Request类 use TencentCloud\Sms\V20210111\Models\SendSmsRequest; use TencentCloud\Common\Exception\TencentCloudSDKException; use TencentCloud\Common\Credential; // 导入可选配置类 use TencentCloud\Common\Profile\ClientProfile; use TencentCloud\Common\Profile\HttpProfile; 6.实例代码public function sendSms(){ try { /* 必要步骤: * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, * 以免泄露密钥对危及你的财产安全。 * CAM密匙查询: https://console.cloud.tencent.com/cam/capi*/ /********************************************1.secretId,secretKey***********************************************/ $cred = new Credential("XXX", "YYY"); //$cred = new Credential(getenv("TENCENTCLOUD_SECRET_ID"), getenv("TENCENTCLOUD_SECRET_KEY")); // 实例化一个http选项,可选的,没有特殊需求可以跳过 $httpProfile = new HttpProfile(); // 配置代理 // $httpProfile->setProxy("https://ip:port"); $httpProfile->setReqMethod("GET"); // post请求(默认为post请求) $httpProfile->setReqTimeout(30); // 请求超时时间,单位为秒(默认60秒) $httpProfile->setEndpoint("sms.tencentcloudapi.com"); // 指定接入地域域名(默认就近接入) // 实例化一个client选项,可选的,没有特殊需求可以跳过 $clientProfile = new ClientProfile(); $clientProfile->setSignMethod("TC3-HMAC-SHA256"); // 指定签名算法(默认为HmacSHA256) $clientProfile->setHttpProfile($httpProfile); // 实例化要请求产品(以sms为例)的client对象,clientProfile是可选的 // 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量 $client = new SmsClient($cred, "ap-guangzhou", $clientProfile); // 实例化一个 sms 发送短信请求对象,每个接口都会对应一个request对象。 $req = new SendSmsRequest(); /* 填充请求参数,这里request对象的成员变量即对应接口的入参 * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 * 基本类型的设置: * 帮助链接: * 短信控制台: https://console.cloud.tencent.com/smsv2 * sms helper: https://cloud.tencent.com/document/product/382/3773 */ /************************ 2.短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ $req->SmsSdkAppId = "1400616870"; /**************************3.短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台] 查看 */ $req->SignName = "芒果鱼个人网"; /* 短信码号扩展号: 默认未开通,如需开通请联系 [sms helper] */ $req->ExtendCode = ""; /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号*/ /**************************4.手机号*****************************/ $req->PhoneNumberSet = array("+8615238831671"); /* 国际/港澳台短信 SenderId: 国内短信填空,默认未开通,如需开通请联系 [sms helper] */ $req->SenderId = ""; /* 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ $req->SessionContext = "xxx"; /****************************5.模板 ID: 必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台] 查看 */ $req->TemplateId = "1262642"; /****************************6.模板变量 模板参数: 若无模板参数,则设置为空*/ $code = mt_rand(1000,9999); $req->TemplateParamSet = array($code); // 通过client对象调用SendSms方法发起请求。注意请求方法名与请求对象是对应的 // 返回的resp是一个SendSmsResponse类的实例,与请求对象对应 $resp = $client->SendSms($req); // 输出json格式的字符串回包 print_r($resp->toJsonString()); } catch(TencentCloudSDKException $e) { echo $e; } }7.发送成功后的响应收据{"SendStatusSet":[{"SerialNo":"2997:184567926916409342794633167","PhoneNumber":"+8615238831671","Fee":1,"SessionContext":"xxx","Code":"Ok","Message":"send success","IsoCode":"CN"}],"RequestId":"0922c611-4392-48f2-8619-4cfa9657155c"}
2023年12月14日
23 阅读
0 评论
0 点赞
1
...
3
4
5
...
8