【计算机网络】前后端分离,HTTP协议,网络分层结构,TCP,强缓存/协商缓存

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

前后端分类

  • 早期的网页都是通过后端渲染完成的:服务器端渲染(SSR);流程就是客户端发出请求,服务器端接受请求并返回相应HTML文档,然后页面刷新,客户端加载新的HTML文档
  • 客户端渲染的缺点:当用户点击某个按钮向服务器发送请求时,页面本质上只是一些数据发生了变化,而此时服务器却要将重绘的整个页面再返回给浏览器加载,而明明只是一些数据的变化却迫使服务器要返回整个HTML文档,这样给网络带宽带来不必要的开销。
  • 有没有办法再页面数据变动时,只向服务器请求新的数据,并且在阻止页面刷新的情况下动态的替换页面中展示的数据呢?这时候就出现了Ajax
  • Ajax是一种实现无页面刷新,获取服务器数据的技术,它的异步特性最重要,可以在不重新刷新页面的情况下与服务器通信,交换数据,或更新页面
    在这里插入图片描述
    在这里插入图片描述

HTTP协议

  • 这是一个超文本传输协议,是一个应用层协议;设计HTTP最初的目的是为了提供一种发布和接受HTML页面的方法;通过HTTP或者HTTPS协议请求的资源由统一资源标识符URL来标识。
  • HTTP是一个客户端和服务器端之间请求和相应的标准;通过浏览器或者其他工具,客户端发起一个HTTP请求到服务器上指定的端口,响应服务器上存储的一些资源。

HTTP组成

  • 一次HTTP请求主要包括:请求和响应
    下面的是请求信息

    响应信息
    在这里插入图片描述

HTTP的版本

  • HTTP/0.9:发布于1991年,只支持GET请求方法,获取文本数据,只要为了获取HTML的内容
  • HTTP/1.0:支持POST,DEAD等请求方法, 支持请求头,响应头等,支持更多种数据类型(不再局限于文本数据),但是浏览器的每次请求都需要与服务器建立一个TCP链接,请求处理完成后立即断开TCP连接,每次建立连接增加了性能损耗;
  • HTTP/1.1:增加了PUT,DELETE等请求方法,采用持久链接(keep-alive),多个请求可以共用同一个TCP连接

HTTP的请求方式

  • GET:get方法请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据。
  • EHAD:HEAD方法请求一个与GET请求的响应相同的响应,但是没有响应体。比如在准备下载一个文件前,先获取文件的大小,再决定是否进行下载
  • POST:post方法用于将实体提交到指定的资源
  • PUT:put方法用于请求有效的payload替换目标资源的所有当前数据
  • DELETE:delete删除指定的资源
  • PATCH:patch方法用于对资源的相应部分的修改

HTTP请求头

  • 在请求对象的header中包含很多有用的信息,客户端会默认传递过来一些信息
  • content-type是这次请求携带的数据的类型
    application/x-www-form-urlencoded:表示数据被编码成以&分隔的键值对,同时以=分割键和值
    application/json:表示一个json类型
    text/plain:表示文本类型
    application/xml:表示是XML类型
    multipart/form-data:表示是上传文件
  • content-length:文件的大小长度
  • keep-alive:http是基于TCP协议的,但是通常在进行一次请求和响应结束后会立刻中断,在http1.0中,如果想继续保持连接:1.浏览器需要在请求头中添加connection:keep-alive2.服务器需要在响应头添加connection:keep-alive;当客户端再次放请求时,就会使用同一个连接,直到一方中断连接;在http1.1中,所有的连接默认是connection:keep-alive的,在不同的Web服务器会有不同的保持keep-alive的时间
  • accept-encoding:告知服务器,客户端支持的文件压缩格式,比如js文件可以使用gzip编码
  • accept:告知服务器,客户端可以接受文件的格式类型
  • user-agent:告诉服务器,客户端相关的信息即ua字符串,该信息也可以通过BOM接口的navigator.userAgent读取到
  • Host:告诉服务器,客户端是使用什么域名及端口请求的服务器资源
  • Accept-Language:告诉服务器,客户端希望响应体中户阅读的语言是什么
  • Referer:告诉服务器这个资源请求到后会被哪个页面使用(一般在请求图片之类的资源时候会有这个请求头字段);该头部字段的名字在协议中被定义错了,正确的单词写法是Referrer(引荐的意思),服务器通过这个请求头就知道这个资源是给到哪个页面使用的,如果服务器发现使用该资源的网页并不是自家公司的页面,则可以选择不返回相应的内容,这个称为"防盗链";但是这个字段有可能泄露用户隐私,因为地址栏中的完整地址可能会发往资源服务器,而服务器可能是另一家公司,所以现代浏览器可以让页面设置不发这个头,或者只发送端口及之前的内容,称为Referer-Policy
  • if-none-match:告诉服务器,如果服务器那边这个资源的hash不是头部字段的值,则返回,如果相等,则不用返回,浏览器直接使用本地缓存的版本;所以如果浏览器发送这个头,说明浏览器必然有该资源的缓存版本,浏览器第一次请求某个资源,必然不会带上这个头 ,这个如果hash相等,也是返回304
  • if-Modified-Since:告诉服务器,如果服务器的资源自这个时间修改过,则返回新的版本,如果服务器判断这个头的时间之后没有修改过字段,则不用返回,而是返回304 Not Modified,让浏览器使用它本地缓存的版本,如果自这个时间修改过,则返回新的资源和最后修改时间。

HTTP响应头

  • last-modified:表示响应这个资源的最后修改时间
  • etag:表示响应的这个资源的hash(淘宝的响应头有),和if-none-match配合使用
    上面两个响应头与协商缓存相关
  • Date:告诉客户端当前时间
  • content-encoding:响应体的压缩算法
  • expires:告诉客户端该资源何时过期,可用于强缓存
  • Accept-Ranges:告诉客户端,服务器支持片段响应的片段表示范围,可以用来实现断点续传(今天下载一部分,明天下载一部分)
  • content-security-policy:html页面的响应头,内容安全策略(白名单机制),可以设置页面里的代码或者script,img标签等能够加载哪里的资源;可以设置页面js代码能够连接哪个服务器,可以设置页面能够加载哪个服务器的字体等
强缓存和协商缓存
  • 强缓存:在需要使用某资源时,如果未到资源的过期时间,不发请求,直接使用本地缓存版本
  • 协商缓存,一定会发请求询问服务器是否有资源的最新版本

HTTP 响应状态码

  • 200:客户端请求成功
  • 201:POST请求,创建新的资源
  • 301:请求资源的URL发生改变,响应中会给出新的URL,也就是重定向,301状态码表示资源被永久移动到新的URL
  • 302:也是跳转,302状态码表示资源被临时移动到新的URL,可以通过后退退回到跳转前的地址上去
  • 304:协商缓存成功
  • 400:客户端的错误,服务器无法或不进行处理
  • 401:未授权的错误,必须携带请求的身份信息,常见于未登录
  • 403:客户端没有访问权限,被拒绝
  • 404:服务器找不到请求的资源
  • 500:服务器遇到了不知道如何处理的情况
  • 501:服务器在处理请求的过程中出错了,例如,如果客户端发送了一个服务器不支持的HTTP方法
  • 503:服务器不可用,可能处理维护或者重载的状态,暂时无法访问

AJAX发送请求

  • AJAX是异步的JavaScript和XML,它可以使用JSON,XML,HTML,text文本等格式发送和接受数据
  • 如果来完成Ajax请求呢 ?
  • 通过XHR方法
    第一步:创建网络请求Ajax对象(使用XMLHttpRequest)
    监听XMLHttpRequest对象状态的变化(宏任务),或者使用onload事件监听
    配置网络请求(通过open方法)
    发送send网络请求
 const xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function () {
        if (xhr.readyState !== XMLHttpRequest.DONE) return;
        console.log(JSON.parse(xhr.response));
      };
      xhr.open("GET", "http://123.207.32.32:8000/home/multidata");
      xhr.send();
  • 注意上面这段代码的那个判断,因为一次HTTP请求后,XMLHttpRequest有很多的状态变化
    在这里插入图片描述

网络基本概念

局域网/广域网

  • 局域网:就是将两台,甚至多台主机连接在一起,最典型的情况就是拿一根网线,把两个主机连在一起;一般组件局域网,会使用交换机等
  • 广域网:很多个局域网组合在一起,构成了一个很大的网络就是广域网,全世界最大的广域网叫做因特网。

IP地址和端口号

  • IP地址描述了网络上的一个主机的位置,端口号描述了主机上的某个应用程序,IP地址,就相当于是收货的地址。
    端口号,就相当于 收件人的电话。通过这两个东西,我们就能确定一台主机上唯一的应用程序。

网络分层结构

  • 物理层,链路层,网络层,传输层,应用层
  • 物理层:提供在相邻的设备间提供01传送的功能
  • 链路层:在两台直接相连的设备之间收发数据,数据包发送到网络上之后,至于能不能收到就不管了
  • 网络层:在网络中的任意两台设备间收发数据(点对点单向传输),网络在末端一般是树状结构,在主干道上是网状结构
  • 传输层:tcp,在两个应用程序间收发数据,传输层包括会话层和表示层
  • 应用层:在网络上数据是如何表示的在应用层就规定了,例如是http协议
  • 好处:每一层之间只需要关注相邻的两个层之间的关系

物理层

  • 指相邻设备间的物理连接,连接可以通过有线也可以是无线,有线的话有纯线,还有光纤,光纤有时候会传播很远,中间就会有中继站。物理层就是将数字信息与模拟信号之间的传输及转换,保证通信的两端能够理解01

链路层

  • 链路层仅负责直接连接的设备通信,连接的方式有总线,交换机(数据就直接从哪到哪两个直接沟通,别的机器收不到,但是总线方式就像广播一样,全都能收听到这个数据,并且交换机和支持各种拓扑结构)等等,发送的是数据包(一连串的字节),数据包里有MAC地址,MAC就是网卡的出场编号,指名将数据包发给谁,CRC是校验,通过某种哈希算法,根据前面的数据算出四个字节的东西,如果这个CRC变了,说明前面的数据就变了
  • 每个网卡会有一个全球唯一的MAC地址,用来标识这个设备的ID,作用是在局域网中区分不同的设备,局域网之间的通信是通过MAC地址的,而非IP地址,计算机会通过ARP协议把IP地址转换为目标机器的MAC地址
    在这里插入图片描述
    在这里插入图片描述

ARP协议

  • 我们发送数据包的时候需要直到目的地址的MAC地址,但是我们第一次发送的时候怎么获取呢?这时候出现了ARP协议
  • 发送方先广播一下,问一下谁的ip地址是xxxx,数据包发送的目的地址是ff ff ff ff ff ff,然后如果找到了该ip地址的持有者,就会单独回给这个发送方自己的MAC地址

补充:ping命令:向目标主机发送了ICMP协议的请求报文,待目标主机回复ICMP协议的响应报文后,在控制台输出响应时间等信息,目的为了诊断网络

网络层

  • 网络层负责把IP数据包在全球范围内从起始机器送达到目标机器
  • IP数据包是如何到达目的地址的?通过中间的各个路由器的转发到达的目的地,每个路由器在收到一个数据包后,会查看该数据包的目的地址,然后根据自己的路由表来决定该数据包从哪一个网络接口出去,并发给哪一个下一跳路由器;而路由表中有一部分是静态的,即人工设定的,还有一部分是路由器运行过程中,根据与自身周围的各个路由器交换信息后自动生成的,并且会随着周围路由器的上下线,以及线路的情况,动态调整,动态路由的优点是能够适应网络拓扑变化,提供更好的网络弹性和自动化。
    在这里插入图片描述
  • 版本有4和6,IP头部长度字段指示IP数据包头部的长度,总长度表示整个IP数据包的长度,包括IP头部和数据部分。它以字节为单位,最大值为65,535字节。标识:标识字段用于标识IP数据包的片段。当一个数据包太大而需要分割成多个片段进行传输时,标识字段在这些片段中保持相同,以便接收方可以重新组装它们。片偏移字段指示当前片段在原始数据包中的位置。生存时间字段指定IP数据包在网络中可经过的最大路由跳数。每经过一个路由器,该字段的值减1。当生存时间为零时,数据包将被丢弃,一般是64TTL。协议字段标识IP数据包的上层协议,如TCP、UDP、ICMP等。这个字段决定了接收方在接收数据包后如何解析有效载荷。头部校验和用于验证IP数据包头部的完整性。源地址(Source Address):源地址字段指示数据包的发送者的IP地址。目标地址(Destination Address):目标地址字段指示数据包的接收者的IP地址。

传输层

UDP协议

  • UDP协议在这一层,UDP仅仅是对IP的增加了端口部分,以区分电脑上的不同软件,socket就是和一个端口绑定的对象
    在这里插入图片描述

  • UDP协议是直接给定目标位置将数据送过去,无响应,不知道有没有送到,接收方会校验数据的正确性,所以送到的话一般来说是对的,发往同一个目标的数据也不保证有序,但是如果当数据量较小(一个数据包可以放的下)的时候,UDP是完全可以胜任的,例如DNS等

  • 这时候就出现了TCP协议

TCP协议

  • 现在有两个机器,其中一个机器有一个端口用来监听请求,当另一个机器发起了连接请求的时候,他们建立了连接,这一个端口也可以同时和很多的主机端口建立连接
  • TCP协议包头
    在这里插入图片描述
  • 序号用于标识段中数据在整个数据流中的位置。接收方使用序号对接收到的段进行排序和重组,以确保数据按正确的顺序进行重组和交付给应用层。确认号是当数据是由多个TCP包发送的,如果发送了5个TCP包,我收到了1,2,4片段,那么返回的确认号就是第3个TCP的编号,确认号:目前最希望收到的下一个字节的编号。
  • URG:紧急数据包
  • ACK:确认,表示这次发送的数据是有意义的,基本都是1
  • RST:当连接出现错误,要断开连接,RST=1就是表示连接重置
  • FIN:连接正常的数据都传送完毕了,要断开连接了,发送一个数据包里的FIN=1
  • 窗口:接收方要在内存中划定一部分区域,用于接受传过来的多个TCP包,这个窗口也是不确定的,如果接受到的数据交付给上层了,那么窗口的头就往前走,窗口的大小就变小了,相当于一个滑动窗口
常用端口号
  • 80:HTTP服务器
  • 43:HTTPS服务器
  • 22:SSH服务器
  • 23:ftp服务器

三次握手四次挥手

  • 首先Server监听,customer客户端会发过来一个数据包,告诉Server端我想建立连接,服务器收到了消息之后告诉客户端ok,没问题,然后客户端再返回给服务器ok!连接才真正的建立完成
  • 第一次和第二次的syn=1,第二次和第三次的ack=1
    在这里插入图片描述
  • 当customer端全部发完了之后,会给server单发一个tcp包,FIN=1,然后server回一个ACK=1,虽然customer给server的包发完了,但是server还可以给customer发数据,最终server给cutomer发一个FIN=1的包之后,customer回一个ACK=1的包之后,才真正的断开了,也就是所谓的四次挥手
  • 挥手的话也可以是三次挥手,第二次挥手的时候,既回ack=1,还有fin=1

TCP状态图

  • 一开始是Closed关闭状态,如果是作为服务器的话,可以是Listen监听状态,然后收到SYN之后,发送SYN=1和ACK=1进入SYN-RCVD状态 ,之后收到客户端发送的ACK=1之后,也进入了Established成功连接状态,在变成SYN_RCVD状态的时候,应用进程关闭了或者不想和客户端建立连接了,回发送一个FIN=1,变成FIN_WAIT_1状态,如果是作为客户端的话,可以主动打开发送SYN,进入SYN-SENT状态,之后有可能接受到对方发的SYN=1和ACK=1, 之后客户端回发送ASK=1,这时候就进入了Established连接成功状态了
  • 三次挥手:如果是想要先断开连接的一方,发送FIN之后,进入FIN_WAIT_1状态,之后收到对方发过来的ACK=1和FIN=1之后,发送给对方ACK=1,状态变为TIME_WAIT
  • 四次挥手:如果是想要先断开连接的一方,发送FIN之后,进入FIN_WAIT_1状态,之后收到对方发过来的ACK=1,这时候就变成了半连接状态FIN_WAIT_2,然后过一段时间之后,我收到了对方发过来的FIN=1,之后我发送ACK=1,进入TIME_WAIT状态

粘包

  • TCP粘包(TCP packet sticking)是指在TCP通信中,发送方连续发送的多个数据包在接收方端被粘合在一起,形成一个大的数据块,从而导致接收方难以正确解析和处理数据。这种现象可能会在网络传输过程中出现。
  • 解决粘包的方法:关键就是要在应用层协议这里,加入包之间的边界。粘包问题世界是应用层的问题。例如:约定每个包以 ;结尾。这个时候只要能够按照 ;来进行切分,就可以区分出当前从哪到哪是一个完整的包。如果通过 框架/库 的话,一般粘包问题就已经被 库/框架 处理了。

TCP七个个核心特性

确认应答
  • 这个是保证TCP可靠传输的核心机制,在接收方收到消息之后,就会给对象返回一个ACK,表示自己已经收到了
超时重传
  • 相当于是对确认应答进行了补充,确认应答是在网络一切正常的时候,通过ACK通知发送方,我收到了。如果出现了丢包的情况,超时重传机制就起到效果了
连接管理
  • 三次握手,常见的状态:LISTEN表示服务器启动成功,端口绑定成功,随时可以有客户端来建立连接;ESTABLISHED:表示客户端已经成功连接,随时可以进行通信;断开连接就是四次挥手,谁发起的FIN谁就是进入了TIME_WAIT状态,三次握手,一定是客户端主动发起的(主动发起的一方才叫客户端)。四次挥手,可能是客户端主动发起,也可能是 服务器 主动发起的。
    在这里插入图片描述
    在这里插入图片描述
滑动窗口
  • 滑动窗口存在的意义,就是在保证可靠性的前提下,尽量提高传输的效率;由于确认应答机制的存在,导致每次执行一次发送数据,都需要等待上一个ACK的到达,这样效率就会大大降低;滑动窗口就是一次发送一波数据,相当于把多份的ACK的时间压缩称为一份ACK了,只要 1001 到了。就可以往下多发一组(4001-5000),如果是 2001 到了,就继续往下发一组(5001-6000),此时等待的ACK 的范围就是 3001、4001、5001、6001。
流量控制
  • 流量控制是滑动窗口的延申,目的是为了可靠性;滑动窗口越大,传输的速率就越高,不光要考虑发送方,还要考虑接收方。发送方发的太快,接收方处理不过来就会把新收的包丢掉了,发送方还得重传,流量控制的关键就是能够控制接收方的速度,有一个接受缓冲区,就像一个阻塞队列,如果太多了就慢点,如果少就快点
拥塞控制
  • 拥塞控制也是对滑动窗口的延申,限制了滑动窗口的发送速率,开始的时候,以一个比较小的窗口来发送数据,如果数据很流畅的到达了,那么就加大窗口大小。加大到一定程度之后,出现了丢包(就意味着链路出现拥堵了),然后再减小窗口。通过反复的 增大/减小 最终达到”动态平衡“。通过拥塞窗口来限制滑动窗口的大小。最终滑动窗口的大小 由 拥塞窗口 和 流量控制窗口共同决定,由小的一方决定。一旦丢包,就立刻让窗口变小,降低速度,然后继续去试探的增大。
延时应答
  • 相当于是流量控制的延申,流量控制是踩了下刹车,使发送方发的不要太快。延时应答就是在这个基础上,能尽量的再让窗口更大一些。就是在有限的情况下,尽可能提高一点传输速度。

心跳包

  • 在网络通信中,心跳包(Heartbeat Packet)是一种用于维护连接状态和检测通信链路可用性的小型数据包。它周期性地发送给对方,用于确认对方的存活状态和保持连接的稳定性。
  • 优点:
    状态监测:心跳包能够周期性地检测客户端或设备的状态,确保连接的存活性和可用性。
    故障检测:通过心跳包的响应情况,可以快速检测到客户端或设备的故障,便于及时处理。
  • 缺点:
    增加网络负载:频繁发送心跳包会增加网络传输的负载,占用一定的带宽和资源。
    延迟影响:发送和接收心跳包需要一定的时间,可能会引入轻微的延迟,特别是在网络状况较差或数据量较大时。
  • 如果你进入电梯后发生断网,无法直接发送心跳包到服务器进行检测。因为网络连接已经中断,无法与服务器进行通信。在这种情况下,无法通过常规的心跳包机制进行检测。
    然而,你可以考虑使用以下方法来检测网络断连:
    重连机制:当网络连接断开后,可以在电梯重新连接网络时尝试重新建立与服务器的连接。这可以通过定时重连的方式实现,一旦检测到网络恢复,可以尝试重新连接服务器并发送心跳包。
    网络检测:电梯可以实时监测网络连接状态。可以通过定期发送小型数据包到已知的可靠服务器,例如发送ICMP回声请求(Ping)来检测网络连通性。如果连续多次发送都无响应,则可以判定为网络断连,并触发相应的处理逻辑。

WebSocket

  • 在TCP中,如果我们如果要实现两端实时通信,webSocket协议可以保证我send一次消息,另一端保证能够收到一次消息。TCP是以字节流为单位,而WebSocket是以消息为单位,发送方发送多少个消息,接收方一定接受多少个消息

TCP和UDP的区别

- List item

  • 有链接和无连接:有链接就像打电话一样,是因为打电话的时候,必须要接通了之后才能交流,没有接通,双方就无法交流,有链接就是两则和确认建立联系后,就可以开始交互了;而无连接就像发微信一样,我们发过去之后,对方看没看到我们是不知道的
  • 可靠传输和不可靠传输:可靠传输是发送方知道接收方有没有接受到数据,不可靠传输就是发送方不知道接收方有没有接受到数据
  • 面向字节流和面向数据报:数据面向字节流是以字节为单位进行传输的,面向数据报是以数据包为单位,一个数据报都会明确大小,一次发送或者接受必须是一个完整的数据报;
  • 全双工和半双工:全双工就是一条链路双向通信,半双工就是一条链路单向通信

————————————————————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小浦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值