为什么"面试官"都喜欢问浏览器客户端输入URL会发生什么事情?

大家好,我是梦兽编程。

梦兽编程是非常讨论八股文。但是出于无奈也没办法,市场就是这样。技术探讨本来是经验的分享,而在我国的情况变成了9年义务教育的死板"教科书"。

很多时候我们会被资本家压榨到无法思考,还那有空了解那些面试题的实际知识点?如果你刷到本片文章,那么所有的面试题背后的知识点将有梦兽编归纳总结放到那些被问烂的前端面试题栏目中进行更新迭代。从问题的出现与考点进行解答。

期待你的收藏我的个人网站。

加入梦兽编程交流群一起学习梦兽编程交流群

浏览器客户端输入URL会发生什么事情

相信在面试的过程中,有50%的人都会被问到这个问题。也有很多会被问懵圈。这个问题其实问应该是问服务端开发的同学比较合适,因为它为后面的tcp协议还有网络编程做出了伏笔。

为什么前端也会问这个问题?

其实这个问题实际没啥意义。因为大多数前端开发就算你不懂这些,你一样是可以进行浏览器客户端开发的,而实际的域名那些都是服务端dns云商家已经帮你实现了。

这道题摆出来问题你,这不过是区分你的是不是科班出身,有没有计算机科学的知识。大家都知道我们计算机的市场已经被培训机构输出了很多"人才"。但是很多培训机构都是培训3-4个月,在这么短的时间里面要把计算机理论给非科班的同学进行脑补,那就不太可能的。

毕竟韭菜是需要快速割才行的,要不怎么培训机构怎么实现财富自由?

所以这道题在前端面试里面实际只是用来区分你是不是科班出身。如果你拥有websocket开发经验最好是要了解tcp的三次握手和4次

一图辅助记忆

file

域名的由来

相信2023年每人每户都拥有wifi识别了吧,当我们连接上wifi后,如果你的电脑想与你的手机进行连接的时候。通常电脑都会向前你索要一个ip地址。也就说电子设备与电子设备进行交流是需要通过ip地址"自我介绍"的。

打个比方:

电脑: hi,192.168.31.155 ,我是192.168.31.156 手机: 哦192.168.31.156 今天你还好吗? 电脑: 还不错我很好,你呢? 192.168.31.156

计算机的这种交流方式会不会对于人类来讲非常抽象?在现实生活中我们往往是通过一种标识记住一样东西-比如名字。

计算机本身没有什么意义,意义在于它背后的名字带了的价值。就算域名那天不指向久的服务器,被新人王代替了,没有人会知道这个计算机新人王(除非你你做做芯片开发^_^)

域名相当于计算机的名字,让人类更好的记住他。

就好比我们打工人一样,成就了是公司与老板,我们默默无闻的被压榨。

所以在浏览器输入网URL地址之后,将会往DNS域名服务器搜索出对应的服务器电脑进行以上的对话。在人类世界中就是我们常说的打电话

计算机的发展类似上个世纪的打电话演变过来。

找到服务器后要做什么事情?

我们知道对方的电话号码后就需要进行拨打电话的尝试打通这个电话,在计算机世界中也是差不多需要通信那就必须要打通这个电话,也就是建立连接。

为什么TCP协议需要三次握手和4次挥手?

通常我们打电话的过程中,都会遇到这么几种情况。

  • 我打通电话,对方没有接通,通讯无效
  • 我打通电话等了很久(有点不耐烦),这个时候对方接通了。我刚好挂了通讯无效。这种概率很少但也不是不可能出现,这样就解释了为什么TCP为什么不能握手两次。
  • 我打通电话,对方刚好接听了,通讯成功。

在TCP协议中也是同理的,在建立通讯的过程中先发起三次确认只不过是为了提高通讯的有效性。 大致流程如下:

服务端网络通讯开发的被问就这么回答就好了。

简单点理解就是打电话的流程,需要双方发送ack码确保通讯是有效,只不过第一次是发送信息方尝试连接不需要携带ack确认信息。和你打电话一样,你也不知道对方是否在线,你只是尝试拨打电话。

4次挥手?

file

回顾一下上图中符号的意思:

bash 复制代码
FIN :连接终止位
seq:发送的第一个字节的序号
ACK:确认报文段
ack:确认号。希望收到的下一个数据的第一个字节的序号

刚开始双方都处于ESTABLISHED 状态,假设是客户端先发起关闭请求。四次挥手的过程如下:

1)第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端处于 FIN_WAIT1 状态,等待服务端的确认。

scss 复制代码
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

2)第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

objectivec 复制代码
CLOSE-WAIT - 等待从本地用户发来的连接中断请求;

此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,等待服务端发出的连接释放报文段。

scss 复制代码
FIN-WAIT-2 - 从远程TCP等待连接中断请求;

3)第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态,等待客户端的确认。

sql 复制代码
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;

4)第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己 ACK 报文的序号值(seq=u+1),此时客户端处于 TIME_WAIT (时间等待)状态。

css 复制代码
TIME-WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认;

由于 TCP 的半关闭(half-close)特性,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

通俗的来说,两次挥手就可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次挥手。

举个例子:A 和 B 打电话,通话即将结束后,A 说 "我没啥要说的了",B 回答 "我知道了",于是 A 向 B 的连接释放了。但是 B 可能还会有要说的话,于是 B 可能又巴拉巴拉说了一通,最后 B 说"我说完了",A 回答"知道了",于是 B 向 A 的连接释放了,这样整个通话就结束了。

省流回答:双方各自发送一次ack两次挥手就可以释放一端和另一段tcp的连接,完全释放一共四次挥手

题目的伏笔:

能回答到这里几乎就已经确认你是一个计算机专业的学术学者,以这道题为基础。如果我是面试官后面的问题就很容易问了。

这个需要按你的工作经验进行准备:

如果你是网络协议开发相关的

如果是tcp协议或者网络协议开发工作比较多的,那你最好准备一下tcp传输中的那些头部信息,那些内存块是做什么的。每个内存地址做什么等。

如果你是web服务的开发

如果是做web服务器开发的从事者接下来会问的内容大致是与http协议相关的。

如果是浏览器开发者

如果是从事浏览器客户端开发接下来会问的问题估计会是css或者http协议比较多。

大家按需进行准备。

本文使用 markdown.com.cn 排版

相关推荐
凌辰揽月7 分钟前
AJAX 学习
java·前端·javascript·学习·ajax·okhttp
然我2 小时前
防抖与节流:如何让频繁触发的函数 “慢下来”?
前端·javascript·html
鱼樱前端2 小时前
2025前端人一文看懂 Broadcast Channel API 通信指南
前端·vue.js
烛阴2 小时前
非空断言完全指南:解锁TypeScript/JavaScript的安全导航黑科技
前端·javascript
鱼樱前端2 小时前
2025前端人一文看懂 window.postMessage 通信
前端·vue.js
快乐点吧3 小时前
【前端】异步任务风控验证与轮询机制技术方案(通用笔记版)
前端·笔记
pe7er3 小时前
nuxtjs+git submodule的微前端有没有搞头
前端·设计模式·前端框架
七月的冰红茶3 小时前
【threejs】第一人称视角之八叉树碰撞检测
前端·threejs
爱掉发的小李3 小时前
前端开发中的输出问题
开发语言·前端·javascript
Dolphin_海豚4 小时前
一文理清 node.js 模块查找策略
javascript·后端·前端工程化