建设部网站首页,潍坊做网站公司潍坊网络公司,网站建设推广公司需要哪些岗位,企业网站适合响应式嘛从一个问题聊起#xff1a;
Http/Websocket 都称为一种协议#xff0c;能用现实中的例子来解释协议吗#xff1f;
AI 举例#xff1a;
您#xff08;客户端#xff09;#xff1a; 您坐在餐厅桌子上#xff0c;想点一份菜单。
服务员#xff08;服务器#xff09… 从一个问题聊起
Http/Websocket 都称为一种协议能用现实中的例子来解释协议吗
AI 举例
您客户端 您坐在餐厅桌子上想点一份菜单。
服务员服务器 服务员站在您旁边准备接受您的点餐请求。
点餐HTTP 请求 您向服务员递交一个菜单上面列出了您想点的菜品。菜单和你的点单就是协议的内容
等待等待响应 服务员拿着菜单去厨房等待厨师准备好食物。
上菜HTTP 响应 厨师准备好了您点的菜服务员将食物端到您的桌子上。
上面这个例子目的就是你和餐厅之间的沟通这个沟通要在餐厅的菜单内同理浏览器要和服务器交互有成千上万个浏览器不能你说要炒豆角别人就给你做炒豆角炒出来你说不是你要的炒豆角这个事情怎么说的清所以炒豆角炒成几成熟带不带肉辣不辣麻不麻都在菜单上进行勾选如果对方根本就没有豆角你就不能点炒豆角这份菜单就是你和餐厅之间的协议。
Http 有哪些具体的协议呢
请求Request 客户端向服务器发送请求请求特定资源或执行特定操作。
请求行包括 HTTP 方法GET、POST、等、请求的 URL 和协议版本。请求头包含关于请求的附加信息如用户代理、主机名等。请求正文在 POST 请求中可能会包含提交的数据。
响应Response 服务器向客户端返回响应包含请求的结果或错误信息。
状态行包括协议版本、状态码和状态消息。响应头包含关于响应的附加信息如服务器类型、内容类型等。响应正文包含服务器返回的数据。
HTTP 方法HTTP Methods 定义客户端请求的操作类型常见的有 GET、POST、PUT、DELETE 等。
状态码Status Codes 服务器返回的三位数字代码表示请求的处理结果。例如200 表示成功404 表示资源未找到500 表示服务器内部错误等。
请求头Request Headers和响应头Response Headers 包含各种元数据用于提供关于请求或响应的额外信息。
URLUniform Resource Locator 指定 Web 上资源的地址。URL 包括协议、域名、端口、路径等。
Cookie 和 Session 用于在客户端和服务器之间跟踪用户会话状态。
缓存控制Caching 控制客户端和服务器之间的数据缓存以提高性能。
内容协商Content Negotiation 客户端和服务器协商最适合的内容格式如请求 JSON 或 XML。
安全性Security HTTP 可以通过 HTTPS基于 SSL/TLS 加密来实现安全传输。
重定向Redirection 服务器可能会将请求重定向到其他 URL常见的是 301 永久重定向和 302 临时重定向。
认证Authentication HTTP 可以通过 Basic Auth、Bearer Token 等方式进行用户认证。
跨域资源共享CORS 用于在不同域之间进行数据交换涉及安全机制。
一张 Ajax 请求的截图
我们能看到请求时可以携带很多协议key每个协议 key 都有对应的值这里挑 Content-Type:application/json来看意味着浏览器传过去的是一个 json 字符串服务端拿到后以 json格式进行处理同理我还可以传递 urlencode 形式纯 text/plain文本形式甚至是二进制流这里解释下什么叫流
通常我们看到的水流主要觉得它很柔软无孔不入并且是连续的但如果你拿电子显微镜来看它就是一粒粒的水分子组成的我们放大一下把它们当成沙粒你拉远镜头那么流沙跟水流是一样的这就是流体由不连续的粒子组成。
二进制流也是这意思每次传输一个比特但是连续很快地发出去连起来看就像是电流在运行这就是二进制流。
说这么多就是告诉大家流就是比特由一个发射器往外发射因为发射的非常快就看起来像是连续的电流。
底层所有的流都是这样处理只是颗粒度不一样例如字符流就是一次处理一个字符一个字符又有多个比特构成。 自定义一些协议
如果你理解了协议就是由两端人或者物约定的一些暗号那么这些暗号也可以给服务器端约定一下比如在请求中增加一个 Token 键这个键要携带一个值用来鉴权只要服务端允许接收这个 Token 那么浏览器端就能将这个 Token 传递过来。
为什么说服务端允许呢像你看的电视剧当一个人进入城门时都得先进行验证身份的如果你不在名单上例如胡人那是不让你进的所以必须有服务端的允许Token 才能进去。所以浏览器如果要发一个特殊的协议头那是要请示一下服务端的这个请示就叫 OPTION很多人都知道 POST/GET但知道 OPTION并不多。讲这个点在于我想启发大家编程来源现实如果经历比较多可以靠回想现实来推测编程中的技术现实存在的问题编程也会遇到所以这样你的学习就变成主动的了。
扯了那么多都是要说明 Http 是一堆协议暗号的统称这么多的暗号我们称为标识吧和暗号的值聚合在一起发给服务端服务端收到后称这次发送为一次请求就跟后厨的师傅又收到一份点餐一样。
为何还没讲到连接
我们需要放大这个例子你才能理解什么叫连接也能知道一个连接是没有什么长短之分也没有什么链路存在的这将打破你常规的认识实际上这才是计算机真正的运行方式。
连接就是一次有去有回的寄送快递的过程寄送的快递员不是同一个人。
先把三次握手抛开直接到握手完毕完毕之后呢看图 我们在浏览器端建立了一个 XMLHttpRequest 对象在服务端也会建立一个类似XMLHttpRequest对象这个对象里面记录了什么
Swoole 文档 这个文档里getclientinfo 返回了一个对象这个对象正式服务端XMLHttpRequest存储的一些信息就是这些信息记录着客户端的 IP 和客户端的端口 有点懵为何服务端还记录着客户端的端口号端口号不是服务端才有的有时候程序员看不到程序的全貌因为程序是虚拟的除非有人告诉你或者你自己发现否则它们对你而言就不存在。
回到寄送快递的概念
你在一栋楼里你要寄东西给别人收货员就会同时记录你的门牌号否则服务端回传给你的信件你就收不到了普通我们寄快递是单向的所以你寄给服务端的包裹里就要有你的门牌地址和你的所住的大楼这个客户端对象有一种能力就是可以把给到它的 data发送给它的客户端。它同时还把自己注册到操作系统上操作系统会分配一个端口号给它等到这个端口收到消息后服务端发过来的操作系统就会把这些信息转发给它的 onsucess 函数形成了一次消息的请求与回调。
讲到这里你觉得连接还有长短之分吗你觉得连接还是连续的概念吗
客户端的XMLHttpRequest
客户端的XMLHttpRequest 同样也记录着服务端的信息在没有出现任何服务端要关闭或者网络中断这玩意是服务器检测并告知给XMLHttpRequest的XMLHttpRequest都不会消失一直留在内存里。
这就到了你编程的环节了你new 了一个XMLHttpRequest当 XMLHttpRequest 三次握手之后确定远程服务端正常存在且已经安排了人来帮你处理事情了你就可以放开心的往服务端发消息了。
但是快递站分配给你的快递小哥只有一次当你用XMLHttpRequest发完一个包裹之后同时另外一个快递小哥把服务端包裹拿给你后他就给你拜拜了下次你再想发信息你得再跟快递站下单让小哥过来取包裹。
这就是远程服务端对待 Http 请求反应只要你是 Http 请求只要返回给你数据了之后就跟你就拜拜了下次有事再说这特别像你去政务大厅办事一次只办一次事办完 over。
早期的 HTTP1.0
没有快递站的概念为啥用的人少呗你想寄东西就自己去建个快递站然后再把东西交给快递小哥送过去拿过来。
随着业务量的提高你觉得不能忍每次都要你去造一个快递站这种事想想来就来气于是你揪结了一群请求要求建个快递站
HTTP1.1
仅仅要建立个快递站的话是不需要更改 HTTP1.0版本的因为 HTTP 只是一个协议为了要把协议拉下水你不改协议谁给你劳师动众重新造快递站你凑合着用吧这其实也是现实世界的一种映射既然要整修那就得有个名头这个名头就是 HTTP1.0 有些协议不能满足我的需求了因为我要建快递站所以我需要新的寄送方式。看似无关的两个东西整合在一起了于是借着改 HTTP 协议的名头把传输层给改了。
改成了有圆通、中通、国通各种通的快递站每次你要发包裹都找个排队人少的要求给你分配一个快递员来取包裹发包裹把服务端返回来的包裹拿给你。
这个就是 HTTP1.1中有名的 tcp/ip 复用技术先把快递站建了然后发包裹这件事交给比较闲的那个站这就是连接池的概念。
但是新的问题又来了
我的请求还是太多了我要一下子发送 100 个包裹业务量又大了一个快递小哥必须一次性把 100 个包裹都发给服务端然后还得把这 100 个包裹反馈结果都按顺序带回来一旦搞乱了我就分不清楚哪个对哪个了。
此时你等了好久好久快递小哥才把 100 个包裹的返回信息给你拿来了回来偶尔还会有丢失你还得重发这已经让你忍不了了你要求服务端继续升级不能按照这种方式来传递要换种方式。
HTTP2.0
我想怎么发就怎么发想什么时候发就怎么发想让谁发就让谁发每个包裹上快递小哥都会帮我打上标记返回来的时候也会带着这个标记这样一出一进你就能对上号了。
所以你就能各种发了。当然不能单干这个事情还得拉着协议变更一下搞事情于是 HTTP 协议又升级了。
以上就是 HTTP 的发家史。
Websocket 协议的由来
HTTP 一直都是发一次返回一次下次发货还的下单每次下单都得填单真恶心能不能只让我填一次之后让我和服务端直接调派小哥来传递我们的信件呢
当然是可以的解决方式是服务端提出来了你先用 Http 请求给我发一条信息然后在里面追加一个 Upgrade 升级标签我收到后就安排专属小哥来给你送信件只有你就不用填单了。
你一听觉得很棒然后就跟服务端说我们如果不按Http 方式沟通那怎么能告知一些消息给你呢比如我想跟你说拜拜或者说有些包我没收全你还得重复再或者我说你给我发的包太大了等等。
于是服务端说那就再造一个协议专门解决你说的这些问题吧我们称他为 Websocket 如何
你高兴地说“太棒了于是 Websocket 协议诞生了” 以前参考的文章
http的长连接和短连接史上最通俗 - 简书1.以前的误解 很久之前就听说过长连接的说法而且还知道HTTP1.0协议不支持长连接从HTTP1.1协议以后连接默认都是长连接。但终究觉得对于长连接一直懵懵懂懂的有种...https://www.jianshu.com/p/3fc3646fad80