Ydl's Blog

计算机网络

2023-03-21

1. GET和POST请求的区别

应用场景:GET请求是幂等请求,对服务器的资源不会产生影响;而POST请求一般会对服务器资源进行变更

请求长度:由于浏览器限制了url长度,所以get请求发送参数的长度也会受到限制;POST请求则不会受到限制

书签:GET产生的url地址可以保存为书签,但是POST不可以

数据包:GET会把header和data通过一个TCP数据包发出去,而POST先通过OPTION发送header,响应100 continue后再发送data,最终响应200

本质上都是TCP连接,HTTP只是个行为准则,定义了不同的语义

2. 常见http请求头和响应头

常见的请求头

  • Accept:浏览器能够处理的内容类型
  • Accept-Charset:浏览器能够显示的字符集
  • Accept-Encoding:浏览器能够处理的压缩编码
  • Accept-Language:浏览器当前设置的语言
  • Connection:浏览器与服务器之间连接的类型
  • Cookie:当前页面设置的任何Cookie
  • Host:发出请求的页面所在的域
  • Referer:发出请求的页面的URL
  • User-Agent:浏览器的用户代理字符串

常见的响应头

  • Date:表示消息发送的时间

  • server:服务器名称

  • Connection:浏览器与服务器之间连接的类型

  • Cache-Control:控制HTTP缓存

  • Content-type:表示后面的文档属于什么MIME类型

    (1)application/x-www-form-urlencoded:浏览器的原生 form 表单,数据放在 body 里面,数据 key1=val1&key2=val2 的方式进行编码

    (2)multipart/form-data:通常上传文件时使用该种方式

    (3)application/json:消息主体是序列化后的 JSON 字符串

    (4)text/xml:主要用来提交 XML 格式的数据

3. http状态码304是多好还是少好

搜索引擎蜘蛛会通过一定时间内对网站抓取返回的状态码来调节对该网站的抓取频次。如果网站一定时间内一直处于304的状态,那么会降低对网站的抓取次数。相反,若网站变化的频率非常之快,每次抓取都能获取新内容,那么回访率也会提高。

304意味着使用缓存,网站的加载速度会更快;但是过多304会导致网站的快照停止

网页快照是指搜索引擎在收录网页时,对网页进行备份,存在自己的服务器缓存里,当用户在搜索引擎中点击“网页快照”链接时,搜索引擎再将Spider系统当时抓取并保存的网页内容展现出来

4. 常见的http请求方法

  • GET::向服务器获取数据;
  • POST:将实体提交到指定的资源,通常会造成服务器资源的修改;
  • PUT:上传文件,更新数据;
  • DELETE:删除服务器上的对象;
  • HEAD:获取报文首部,与GET相比,不返回报文主体部分;
  • OPTIONS:询问支持的请求方法,用来跨域请求;
  • CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信;
  • TRACE: 回显服务器收到的请求,主要⽤于测试或诊断。

5. options请求的使用场景

  • 获取服务器支持的所有HTTP请求方法;
  • 用来检查访问权限,例如在进行CORS跨域资源共享时,对于复杂请求,就是使用 OPTIONS 方法发送嗅探请求,以判断是否有对指定资源的访问权限

6. HTTP各个版本区别

HTTP1.0和HTTP 1.1的区别

  • 连接方面,http1.0 默认使用非持久连接,而 http1.1 默认使用持久连接。使用持久连接来使多个http请求复用同一个TCP连接
  • 资源请求方面,在http1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了;并且不支持断点续传功能。http1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,返回码是 206(Partial Content)
  • 缓存方面,在http1.0中主要使用If-Modified-Since、Expires来做为缓存判断的标准,http1.1 则引入了更多的缓存控制策略,例如 Etag、If-Modified-Since、If-None-Match
  • http1.1 中新增了 host 字段,用来指定服务器的域名。http1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了 host 字段,这样就可以将请求发往到同一台服务器上的不同网站。
  • http1.1 相对于 http1.0 还新增了很多请求方法,如 PUT、HEAD、OPTIONS 等。

HTTP1.1和HTTP 2.0的区别

  • 二进制协议:HTTP/2 是一个二进制协议。在 HTTP/1.1 版中,报文的头信息必须是文本(ASCII 编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”,可以分为头信息帧和数据帧。 帧的概念是它实现多路复用的基础。
  • 多路复用: HTTP/2 实现了多路复用,HTTP/2 仍然复用 TCP 连接,但是在一个连接里,客户端和服务器都可以同时发送多个请求或回应,而且不用按照顺序一一发送,这样就避免了”队头堵塞”的问题。
  • 数据流: HTTP/2 使用了数据流的概念,因为 HTTP/2 的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的请求。因此,必须要对数据包做标记,指出它属于哪个请求。HTTP/2 将每个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号。数据包发送时,都必须标记数据流 ID ,用来区分它属于哪个数据流。
  • 头部压缩: HTTP/2 实现了头部压缩,由于 HTTP 1.1 协议不带状态,每次请求都必须附上所有信息。所以,请求的很多字段都是重复的,比如 Cookie 和 User Agent ,一模一样的内容,每次请求都必须附带,这会浪费很多带宽,也影响速度。HTTP/2 对这一点做了优化,引入了头信息压缩机制。一方面,头信息使用 gzip 或 compress 压缩后再发送;另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送字段,只发送索引号,这样就能提高速度了。
  • 服务器推送: HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送。使用服务器推送提前给客户端推送必要的资源,这样就可以相对减少一些延迟时间。这里需要注意的是 http2 下服务器主动推送的是静态资源

HTTP3

使用UDP+QUIC的方式,其中QUIC整合了TCP以及TLS握手过程

解决队头阻塞:减少请求的次数(精灵图);域名分片,因为一个域名的连接数是有限的,所以划分多个子域名来处理请求,这些子域名指向同一台服务器;http/2解决队头阻塞只是应用层表面,然而还是基于传输层TCP的,收不到还是会要等待重传造成阻塞

7. HTTP和HTTPS协议的区别

  • HTTP是明文传输,而HTTPS则会对传输的内容加密(HTTP劫持)
  • HTTP是80端口,HTTPS是443端口

8. 在浏览器中输入baidu.com并回车后发生了什么

(1)解析URL: 首先会对 URL 进行解析,如果输入的 URL 不合法,将会把输入的内容传递给搜索引擎。如果没有问题,检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。

(2)缓存判断: 浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。

(3)DNS解析: 下一步是将域名转化成 IP 地址,首先判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。

(4)获取MAC地址: 当浏览器得到 IP 地址后,数据链路层的数据传输还需要知道目的主机 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求的主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,此时目的主机的 MAC 地址应该为网关的地址。

(5)TCP三次握手: 首先客户端向服务器发送一个 SYN 连接请求报文段,服务端接收到请求后向服务器端发送一个 SYN ACK报文段,客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。

(6)HTTPS握手: 首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。

(7)返回数据: 当页面请求发送到服务器端后,服务器端会返回一个 html 文件作为响应,浏览器接收到响应后,开始对 html 文件进行解析,开始页面的渲染过程。

(8)页面渲染: 浏览器的GUI渲染线程首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,如果没有则会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制,这时整个页面就显示出来了。

(9)TCP四次挥手: 最后一步是 TCP 断开连接的四次挥手过程。如果客户端认为数据发送完成,那么向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据,不过服务端仍旧可以发送数据给客户端,还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。

9. 长连接、短连接

http1.0默认是短连接,在完成一次请求响应后就关闭连接;http1.1默认是长连接,完成一次请求响应后,TCP连接不会断开,下一次请求响应会复用这个连接,在保持期间,如果没有数据包发送,需要双方发送链接检测包

长连接适用于请求响应频繁、点对点的通讯,并且连接数不能太多,例如数据库的连接

短连接适用于例如电商web网站的请求响应服务,如果每个用户占用一个连接那么会很消耗后端资源

10. 请求/响应报文

请求/响应行

请求/响应头

空行

请求/响应体

11. http2的首部压缩HPACK

在http2连接过程中维护了一个首部表来跟踪存储发送过的键值对,对于相同数据不再发送,新的首部键值对会使用哈夫曼编码来压缩,要么追加到表的末尾,要么替换之前的值

12. url的组成

13. https

在http的基础上使用ssl/tls来加密数据包,相比http具有身份验证(浏览器内置一些CA的数字证书,防止中间人攻击,)、信息加密(使用对称密钥加密,防止http劫持)、完整性校验(hash)的功能

建立连接过程

  • 服务器把自己的公钥发给CA,CA使用自己的私钥进行数字签名(对证书内容进行hash得到摘要,指定了HASH算法)并返回公钥证书
  • 客户端请求https连接,发送协议版本号、随机数A、客户端支持的加密方法,服务器返回公钥证书,随机数B
  • 客户端拿到公钥证书后,使用浏览器内置的一些CA的公钥进行解密并对公钥证书HASH比对,确认消息没有被篡改,得到服务器的公钥
  • 客户端生成随机数C,并用公钥进行加密,发给服务器
  • 服务端使用私钥解密随机数C,至此,客户端和服务端都有了A、B、C
  • 客户端和服务端使用约定好的加密算法加密ABC,生成对称密钥,之后就是对用对称密钥进行对称加密

14. 状态码

100 continue(OPTION)、101 switch protocol(websocket)、200 ok、204 no content(响应报文没有响应体)、206 partial content(响应报文使用content-range指定实体内容的范围)

301 moved permanently(永久重定向,location字段指定新的URI,已保存的书签会根据这个新的URI更新书签)

302 found(临时重定向,未登录用户访问用户中心重定向到登录页面就是302)

​ 303 see other(和302比较相似,明确表示采用GET方法获取资源)

​ 307 temporary redirect(和302相似,不过不会从post转为get)

302是http1.0的协议状态码,在http1.1版本的时候为了细化302状态码⼜出来了两个303和307

304 not modified(缓存)

400 bad request、401 unauthorized、403 forbidden、404 not found、405 method not allowed

OPTION会返回Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE

500 internal server error、502 bad gateway、503 service unavailable、504 gateway timeout

15. 网络模型

16. UDP和TCP的区别、使用场景、优劣,如何让UDP更可靠

区别

  1. TCP面向连接,UDP是无连接的
    TCP在开始数据传输之前要经过三次握手,UDP却不需要任何准备即可进行数据传输,因此UDP不会引入建立连接的时延
  2. TCP提供可靠的服务,UDP则是尽最大努力交付
    TCP传输数据具有重传机制,如果在传输数据的过程中发生丢包事件,发送方会重传丢失的数据以保证发送的数据一定能完整到达接收方,因此是可靠的。
    UDP在网络层不能保证数据传输的可靠性。(可以在应用层实现UDP数据传输的可靠性)
  3. UDP效率比TCP高
    UDP在传输数据前不需要建立连接,没有繁琐的握手过程,没有复杂的拥塞控制算法和重传机制,所以UDP相对于TCP具有较高的效率。
  4. 每一条TCP连接只能是点到点,UDP支持一对一、一对多、多对多
  5. TCP对系统资源要求较多,UDP对系统资源要求较少
    TCP建立连接后,会为连接分配发送缓存和接受缓存,维护拥塞控制变量以及序号和确认号的参数,因此需要占用较多的系统资源。而UDP是无连接的,对系统资源要求较少

使用场景

TCP:对网络通讯质量有要求时,例如整个数据要准确无误的传递给对方

  • FTP:文件传输协议
  • SSH:安全登录
  • Telnet:不安全文本传送
  • SMTP:简单邮件传输协议
  • HTTP:超文本传输协议

UDP:对网络通讯质量要求不高时,要求网络通讯速度能尽量的快

  • 流媒体

    如果采用TCP,一旦发生丢包,TCP会将后续包缓存起来,等前面的包重传并接收到后再继续发送(重传的数据会占用窗口大小),延迟会越来越大

  • 实时游戏

    自定义重传策略能把丢包产生的延迟降到最低

  • 物联网

各自优缺点

TCP优点:可靠、稳定

TCP缺点:慢、效率低、占用系统资源高、易被攻击(SYN Flood攻击)

SYN 攻击指的是,攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送SYN包,服务器回复确认包,并等待客户的确认。由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,导致目标系统运行缓慢,严重者会引起网络堵塞甚至系统瘫痪

UDP优点:快、稍安全

UDP缺点:不可靠、不稳定

如何让UDP更可靠

在上层应用层模仿TCP的可靠性传输

  • 添加seq/ack机制,确保数据发送到对端
  • 添加超时重传机制

17. UDP为什么不可靠

不保证消息交付:不确认,不重传

不进行拥塞控制,不保证交付顺序

18. TCP重传

超时重传机制、快重传、带选择的快重传

19. TCP拥塞控制机制–拥塞窗口

慢启动

拥塞避免(?接下来)

快重传

快恢复

20. TCP流量控制机制–滑动窗口

连接的两端有两个缓冲区,通过发送窗口通告,告知对方自己的缓冲区还能存多少,从而限制发送的数据量

21. TCP的可靠传输机制–ARQ协议和滑动窗口协议

ARQ是指自动重传协议

22. TCP粘包

A分别发送两个数据data1、data2给B,这两个数据TCP会先存放到缓冲区里再发送;如果B先收到data1的部分数据,然后再收到data1剩余部分数据和data2数据,那么就算是一种粘包

解决:关闭nagle算法,不缓冲直接发送;封包/拆包,在每个数据包前后放一些有特征的数据

为什么UDP不会粘包:UDP是面向消息的协议,每个数据包都是一条消息,接收的时候只能接受独立的消息

Tags: 面试