突击面试:计算机网络

平时工作很多概念性的东西用不到,长时间不用吧,容易忘,但面试又确实是要问,只能复习面试的时候整理下来,也是再学习一遍。

真希望能找到一份,能把学习到的诸多理论知识变成实践的工作,而不是业务复杂,但技术不复杂的工作,嗨,加油吧。

浏览器输入URL按回车后,到底发生了什么

经典经典经典的面试题,最常拿来问的,并且说我觉得最有必要掌握的,拿来放在第一个说

简单的说就是:

先解析URL看是不是合法,
解析完了去URL对应的DNS,
到DNS查到对应域名解析的ip了,再去那个ip的服务器建立连接
建立了连接,就发请求
发了请求,等着接服务器的响应
接到了响应,把页面渲染出来

1. 浏览器解析URL

看URL是否合法–>URL转码–>安全检查/访问限制–>要不要使用https–>有没有缓存页面缓存–>找DNS
一直到这,可以说工作流程都还没离开浏览器呢

2. 找DNS

浏览器缓存–>操作系统缓存–>路由器缓存–>ISP(首选DNS服务器,比如8.8.8.8之类的)缓存–>根域名服务器查

3. TCP连接

简单的说就四层:

  1. 应用层——>原本的http数据
  2. 传输层——>原本的http数据+TCP首部
  3. 网络层——>原本的http数据+TCP首部+IP首部
  4. 链路层——>原本的http数据+TCP首部+IP首部+以太网首部

3.1 应用层

应用层简单的说就是要传的数据,什么http啊,smtp啊,dns啊之类的要传的数据笼统的说都是应用层。

就好比发快递,这就是你要发的东西。

3.2 传输层

传输层通过三次握手建立了TCP连接(三次握手四次挥手,见后面)

为了方便传输,比如你原本请求的内容巨大无比,比如好几兆,总要切割一下吧(切割成了报文段),切割成比如16k的小段分次发。那对方接到这么多碎片,怎么知道顺序呢,怎么知道这是完整的一个数据内容呢,所以传输层要在应用层的基础上,加一层TCP首部,每个报文段里面给报文标了编号确保接收端接受到以后能按顺序给拼接起来,并确保了完整性。

就好比发快递,你一个包裹装不下,那得拆成两个包裹发,并且这俩包裹都得注明是你发的,发了几个快递,要不然对方接的时候又不知道接没接全

3.3 网络层

在传输层,把应用层切割好了以后,网络层又在传输层切割好的报文上面又加了一层IP地址

就好比发快递,你快递打好包裹了,那总要知道发给谁吧,所以要填写收货人的地址打成快递单子,贴在快递箱子上

3.4 链路层

两台主机传输数据,都是在一段一段的链路层,链路层将从网络层接受到的报文组装成帧,在相邻的节点上的链路传送。如果链路中的某一段发现接收到的帧有差错(比如报文不完整),可以直接丢弃这个帧,省的让错误的帧在链路上继续走下去

就好比发快递,好多个快递装车上路了,这个物流就是链路层,如果发现快递有问题,就直接丢了

4. 处理请求

这一步,请求已经到目标服务器了,然后经过目标服务器自己处理一下业务逻辑,返回一个响应,这个响应呢,再从响应方的应用层–>传输层–>网络层–>链路层,到请求发起方,也就是我们的浏览器

5. 接受响应

浏览器接收响应,比如看状态码是不是200啊之类的

6. 渲染页面

在浏览器渲染出来,没了

TCP三次握手和四次挥手

明确目的:

三次握手是为了确保双方都能正常接受数据并发送数据

四次挥手说为了让双方都停止发送数据并通知对方

三次握手

就好比打电话:

  1. A:喂,你能听到么?(第一次握手:发SYN包)
  2. B:嗯,我能听到,你能听到么?(第二次握手:回SYN包+ACK包)
  3. A:我能听到(第三次握手:回ACK包)

回SYN包和回ACK包的目的是:确保接受到的和自己发出去的一致,说明对方确实接受到了

四次挥手

就好比打电话:

  1. A:喂,我准备挂电话了啊(第一次挥手:发FIN)
  2. B:嗯,好,我知道你要挂了,但我这边话还没说完(第二次挥手:回ACK,ACK的序号为FIN的序号+1)
  3. B:balabala,好了,我说完了,我这边也要挂了啊(第三次挥手:发FIN)
  4. A:嗯,好,我这边也知道你要挂了,那溜了,拜拜(第四次挥手:回ACK,ACK的序号为FIN的序号+1)

TCP和UDP的区别

  1. TCP需要建立连接,UDP不需要(也导致了TCP可以知道对方收到了数据,而UDP不知道)
  2. TCP传输相对可靠,UDP想保证传输可达性可以多倍发包,比如加速器就是这么做的,还有比如某些翻墙的协议
  3. TCP传输的是字节流,UDP传输的是数据报文段
  4. 性能上,TCP比UDP慢,开销也更大
  5. 要求数据可靠的,比如传文件,传邮件,用TCP/要求速度快的,用UDP,比如打游戏

Comments

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.