关于计算机网络/Http协议的一些问题整理。前端可能需要了解的知识重新整理。

做一个计算机网络的复习吧。(幸好以前的大学资料都还没删,今天发现的时候感觉自己的懒有时候还是有用的哈哈哈,不过大学学的和工作要用到的不太一样哈哈哈)

1、计算机网络五层模型

由OSI七层模型和TCP/IP四层结合起来的五层协议,分为物理层、数据链路层、网络层、传输层、 应用层。

在网络分层结构中,第N层是第N-1层的用户,同时是第N+1层的服务提供者。

下两篇文章结合观看,然后复述一下应该差不多了。

通俗易懂讲解计算机网络五层模型是如何相互协作的:https://blog.csdn.net/m0_37907797/article/details/81232323
五层协议体系结构的各层功能:
https://blog.csdn.net/cainv89/article/details/46885197


现实中如何使用TCP/IP体系?

在这里插入图片描述


重点: 各层级有什么协议

在这里插入图片描述


开始各种问题:
1、TCP和HTTP的关系?
https://www.cnblogs.com/baizhanshi/p/8482612.html


2、HTTP和HTTPS的区别
https://www.jianshu.com/p/13a1b955d095
HPPTS传输流程:https://www.jianshu.com/p/33d0f8631f90

①HTTP是基于TCP协议,而HTTP是基于SSL/TLS,SSL/TLS又运行在TCP之上,相比HTTP的三次握手,HTTPS在三次握手之后多了SSL握手,所有传输的内容都经过加密的。
②HTTP使用的是80端口,HTTPS使用的是443端口。
③HTTPS协议需要到CA申请证书,可以有效的防止运营商劫持,解决了防劫持的一个大问题。

HPPTS传输流程:


(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

(3)客户端的浏览器与Web服务器开始协商SSL/TLS连接的安全等级,也就是信息加密的等级。

(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

(5)Web服务器利用自己的私钥解密出会话密钥。

(6)Web服务器利用会话密钥加密与客户端之间的通信。

公钥私钥是非对称加密,之后确定了https连接后,使用会话密钥加密通信,是对称加密。


3、TCP和UDP对比
https://blog.csdn.net/leewccc/article/details/70225610


4、 HTTP2.0 与 HTTP1.X
详细对比了HTTP2和HTTP1.x
https://www.cnblogs.com/kaishirenshi/p/12575847.html
详细说了内部原理:
https://www.jianshu.com/p/63fe1bf5d445
一个简洁版本:
https://www.cnblogs.com/gxw123/p/13288957.html?utm_source=tuicool

HTTP1和1.1区别

1、缓存处理 ,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。

2、带宽优化及网络连接的使用 ,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

3、错误通知的管理 ,在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

4、Host头处理 ,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

5、长连接 ,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

HTTP2和1.1区别:

区别:
二进制格式: HTTP1.X使用文本格式解析,而http2使用二进制格式解析,所以http2可以尝试一些以前不能的传输方式,更加方便、健壮。
多路复用 HTTP/1.x 虽然也能并发请求,但是多个请求之间的响应会被阻塞的。HTTP2引入了流的概念,针对同一个域名的资源之建立一个tcp链接通道,这条通道可以同时处理多个request,一个request对应一个id让服务端识别处理,实现了并发请求、并发处理。
报头压缩 HTTP 协议是没有状态,导致每次请求都必须附上所有信息。所以,请求的很多头字段都是重复的,比如Cookie,一样的内容每次请求都必须附带,这会浪费很多带宽,也影响速度。
对于相同的头部,不必再通过请求发送,只需发送一次;
HTTP/2 对这一点做了优化,引入了头信息压缩机制;
一方面,头信息使用gzip或compress压缩后再发送;
另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号。
服务端推送 :服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。例如网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了。


5、由上面查资料引出的新问题:HTTP Keep-Alive模式
内还总结了HTTP头部字段,写的很好。
https://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html
讲解keep-alive,还有tcp的keep-alive: https://blog.csdn.net/xiaoduanayu/article/details/78386508

http1.1之后会默认开启keep-alive功能,它到底有什么用处。

keep-alive保证了http请求的长连接,我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

重点是保持长连接后,浏览器如何知道服务器已经响应完成了呢?
两个响应消息头部字段:Transfer-Encoding和Content-Length
可知响应体长度使用:Content-Length,接收到一定的字节数浏览器就知道响应完成。
不知道响应体长度时,使用Transfer-Encoding: chunked。该响应头表示响应体内容用的是分块传输,此时服务器可以将数据一块一块地分块响应给浏览器而不必一次性全部响应,待浏览器接收到全部分块后就表示响应结束。


6、http缓存是怎样的。

参考

  1. http缓存::https://www.cnblogs.com/chengxs/p/10396066.html
  2. 讲的很详细的(包括静态文件资源、CDN缓存的缓存补充!)https://www.cnblogs.com/echolun/p/9419517.html
  3. 扩展:大公司里怎样开发和部署前端代码? - 张云龙的回答 - 知乎https://www.zhihu.com/question/20790576/answer/32602154

http的缓存分为强制缓存和协商缓存。强制缓存主要通过 服务器响应消息头Expires(低版本); Cache-control(主要)两个字段控制,协商缓存通过Last-Modified、If-Modified-Since,Etag、If-None-Match四个字段控制。

Cache-Control
是最重要的规则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx秒后失效
no-cache: 需要使用对比缓存来验证缓存数据 no-store:
所有内容都不会缓存,强制缓存,对比缓存都不会触发(对于前端开发来说,缓存越多越好,so…基本上和它说886)

浏览器缓存的流程,能用自己的话把下面的图复述出来就差不多了
在这里插入图片描述


etag和last modify分别什么优点缺点,适合什么场景 Etag比lastModified更加严谨,如果资源发生变化,Etag就会发生变化,就会把最新的资源给客户端返回去,而lastModified不识别s(秒)单位里的修改,所以如果资源在s(秒)单位里发生了修改,那lastModified也不会发生改变,这样如果只用了lastModified,客户端得到的资源就不是最新的;但是设定了Etag之后,每次客户端发出请求,服务端都会根据资源重新生成一个Etag,对性能有影响

一次面试题1551我蒙了,如果给css文件设置了max-age=30天,期间服务端生成了新的css文件,怎么告知浏览器缓存让它更新资源呢?

(首先肯定是http请求的时候,服务端才能把最新的发出去,我答了几个http2.0主动推送 / 长链接 / 热更新之类的啊啊啊,好笨哈哈哈)

为静态文件添加MD5或者hash标识,解决浏览器无法跳过缓存过期时间主动感知文件变化的问题。下次请求数据的时候比对hash标识是否一样,如果不一样就强制更新缓存。大概就像下面这样,html文件一般是不会进入http缓存的,然后根据html发起请求,每个请求的资源文件都有一串自己的随机字符串标识,如果标识不同,说明这个请求不会命中http内的旧请求缓存,直接去服务器查最新的了。
< link src=‘xxx.css?v=2134523’ />


7、DNS解析方式
它所提供的服务是将主机名和域名转换为IP地址,基于UDP传输方式,先查找浏览器DNS缓存和host文件,没有就查系统DNS服务器,再没有就查本地DNS服务器,整个过程是递归查询方式。
本地DNS服务器还没查到,就会向根域名服务器发起请求,根域名服务器一般会返回顶级域名服务器地址,然后本地DNS服务器就会再请求顶级域名服务器,顶级域名服务器会返回权威域名服务器地址。这个过程是迭代查询。


8、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协议版本


9、在网址内输入url按回车之后发生了什么?
1、url其实也是发送一个请求,首先查询本地http缓存,看看有没有http缓存这个请求,没有的话就下一步。(http缓存)
2、DNS解析,把url解析成ip地址。(上面的DNS解析过程)
3、对ip进行tcp三次握手连接建立连接通道。
4、现在的浏览器一般都是强制进行https链接的,接下来建立ssl/tls连接,双方确认公钥密钥、加密算法。(https)
5、发送http请求获取资源。
6、获取来的资源根据cache-control响应头决定要不要加入http缓存。
7、浏览器解析响应资源,html解析成Dom树,css解析成style tree,这两个是同步进行的,遇到js就会停下来使用js引擎解析,js解析会阻塞html和样式解析。
8、把Dom树和style树结合生成render tree。
9、接下来进行layout,进行节点位置信息计算。
10、最后遍历渲染树,进行绘制,页面就出现在了用户眼前。


10、CDN缓存

主要用于缓解主服务器压力,以及避免较远距离的数据传输带来的网络问题等等,可以采用CDN服务器缓存静态资源。

参考:https://www.cnblogs.com/yfceshi/p/7220542.html
应该放在这里吧。在第九题的顺序里,可以修改一点地方,DNS不会直接解析出服务器IP。
(1) 用户向浏览器提供要訪问的域名;
(2) 浏览器调用域名解析库对域名进行解析得到CNAME(域名记录),再解析CNAME域名获取全局负载均衡的服务器IP地址(智能调度DNS)。
向这个IP地址请求数据,然后全局负载均衡DNS返回所在区域的负载均衡服务器ip给用户(这就是获取到CDN缓存节点)。
调度算法一般是依据地理位置信息解析相应的IP地址的,使得用户能就近訪问。
(3)浏览器就会向CDN缓存节点请求数据,如果CDN内数据也过期了,就会再向上一级请求,直到根服务器返回最新数据。


11、TCP三次握手详细
!我面试被问到我惊呆了哈哈哈我发现自己不会。
通俗易懂:https://baijiahao.baidu.com/s?id=1614404084382122793&wfr=spider&for=pc
说的很完整的一篇:https://blog.csdn.net/qq_38950316/article/details/81087809

首先是SYN/ACK两个字段,是TCP报文内确认报文信息的字段。
在这里插入图片描述

三次握手:

SYN:同步序列编号(Synchronize Sequence Numbers)。
ACK确认字段,SYN连接请求报文。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

大概是客户端发送请求连接SYN包,然后服务端接收到之后确认的同时再发送请求连接,因此是ACK+SYN包,客户端接收到之后确认可以连接,发送ACK包。双方进入TCP连接成功状态。

为什么要三次握手,而不是两次?
如果两次握手的话,比如客户端发给服务端,服务端返回的消息延迟或者丢失了,服务端以为自己成功连接,客户端不知道,就会一直发请求确认的报文,并且忽略服务端发来的其他信息,而服务端在发出的分组超时后,重复发送同样的分组。形成死锁

四次挥手:

双方各发起一次,并且各确认一次,因此有4次。
1)客户端发起请求停止连接,FIN=1,序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1)。
2)服务端接收到之后发回确认报文,如同意,则发回确认。在确认报文段中应使 SYN = 1,使 ACK = 1,其确认号ack = x + 1。然后客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。
3)接下来服务端要确认自己的请求已经发送完毕,可以关闭,则发送服务端的关闭连接请求报文,FIN=1,ack=u+1。
4)客户端接收后发回确认报文,ACK=1,ack=w+1。
5)客户端发回确认报文后会等待两倍报文段寿命后才真正关闭。

流量控制与拥塞控制:滑动窗口

拥塞控制:几种拥塞控制方法:慢开始、拥塞避免、快重传和快恢复。

在这里插入图片描述
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。
然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值