常见的计算机网络面试题

三次握手
  • 第一次握手:客户端向服务器发送一个 SYN=1 报文,并指定客户端的初始化序列号 seq=x。此时客户端处于SYN_Sent 状态

  • 第二次握手:服务器接收到客户端的 SYN=1 报文后,同意连接的话,会发出一段确定报文。确定报文中应该ACK= 1,SYN= 1,确认号是ack=x+1,同时也要为自己初始化一个序列号seq=y.此时服务器处于 SYN-RCVD

  • 第三次握手:客户端接收到 SYN 报文之后,还会向服务器发送确定。确定报文的 ACK=1,ack=y+1 ,自己的序列号变成 x+1。TCP 连接建立,客户端处于 已连接状态 。

  • 当服务器接受到客户端的确认后也进入了 已连接状态 。此时双方就可以开始通信了

 

为什么需要三次握手,而不用两次
  • 为了防止失效的请求又传送到主机上,因而产生错误。

  • 如果客户端发送的第一次连接请求并没有丢失,只是在网络节点滞留比较久。客户端久久没有收到确认报文,以为服务器没有收到。此时重新发送这条报文,服务端和客户端经过两次握手完成连接。但是此时,之前滞留的连接请求到达了服务端时,服务端会再向客户端发送确认报文,然后客户端会再和服务端建立连接,造成不必要的错误和资源浪费。

  • 如果使用三次握手的话,就算是那一次失效的报文传送过来了,服务端收到这条失效报文并且回复确认报文,但是客户端不会再次发出确认。然后服务端收不到确认,就知道客户端并没有请求连接。

 

四次挥手:例:客户端先发起的关闭请求
  • 第一次挥手:客户端向服务端发送一个FIN报文,报文中指定一个序列号。此时,客户端处于 FIN_WAIT-1状态

  • 第二次挥手:服务端收到客户端 发送的 FIN报文后,会将客户端的序列号+1 作为ACK报文的序列号值发送给客户端,表明收到了客户端的报文。然后服务器就会处于 CLOSE-WAIT-1状态

  • 第三次挥手:服务端向客户端发送 FIN报文,且指定一个序列号。此时,服务端处于 LAST_ACK状态

  • 第四次挥手:客户端收到服务端发送的FIN报文后,会将服务端的序列号+1 作为ACK报文的序列号值发送给服务端,此时客户端处于 TIME_WAIT 状态。需要等服务端确定收到自己的ACK报文后才会进入 CLOSED 状态

  • 服务端接收到 ACK报文后,就关闭连接,处于 CLOSED 状态。

 

TCP 和 UDP 的区别:
  • TCP是面向连接的传输层协议,UDP是无连接的传输层协议

  • TCP 是可靠传输,UDN是不可靠传输

  • TCP 传输数据是有序的,而UDP不保证数据的有序性

  • TCP不保存数据边界,UDP 会保存数据边界

  • TCP传输速度比UDP慢

  • TCP有流量控制和拥塞控制,UDP没有

  • TCP是重量级协议,首部较长,有二十个字节,UDP是轻量级协议,首部较短,只有八个字节

 

HTTP 哪些常用的状态码及使用场景
  • 1xx:表示目前是协议的中间状态,还需要后续请求

  • 2xx:表示请求成功

  • 3xx:表示重定向状态,需要重新请求

  • 4xx:表示请求报文错误

  • 5xx:服务器端错误

  • 常用状态码:

    • 101 切换请求协议,从 HTTP 切换到 WebSocket

    • 200 请求成功,有响应体

    • 301 永久重定向:会缓存

    • 302 临时重定向:不会缓存

    • 304 协商缓存命中

    • 403 服务器禁止访问

    • 404 资源未找到

    • 400 请求错误

    • 500 服务器端错误

    • 503 服务器繁忙

 

拆包和粘包:
  • 假设客户端向服务端发送两个数据包 A ,B

  • 正常情况下,服务端会受到两个数据包,即没有发生拆分和粘包

  • 第二种情况,服务端只会收到一个数据包,但是这个数据包中含有两个数据包的信息,这种情况就是因为接收端不知道这两个数据包的界限而产生的粘包。对于接收端来说很难处理

  • 第三种情况,服务端收到了两个或者三个数据包的时候,有可能其中一个数据包分成了两个数据包,有可能是A中信息一部分到了B中信息,B中信息一部分到了A中信息。这种情况就是发生了拆包和粘包,对接收端来说同样是不好处理的

  • 拆包和粘包解决方案

    • 发送端为每个数据包添加包首部,首部中至少要包含数据包长度,这样接收端在接收到数据后,通过数据包长度就可以知道每个数据包的实际长度。

    • 发送端将每个数据封装成固定长度(不够的就添0),这样接收端每次都读取固定长度的数据,自然而然的就会将每个数据包拆分出来

    • 还可以在数据包之间设置边界,如添加特殊字符,这样接收端就可以通过这个边界把不同的数据包拆分出来了。

输入url到显示的全过程
  • 浏览器接收到url

  • 浏览器会先查看缓存,如果有缓存且没有过期的话直接提供给客户端

  • 否则浏览器就会通过DNS解析url ,获得协议名、主机名、端口号

  • 然后浏览器就会根据这个IP跟对应的服务端建立tcp连接

  • 接下来就是浏览器向服务器发送HTTP请求

  • 服务器接受并解析这个请求然后发送一个数据包给浏览器

  • 浏览器就会根据这个数据包解析HTML文档,构建DOM树,构建CSSOM树,解析js脚本,下载资源

  • 最终就会显示出这个页面

 

DNS解析过程
  • 输入域名时,操作系统会先检查自己本地host文件中是否有这个网址的映射关系,如果有,就调用这个IP地址映射,完成域名解析。

  • 如果host没有这个域名的映射,则查找本地的DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。

  • 如果本地解析器缓存没有的话,则查找本地DNS服务器,如果要查询的域名包含在本地配置资源中,则完成域名解析。

  • 如果本地DNS服务器没有的话,就会请求根服务器,根服务器就会返回一个负责该区域的主服务器IP

  • 本地域名服务器根据主服务器IP,链接到这个主域名服务器,如果有这个域名的话,就调用这个IP地址映射,完成域名解析。如果没有的话,则递归请求下一级域名服务器,直到找到对应的域名

 

 

get 和 post 请求的区别
  • get 参数通过url 传递,post 放在 body中

  • get 传递参数有限制,post没有 (http协议规定,url在请求头中,所以大小有限制)

  • get 在浏览器回退时是无害的,而post会再次提交请求

  • get 请求会被浏览器主动 cache , 而 post 不会

  • get 比 post 更不安全, 因为参数直接暴露在url中,所以不能用来传递重要信息

  • get 只接受 ASCII,post 没有限制

  • get 产生一个 TCP数据包,post会产生两个 TCP数据包。对于 get 来说,浏览器会将 http 的 header 和 data 一起发送出去 服务器响应成功。 对于 post ,浏览器会先发送 header ,服务器响应继续,浏览器再发送 data ,服务器响应成功

 

HTTPS 和 HTTP 的区别
  • HTTPS 协议需要 到CA 申请证书 ,一般需要交费

  • HTTP 协议运行在 TCP 上,所有传输内容都是明文。 HTTPS 运行在 SSL/TLS 之上,SSL/TLS运行在 TCP 上,所有传输内容都是经过加密的。

  • HTTP 和 HTTPS 使用的完全不同的连接方式,用的端口也不一样,前者用 80 后者用 443

  • HTTPS 能有效防止运营商劫持, 解决了一个防劫持的大问题。

 

 

http1.1 和 http2.0 的区别
  • 多路复用:http2.0可以在一个 tcp/ip连接上并发的发送多个http 请求,不必等上一个http请求返回请求报文。http1.1要达到并发的话需要启用多个tcp/ip连接,会产生额外的性能开销。

  • 头部压缩:http报文分为三部分,状态行、头部 、主体。http1.1 只会对主体进行压缩,不会压缩头部。http2.0 会使用hpack 算法对header 进行压缩。

  • 服务器推送:http1.1浏览器在解析html 的时候会再次发送请求,请求css、js资源。http2.0浏览器在第一次请求html的时候就会检查html引用的资源,如果被引用的资源也在这台服务器上,服务器就会自动将被引用的资源推送给浏览器

  • 二进制传输:http1.1 使用的是文本协议,http2.0 使用的二进制协议,会更加高效,而且错误更少

 

 

posted @ 2022-05-14 22:26  小宝想学好前端  阅读(342)  评论(0编辑  收藏  举报