网络协议(十四):WebSocket、WebService、RESTful、IPv6、网络爬虫、HTTP缓存

news2024/11/27 16:46:56

网络协议系列文章

网络协议(一):基本概念、计算机之间的连接方式

网络协议(二):MAC地址、IP地址、子网掩码、子网和超网

网络协议(三):路由器原理及数据包传输过程

网络协议(四):网络分类、ISP、上网方式、公网私网、NAT

网络协议(五):网络互联模型、物理层、数据链路层

网络协议(六):网络层(版本、首部长度、区分服务、总长度、 标识、标志、片偏移生存时间、协议、首部校验和)

网络协议(七):传输层-UDP

网络协议(八):传输层-TCP(可靠性传输、拥塞控制、建立连接-三次握手、释放连接-四次挥手)

网络协议(九):应用层(域名、DNS、DHCP)

网络协议(十):HTTP(报文格式、请求方法、头部字段、状态码、跨域)

网络协议(十一):单向散列函数、对称加密、非对称加密、混合密码系统、数字签名、证书

网络协议(十二):HTTPS(SSL/TLS、TLS1.2的连接)

网络协议(十三):HTTP/1.1的升级改进(HTTP/2、HTTP/3)

网络协议(十四):WebSocket、WebService、RESTful、IPv6、网络爬虫、HTTP缓存


目录

  • 一、WebSocket
  • 二、WebService
  • 三、RESTful
  • 四、IPv6
  • 五、网络爬虫
  • 六、HTTP 缓存(Cache)

一、WebSocket

  • Socket 是一套网络编程API,利用它可以建立网络连接,一般都是操作系统底层实现的
  • WebSocket 是一个网络协议

  • HTTP请求的特点:通信只能由客户端发起。所以,早期很多网站为了实现推送技术,所用的技术都是轮询
  • 轮询:由浏览器每隔一段时间(如每秒)向服务器发出HTTP请求,然后服务器返回最新的数据给客户端
  • 为了能更好的节省服务器资源和带宽,并且能够更实时地进行通讯,HTML5规范中出现了WebSocket协议

在这里插入图片描述

WebSocket,是基于TCP的支持全双工通信的应用层协议

  • 在2011年由IETF标准化为 RFC 6455,后由 RFC 7936 补充规范
  • 客户端、服务器,任何一方都可以主动发消息给对方
  • WebSocket 的应用场景很多
    • 社交订阅、股票基金报价、体育实况更新、多媒体聊天、多玩家游戏等
  • WebSocket 和 HTTP 属于平级关系,都是应用层的协议
    • 其实TCP本身就是支持全双工通信的(客户端、服务器均可主动发消息给对方)
    • 只是HTTP的 “请求-应答模式” 限制了TCP的能力
  • WebSocket 使用 80(ws://)、443(wss://) 端口,可以绕过大多数防火墙的限制
    • ws://example.com/wsapi
    • wss://secure.example.com/wsapi
  • 与 HTTP 不同的是,WebSocket 需要先建立连接
    • 这就使得WebSocket成为一种有状态的协议,之后通信时可以省略部分状态信息
    • 而HTTP请求可能需要在每个请求都额外携带状态信息(如身份认证等)

WebSocket 使用

  • WebSocket 体验和演示:https://www.websocket.org/echo.html
  • W3C 标准化了一套 WebSocket API,可以直接使用JS调用:
    • let ws = new WebSocket(‘wss://example.com’)

WebSocket - 建立连接

  • WebSocket 需要借助 HTTP协议来建立连接(也叫作握手,Handshake)
    • 由客户端(浏览器)主动发出握手请求

在这里插入图片描述
在这里插入图片描述

二、WebService

  • WebService,译为:Web服务,是一种跨编程语言和跨操作系统的远程调用技术标准
  • 其实 WebService 是比较老的技术,放到现在已经可以由普通的 Web API 取代
  • WebService使用场景举例
    • 天气预报、手机归属地查询、航班信息查询、物流信息查询等
    • 比如天气预报,是气象局把自己的服务以WebService形式暴露出来,让第三方程序可以调用这些服务功能
    • http://www.webxml.com.cn/zh_cn/index.aspx
  • 事实上,WebService完全可以用普通的 Web API 取代(比如HTTP + JSON)

SOAP (Simple Object Access Protocol),译为:简单对象访问协议

  • 很多时候,SOAP = HTTP + XML
  • WebService 使用 SOAP协议 来封装传递数据

在这里插入图片描述

WSDL (Web Services Description Language),译为:Web服务描述语言

  • 一个XML文档,用以描述WebService接口的细节(比如参数、返回值等)
  • 一般在WebService的URL后面跟上 ?wsdl 获取WSDL信息
  • http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

三、RESTful

  • REST (REpresentational State Transfer),表现层状态转移
  • REST是一种互联网软件架构设计风格
    • 定义了一组用于创建Web服务的约束
    • 符合REST架构的Web服务,称为RESTful Web服务

RESTful 的实践建议

  • URL中使用名词(建议用复数形式),不使用动词
    • 推荐:/users、/users/6
    • 不推荐:listsers、/getser?id=6,/uer/list、/user/get?id=6
  • 使用 HTTP的请求方法 表达动作:

在这里插入图片描述

  • 一个资源连接到其他资源,使用子资源的形式
    • GET /users/6/cars/8
    • POST /users/8/cars
  • API 版本化
    • mj.com/v1/users
    • mj.com/v2/users/66
  • 返回 JSON格式的数据

四、IPv6

  • IPv6 (Internet Protocol version 6),网际协议第6版
    • 用它来取代IPv4主要是为了解决IPv4地址枯竭问题,同时它也在其他方面对于IPv4有许多改进
    • 然而长期以来IPv4在互联网流量中仍占据主要地位,IPv6的使用增长缓慢
    • 在2019年12月,通过IPv6使用Google服务的用户百分率首次超过30%
    • 因为使用IPv6需要设备、操作系统内核升级支持IPv6,不像HTTP升级到HTTP2一样方便
  • IPv6采用128位的地址,而IPv4使用的是32位
    • 支持2^128(约3.4 ∗ 10^38 )个地址
    • 以地球人口70亿人计算,每人平均可分得约 4.86 ∗ 10^28个IPv6地址
    • 解决了IPv4地址枯竭问题

IPv6 - 地址格式

  • IPv6地址为128bit,每16bit一组,共8组
  • 每组以冒号 : 隔开,每组以4位十六进制方式表示
    • 例如 2001:0db8:86a3:08d3:1319:8a2e:0370:7344
  • 类似于IPv4的点分十进制,IPv6同样也存在点分十六进制的写法
    • 2.0.0.1.0.d.b.8.8.5.a.3.0.8.d.3.1.3.1.9.8.a.2.e.0.3.7.0.7.3.4.4
  • 每组前面连续的0可以省略。下列IPv6地址是等价的:
    • 2001:0db8:02de:0000:0000:0000:0000:0e13
    • 2001:db8:2de:0:0:0:0:e13
  • 双冒号 :: 表示一组0或多组连续的0,但只能出现一次。下列IPv6地址等价:
    • 2001:db8:2de:0:0:0:0:e13
    • 2001:db8:2de::e13
  • 2001::25de::cade 是非法的,因为双冒号:出现了两次,会造成歧义
    • 2001:0000:0000:0000:0000:25de:0000:cade
    • 2001:0000:25de:0000:0000:0000:0000:cade
  • ::1是本地环回地址:0:0:0:0:0:0:0:1
    • ping ::1 可以ping通本机

IPv6 - 首部格式

  • IPv6 有40字节的固定首部

在这里插入图片描述
在这里插入图片描述

  • Version (占4bit,0110):版本号
  • Traffic Class (占8bit):交通类别
    • 指示数据包的类别或优先级,可以帮助路由器根据数据包的优先级处理流量
    • 如果路由器发生拥塞,则优先级最低的数据包将被丢弃
  • Payload Length (占16bit):有效负载长度
    • 最大值65535字节
    • 包括了扩展头部、上层(传输层)数据的长度首部格式
  • Hop Limit (占8bit):跳数限制
    • 与IPv4数据包中的TTL相同
  • Source Address (占128bit):源IPv6地址
  • Destination Address (占128bit):目的IPv6地址
  • Flow Label (占20bit):流标签
    • 指示数据包属于哪个特定序列(流)
    • 用数据包的源地址、目的地址、流标签标识一个流

IPv6 - 拓展头部

在这里插入图片描述

  • Next Header(占8bit):下一个头部
    • 指示扩展头部(如果存在)的类型、上层数据包的协议类型(例如TCP、UDP、ICMPv6)

在这里插入图片描述

五、网络爬虫

  • 网络爬虫 (Web Crawler),也叫做网络蜘蛛 (Web Spider)
    • 模拟人类使用浏览器操作页面的行为,对页面进行相关的操作
    • 常用爬虫工具:Python 的 Scrapy框架

在这里插入图片描述
在这里插入图片描述

网络爬虫的简易实例

  • 爬虫目标:https://ext.se.360.cn/webstore/categor
import org.apache.commons.io.FileUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.net.URL;

public class Main {
    public static void main(String[] args) throws Exception {
        // 请求网站:https://ext.se.360.cn/webstore/category
        // Jsoup使用CSS选择器来查找元素
        String dir = "C:/Users/yusael/Desktop/imgs/"; // 爬取后的存放路径
        String url = "https://ext.se.360.cn/webstore/category";
        Document doc = Jsoup.connect(url).get();
        Elements eles = doc.select(".applist .appwrap");
        for (Element ele : eles) {
            String img = ele.selectFirst("img").attr("src");
            String title = ele.selectFirst("h3").text();
            String intro = ele.selectFirst(".intro").text();

            // 下载图片
            String filepath = dir + (title + ".png");
            FileUtils.copyURLToFile(new URL(img), new File(filepath));
        }
    }
}

robots.txt

  • robots.txt 是存放于网站根目录下的文本文件,比如 https://www.baidu.com/robots.txt
    • 用来告诉爬虫:哪些内容是不应被爬取的,哪些是可以被爬取的
    • 因为一些系统中的URL是大小写敏感的,所以 robots.txt 的文件名应统一为小写
  • robots.txt 并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私
    • 只能防君子,不能防小人
    • 无法阻止不讲 “武德” 的年轻爬虫爬取隐私信息

在这里插入图片描述

六、HTTP 缓存(Cache)

  • 实际上,HTTP 的缓存机制远远比上图的流程要复杂
  • 通常会缓存的情况是:GET请求 + 静态资源(比如HTML、CSS、JS、图片等)
  • Ctrl + F5:可以强制刷新缓存

在这里插入图片描述

缓存 - 响应头

  • Pragma:作用类似于Cache-Control,HTTP/1.0的产物
  • Expires:缓存的过期时间 (GMT格式时间),HTTP/1.0的产物
  • 在http协议中规定,所有时间都要转换为GMT时间,例如date: Sat, 19 May 2018 17:17:24 GMT
  • Cache-Control:设置缓存策略
    • no-storage:不缓存数据到本地
    • public:允许用户、代理服务器缓存数据到本地
    • private:只允许用户缓存数据到本地
    • max-age:缓存的有效时间(多长时间不过期),单位秒
    • no-cache:每次需要发请求给服务器询问缓存是否有变化,再来决定如何使用缓存

优先级:Pragma > Cache-Control > Expires


  • Last-Modified:资源的最后一次修改时间
  • ETag:资源的唯一标识(根据文件内容计算出来的摘要值)

优先级:ETag > Last-Modifie

缓存 - 请求头

  • If-None-Match
    • 如果上一次的响应头中有ETag,就会将ETag的值作为请求头的值
    • 服务器发现资源的最新摘要值跟If-None-Match不匹配,就会返回新的资源 (200 OK)
    • 否则,就不会返回资源的具体数据 (304 Not Modified)
  • If-Modified-Since
    • 如果上一次的响应头中没有ETag,有Last-Modified,就会将Last-Modified的值作为请求头的值
    • 如果服务器发现资源的最后一次修改时间晚于If-Modified-Since,就会返回新的资源 (200 OK)
    • 否则,就不会返回资源的具体数据 (304 Not Modified)

  • Last-Modified 缺陷
    • 只能精确到秒级别,如果资源在1秒内被修改了,客户端将无法获取最新的资源数据
    • 如果某些资源被修改了(最后一次修改时间发生了变化),但是内容并没有任何变化
      (比如在文本中敲个空格再删除)会导致相同数据重复传输,没有使用到缓存
  • ETag 可以办到
    • 只要资源的内容没有变化,就不会重复传输资源数据
    • 只要资源的内容发生了变化,就会返回最新的资源数据给客户端

缓存的使用流程

在这里插入图片描述

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

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

相关文章

Kubernetes(K8s)接入Prometheus示例、查看指标

Prometheus安装关联服务见:https://blog.csdn.net/lsc_2019/article/details/129445580?spm1001.2014.3001.5502 在Kubernetes中创建一个Deployment和一个Service apiVersion: apps/v1 kind: Deployment metadata:name: myapp spec:replicas: 3selector:matchLabe…

Jackson 返回前端的 Response结果字段大小问题

目录 1、问题产生的背景 2、出现的现象 3、解决方案 4、成果展现 5、总结 6、参考文章 1、问题产生的背景 因为本人最近工作相关的对接外部项目,在我们国内有很多程序员都是使用汉语拼音或者部分字母加上英文复合体定义返回实体VO,这样为了能够符合…

数据表(三) - 多语言的实现

前文介绍了关于数据表的几种形式,以及如何让数据表运用更加简单高效,这篇我们来讲讲多语言在数据表中的实现方式。游戏项目中文字显示本身就是件比较头疼的事,再加上多语言,更多的问题将待需解决。很多时候项目起初,文…

Golang-GMP模型

写在前面 Go 为了自身 goroutine 执行和调度的效率,自身在 runtime 中实现了一套 goroutine 的调度器,下面通过一段简单的代码展示一下 Go 应用程序在运行时的 goroutine,方便大家更好的理解。 The Go scheduler is part of the Go runtime,…

华为机试题:HJ92 在字符串中找出连续最长的数字串(python)

文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

C++语法规则2(C++面向对象)

继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的数据成员和成…

SpringBoot修改启动图标(详细步骤)

目录 一、介绍 二、操作步骤 三、介绍Java学习(题外话) 四、关于基础知识 一、介绍 修改图标就是在资源加载目录(resources)下放一个banner.txt文件。这样运行加载的时候就会扫描到这个文件,然后启动的时候就会显…

vue -- 自定义指令钩子函数补充 自定义过滤器filter参数

自定义指令补充 自定义指令通过钩子函数的形式来实现自定义的功能 这里是几个常用的钩子函数以及它的方法: bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置。 inserted:被绑定元素插…

Docker Nginx 反向代理

最近在系统性梳理网关的知识,其中网关的的功能有一个是代理,正好咱们常用的Nginx也具备次功能,今天正好使用Nginx实现一下反向代理,与后面网关的代理做一个对比,因为我使用的docker安装的Nginx,与直接部署N…

web worker的基本使用案例

文件目录如下 代码按照顺序分别如下 webworker.html <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewpo…

C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()

C语言函数&#xff1a; 字符串函数及模拟实现strtok()、strstr()、strerror() strstr()函数: 作用&#xff1a;字符串查找。在一串字符串中&#xff0c;查找另一串字符串是否存在。 形参: str2在str1中寻找。返回值是char*的指针 原理&#xff1a;如果在str1中找到了str2&…

为什么这几年参加PMP考试的人越来越多?

PMP认证从国外引进大陆这么多年了&#xff0c;其火热程度依然不减&#xff0c;我个人认为是取决于市场的运作和“游戏规则”&#xff08;岗位招聘和项目招标需要&#xff09;。PMP含金量不算高&#xff0c;更多的是“敲门砖”作用&#xff0c;项目管理岗位的门槛&#xff0c;当…

MySQL日志审计和分析

审核数据库活动是加强数据库安全性的重要组成部分。这涉及识别漏洞&#xff0c;例如默认或弱登录凭据、过多的用户和组权限以及未修补的数据库。攻击者利用这些漏洞来实现自己的目标&#xff0c;如权限提升、SQL 注入和 DoS 攻击。因此&#xff0c;出于安全性和合规性原因&…

源码分析spring如和对@Component注解进行BeanDefinition注册的

Spring ioc主要职责为依赖进行处理&#xff08;依赖注入、依赖查找&#xff09;、容器以及托管的(java bean、资源配置、事件)资源声明周期管理&#xff1b;在ioc容器启动对元信息进行读取&#xff08;比如xml bean注解等&#xff09;、事件管理、国际化等处理&#xff1b;首先…

SPI读写SD卡速度有多快?

SD卡是一个嵌入式中非常常用的外设&#xff0c;可以用于存储一些大容量的数据。但用单片机读写SD卡速度一般都有限&#xff08;对于高速SD卡&#xff0c;主要是受限于单片机本身的接口速度&#xff09;&#xff0c;在高速、实时数据存储时可能会有影响。但具体速度可以达到多少…

Spark RDD的设计与运行原理

一、Spark RDD概念 一个RDD就是一个分布式对象集合&#xff0c;本质上是一个只读的分区记录集合&#xff0c;每个RDD可以分成多个分区&#xff0c;每个分区就是一个数据集片段&#xff0c;并且一个RDD的不同分区可以被保存到集群中不同的节点上&#xff0c;从而可以在集群中的…

Could not resolve dependencies for project

maven 打包Could not resolve dependencies for project和无效的目标发行版: 1.8 1.maven 打包Could not resolve dependencies for project 最近项目上使用的是idea ide的多模块话&#xff0c;需要模块之间的依赖&#xff0c;比如说系统管理模块依赖授权模块进行认证和授权&a…

聊聊关于分类和分割的损失函数:nn.CrossEntropyLoss()

目录 1. nn.CrossEntropyLoss() 2. 多分类中 nn.CrossEntropyLoss() 的应用 3. 分割中 nn.CrossEntropyLoss() 的应用 3.1 测试文件 3.2 输出可视化 3.3 softmax 3.4 log 3.5 CrossEntropyLoss 1. nn.CrossEntropyLoss() 分类中&#xff0c;经常用 nn.CrossEntropyL…

.NET Core Api使用Folder(文件夹)形式发布并指定监听端口

分为以下几个步骤 1. 先安装SDK及运行环境, 无需安装IIS, 因为他不在IIS上运行 环境下载路径, 我用的是.NET 7.0, 可以根据自己的版本下载: 下载 .NET 7.0 SDK (v7.0.201) - Windows x64 Installer 下载.NET运行环境 下载后安装.直接下一步..安装即可 2. 配置发布设置 (…

Nginx服务优化与防盗链

目录 1.隐藏nginx版本号 1.查看版本号 2.隐藏版本信息 2.修改用户与组 3.缓存时间 4.日志分割 5.连接超时 6.更改进程数 7.网页压缩 8.配置防盗链 1.配置web源主机&#xff08;192.168.156.10 www.lhf.com&#xff09; 2.配置域名映射关系 3.配置盗链主机 &#xff0…