面试题之计网

一.HTTP篇

1.HTTP与HTTPS

  • 概念:
    http:超文本传输协议,用于从服务器传输超文本到本地浏览器的传输协议明文 端口:80
    https:http+ssl 加密 端口:443
  • 对比
    • https不足
      1.证书问题–》费用高
      3.缓存不如http高效

      2.https证书有了解过吗

      由CA颁布
      分3个级别:域名型,企业型,增强型
      又根据保护域名的数量分为:单域名版,多域名版,通配版(*.abc.com)

3.可以讲一讲tcp/ip的3次握手,4次挥手吗?为什么是3次,不是2次 4次?

3次握手简单来说就是客户端向服务端发请求,服务端响应并与客户端建立连接,客户端确认
详细过程种有信号量

  • 为什么不是2次 4次?
    • 三次次才可以阻止历史重复连接
      如果旧连接先发SYN到了服务器端,服务端就会发SYN+ACK给客户端,客服端会根据自己的上下文判断这是一个历史连接,发RST给服务端,中止这一次连接。
      如果是2次握手,就不能进行这个判断
    • 三次才可以同步双方的初始化序列号
      一来一回确保双方的初始化序列号被可靠的同步
    • 三次可以避免资源的浪费
      如果客户端的SYN阻塞了,重复发送多次的SYN报文,那么服务器在收到请求后就会建立多个冗余的无效链接,造成不必要的资源浪费
    • 三次就可以建立可靠连接,故不需要更多的通信次数
  • 四次挥手
    • 为什么握手要3次,挥手要多一次
      因为第二次握手将SYN和ACK都一次性传给客户端。而挥手的时候,是先传ACK给客户端,表示应答,再等数据发送完,不再发送数据时,再穿FIN给客户端表示同意现在关闭连接。

      4.说到了TCP,那可以再一下TCP与UDP的区别吗?

      UDP更简
  • 连接
    • TCP是面向连接的传输层协议,传输数据前先建立连接
    • UDP是不需要连接,即刻传数据
  • 服务对象
    • TCP是一对一的
    • UDP支持一对一,一对多,多对多
  • 可靠性
    • TCP可靠,常用于FTP文件传输
    • UDP不可靠,但是可以即刻发送数据,常用于DNS,SNMP
  • 流量控制
    • TCP有流量控制机制,保证数据传输的正确性
    • UDP没有,即使拥堵,也不会降速处理,导致丢包
  • 首部开销
    • TCP首部长,UDP首部只有8个字节并且固定不变,故开销小

5.TCP是怎么建立可靠连接的

[1] 确认和重传机制

建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础
传输过程中,如果Checksum校验失败、丢包或延时,发送端重传
[2] 数据排序

TCP有专门的序列号SN字段,可提供数据re-order
[3] 流量控制

窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量
[4] 拥塞控制

TCP的拥塞控制由4个核心算法组成。

“慢启动”(Slow Start)

“拥塞避免”(Congestion avoidance)

“快速重传 ”(Fast Retransmit)

“快速恢复”(Fast Recovery)

以上就是TCP比UDP传输更可靠的原因。

6.为什么HTTP的缓存比较高效,可以说一下它的缓存机制吗?

  • 强缓存与协商缓存

    • 请求流程
      已存在缓存数据时,仅基于强制缓存,请求数据的流程如下

      已存在缓存数据时,仅基于协商制缓存,请求数据的流程如下

    • 标识
      强缓存:
      expires服务器到期的时间,是http1.0的东西。到期的时间由服务端生成,但是客户端的时间可能跟服务端时间有误差,会导致缓存命中的误差,所以到了HTTP1.1使用cache-control替代
      cache-control指定max-age
      协商缓存:

      • last-modified/if-modified-since
        last-modified:资源最后修改的时间
        if-modified-since:上次请求时返回的资源最后修改时间
        如果 last-modified > if-modified-since 资源被动过 200
        如果 last-modified <= if-modified-since资源没被动过 304

      • Etag / If-None-Match
        Etag:第一次请求时,返回的资源唯一标识
        If-None-Match:再次请求时,上次返回的资源标识
        不同,资源被动了,返回200
        相同,资源无修改,返回304

    • 对比
      对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行协商缓存策略。
      对于协商缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。

7.网络的分层结构了解过吗?

  • osi七层
    物理层(比特),数据链路层(帧),网络层(数据报),传输层(分段),会话层,表示层,应用层
  • 对应tcp/ip四层
    网络接口层(对应:物理层,数据链路层),ip层,传输层,应用层(对应:会话层,表示层,应用层)
    • tcp/ip每一层的作用
      应用层:向用户提供应用服务时通信的活动,如FTP,DNS
      传输层:对应用层提供处于网络连接中的两台计算机之间的数据传输,这层有TCP和UDP协议
      ip层:规定通过怎样的路径来传输数据包,有ip协议
      网络接口层:处于网络的硬件部分
  • 帧与数据报的区别
    • 概念上
      帧是数据链路层的协议数据单元,包括3部分:帧头,数据部分,帧尾。有mac地址
      数据报是网络传输的数据基本单位,包含一个报头和数据本身。报头描述数据的目的地以及和其他数据之间的关系。可以理解为传输数据的分组。

8.HTTP各个版本清楚吗?

因为HTTP是无状态的,所以服务器没有记忆能力,在进行关联性操作的时候非常麻烦,比如购物,每一步都需要验证身份信息,为了解决这个问题——> cookie技术

HTTP是明文传输,方便了阅读,但是不安全——> HTTPS

  • HTTP/1.1
    相比于1.0的每发一个请求都要新建一次TCP连接,1.1采用了持久连接的通信方式(只要任意一端没有明确提出断开连接,则保持 TCP 连接状态)

    因为采用了持久连接,这就使得管道网络传输成为可能,即在同一个TCP连接里,客户端可以一次发多个请求,不用等前一个回来再发第二个,减少整体的响应时间

    可是客户端将请求发送了之后,服务器那边依然是一个个处理的,所以已经发了但没有处理的请求就会队头阻塞,好比塞车

  • HTTP/2
    HTTP/2是基于HTTPS的,安全有保障
    相比于HTTP/1.1存在的队头阻塞问题,HTTP/2会进行压缩头部的处理并且数据包不是按顺序发,客户端可以指定数据流的优先级

    HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式。因为计算机只懂二进制,那么收到报文后,无需再将明文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率

    HTTP/2还在一定程度上改善了传统的工作模式[请求-应答],服务器可以主动向客户端发送消息.比如:在浏览器刚请求 HTML 的时候,就提前把可能会用到的 JS、CSS 文件等静态资源主动发给客户端,减少延时的等待,也就是服务器推送

    可是当多个HTTP请求在复用一个TCP连接,下层的TCP协议不知道有多少个HTTP请求.所以一旦发生丢包,就会触发TCP的重传机制,这样在一个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来

  • HTTP/3
    1.1的队头阻塞和2的发生丢包,阻塞所有请求都是在TCP传输层的问题.3把HTTP的下层协议改成了UDP

    虽然UDP是不可靠传输,但是基于UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输.QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2的多路复用的协议。

    QUIC 是新协议,对于很多网络设备,根本不知道什么是 QUIC,只会当做 UDP,这样会出现新的问题。所以 HTTP/3 现在普及的进度非常的缓慢,不知道未来 UDP 是否能够逆袭 TCP

9.Http常见字段有哪些

  • Host:用来指定服务器的域名

  • Content-Length:表示本次回应的数据长度

  • Connection:客户端要求服务器使用TCP持久连接
    HTTP/1.1 版本的默认连接都是持久连接,但为了兼容老版本需要指定Connection: keep-alive

  • Content-Type:告诉客户端,本次数据是什么格式
    Content-Type: text/html; charset=utf-8
    客户端在请求的时候,可以使用Accept字段表明自己可以接受哪些数据格式
    Accept: */*

    • Content-Type常见字段:

      • application/json:消息主体是序列化后的 JSON 字符串
        这里要注意的是 我在使用webapi,前台使用$.ajax的时候
        假如我要传递的数据为 var obj = {“name”:”zhangsan”,”age”:20}.
        这个时候我使用ajax传递 后台无论如何都接收不到数据
        直到后来我才发现这里声明了发送到后台的是josn字符串 所以data属性应该为JSON.strify(obj); 具体字符串方法名忘了 但是跟这个长得很像

      • application/x-www-form-urlencoded:数据被编码为名称/值对。
        这是标准的编码格式 这个其实是form表单默认的post请求时发送的数据格式。也就是form表单post请求,你不设置entype属性,它自动会使用这个。

      • multipart/form-data: 需要在表单中进行文件上传时,就需要使用该格式。
        常见的媒体格式是上传文件之时使用的 这个常用于文件上传 我用得最多就是图片上传的时候。

  • Content-Encoding:表示服务器返回的数据使用了什么压缩格式
    Content-Encoding: gzip
    客户端在请求的时候,用Accept-Encoding 字段说明自己可以接受哪些压缩方法

10.HTTP的状态码

  • 1xx:提示信息

  • 2xx:成功,报文已经收到并被正确处理
    200:ok
    204:与200基本相同,但是响应头没有body数据
    206:表示响应返回的body数据并不是资源的全部

  • 3xx:重定向
    301:永久重定向,请求的资源已经不存在,需要用新的url来访问
    302:临时重定向,请求的资源还在,暂时要用另一个url
    301和302都在响应头中使用location,指明后续要跳转的url,浏览器会自动重定向
    304:不具有跳转的含义,表示资源未修改

  • 4xx:报文有误
    400:报文有误
    403:服务器禁止访问资源,并不是客户端的请求出错
    404:资源不存在或未找到

  • 5xx:服务器处理时内部发生了错误
    500:与400类似,是个笼统的错误码,服务器发生了什么错误,我们并不知道
    501:即将开业,敬请期待
    502:服务器自身正常,访问后端服务器发生了错误
    503:网络服务正忙,请稍后重试

11.浏览器输入 url 的过程

1.输入地址到DNS服务器进行查询,获取ip和域名
2.服务器与浏览器建立会话,进行TCP连接
3.服务器将资源发给浏览器,浏览器下载解析,渲染页面

12.DNS查询工作过程

域名的层级关系类似一个树状结构:
- 根 DNS 服务器
- 顶级域 DNS 服务器(com)
- 权威 DNS 服务器(server.com)

1.客户端首先会发出一个 DNS 请求,问www.server.com的 IP 是啥,并发给本地 DNS 服务器

2.本地域名服务器收到客户端的请求后,如果缓存里的表格能找到www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。

3.根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”

4.本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我www.server.com 的 IP 地址吗?”

5.顶级域名服务器说:“我给你负责www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。

6.本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。

7.权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。

8.本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。

12. 跨域

同源

协议相同
域名相同
端口相同

之所以需要跨域,是因为浏览器同源策略的约束

同源策略拦截的是跨源请求,原因:CORS缺少 Access-Control-Allow-Origin头

JSONP:ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

JSONP的缺点

JSON只支持get,因为script标签只能使用get请求;
JSONP需要后端配合返回指定格式的数据。

CORS(跨域资源共享)
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
- 整个CORS通信过程,都是浏览器自动完成
- 一旦发现AJAX请求跨源,就会自动添加一些附加的头信息
- 实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。。

http篇参考:
TCP三次握手四次挥手
HTTP常见面试题
一个数据包在网络中的心路历程

二.IP篇

三.TCP篇

四.ping命令篇