前言
上一节我们说到了域名对用户记忆的优点,但是IP对于路由器的优点,所以需要有DNS服务器提供域名与IP地址的转换,还说到了在前端开发中dns-prefetch域名预解析的好处。
本小节呢,我们会说一些不常用的知识点,如协议栈,套接字,TCP,UDP等,还会形象的描述一下三次握手,我相信狗哥对于三次握手的描述一定会让你印象加深的。
目录
前言
1. 认识协议栈
2. 认识套接字
3. 喜欢摸鱼的服务器?
4. http通信的三次握手确认连接
小节
1. 认识协议栈
与浏览器不同,浏览器输入url,发送http请求,我们都可以看到,甚至http请求的url,头信息,参数,cookie我们都可以看见,通过DNS域名解析,再将http消息发送给操作系统,紧接着就走到了我们看不见的协议栈。
协议栈上半部分分为TCP和UDP两个内容,TCP协议呢,主要负责像浏览器访问web服务器这种链路较长的收发数据工作;而UDP协议呢,负责DNS域名查询这种链路较短内容较少的收发数据工作。
协议栈的下半部分是IP协议控制网络包收发的操作部分。在互联网上传输数据,就像我们访问web服务器,整个过程的传输数据,会被切割成一个一个的网络包。我们常说丢包啦,就是丢失的这个协议栈环节的数据包。而将网络包给目标通信对象,比如服务器发送的操作,就是由IP来负责。
再然后是网卡驱动程序,由驱动程序来控制网卡,其实说了这么多,我们做软件开发,不得不说,人家硬件开发很强,最终网卡完成驱动,负责实际的接受和发送信号。什么信号?http消息数据,再到截断成一个个的网络包,再到这里成了网线中的电信号,就是这个过程。
2. 认识套接字
人类创造概念,或者说很多东西其实并不存在,而是我们不断的认知提升,将一些东西描述出来,赋予他概念。就比如说套接字,这就是一个概念。
协议栈内部有一块内存空间,用于存放我们传输数据的内存空间,比如ip地址,端口号,通信过程中的请求头,参数,cookie等,这些杂乱的东西,需要传输,但是太乱了,比如我们要发快递,为了便于发送传输呢,就需要打包,而这些个信息组合起来,存起来,我们叫他套接字。那么你说套接字这个东西真实存在不?是实体的还是虚拟的?
但套接字还不止包含这些信息,他还包含行为动作,比如我们给web服务器发送的信息可能丢包了,可能发出去没返回来,需要等待,这些事件都需要协议栈知道。而套接字呢,就要记录这些信息,是否收到web服务器的影响啦,我已经发送数据多长时间啦,协议栈是否需要重新发送一次请求等,这些套接字都需要记录,然后告诉协议栈。既然我们知道了套接字在协议栈中具有重要的意义,那么发送http请求的这个过程中,就得创建套接字,才能有套接字的这些工作内容。
3. 喜欢摸鱼的服务器?
从浏览器输入url到页面加载,必然要通过网线,对吧。既然要回答这个问题,这个最为重要的环节,你是否要说?或者说,面试官再问你这个问题,你就给他一根网线,然后啥也不说的看着他,看他是否能够秒懂,哈哈。
而我们浏览器所在的本地机器,和web服务端所在的服务器之间中间可能不远万里,怎么可能是一根网线呢,我们随便发送一个文字给服务端,这中间可能经历了N条网线,电缆,路由器,但不过多么复杂,这一组数据是包装在一起的,所以就要形成一个连接管道,而这个管道就是这么不远万里形成的一个通信管道。所以你也不要觉得通信怎么怎么加密了,怎么怎么安全了,这中间管道这么长,谁知道中间哪里就管道漏气了。
正常来说,服务端不同于我们客户端,或者是浏览器端,服务端会一直等待着我们给他发送请求,哪怕是websocket这种长链接,也是需要客户端先发送一次通知,或者我们去触碰他一下,告诉服务端我们要和你交互了,服务端才被激活,而这之前一直都是处于休眠状态,或者是半睡半醒状态,用现在的话说就是摸鱼状态。以后再有人说前端简单,你就说服务端一直处于摸鱼状态,我们前端不驱动他,他根本就啥也不干。
4. http通信的三次握手确认连接
我们上面说,浏览器需要发送http消息,然后就开始委托操作系统了,操作系统里的协议栈开始起作用了,那么就要创建套接字。而光创建套接字的时候呢,协议栈也不知道要给谁发送请求,更不知道携带哪些信息。所以协议栈通过浏览器那里获取到了套接字所需要的数据内容,这样,客户端这边的机器就算准备好了。而服务端创建套接字的过程和客户端是一样的,光创建一下,或者平时我们不给他发消息的时候,他那个套接字也不知道用来要干啥,给谁发送东西,发送什么。
所以就需要客户端先向服务端发送一次消息,我站起来大喊服务端:老哥,醒醒,别睡了,我是前端的经海路大白狗,我想和你交互联调,我的IP是xx.xxx.xx.xx,我的端口是3000,然后我就回工位了。
这个时候服务端的套接字收到消息,将状态改为“正在连接”,服务器的协议栈开始做出响应,在通信过程中,双方都要确认我给你的信息你是否收到,现在是服务端确认收到了客户端的套接字发来的信息,那么服务端就得再给客户端发送一次请求,问客户端是否收到了服务端的请求。
服务端老哥又从工位上站起来,大声告诉我:狗哥,我们接下来这个接口要这样联调,你做好准备了吗,点按钮吧,我等着呢?
然后我再告诉服务端老哥:我要点按钮了啊。这样来回三次,确认双方都得到了确认,有来有回了,就可以开始通信了。
可能有人会问,为啥是三次握手,咋不多问几次?通过上面的形象的描述可知,赶紧干活儿联调吧,再多问几次就要下班了;而少问一次双方就不能得到互相确认这个环节。
小节
其实对于我们软件开发人员来说,再细节一点,我们面试回答“从浏览器输入url到页面加载”这道题,一般人也就是回答一下浏览器解析url,DNS域名解析,握手,挥手等,有没有必要回答,甚至有没有必要知道像协议栈,网卡,套接字这些知识点吗?其实日常开发是用不到的,甚至干10年开发也用不到,但日常用不到的东西,我们是否有必要对自己进行知识扩展去略微的学习一下呢?或者说面试的时候,有没有必要扩展说这些东西呢?那么我告诉你,日常开发翻来覆去,就是那点东西,而且真正需要比拼,真正需要你卷的时候,需要你拿着狙击枪决胜千里之外的东西,可能并非我们每天接触的这些日常的东西,你知不知道我在说什么?
关注狗哥,查看狗哥“动态”,有京东2023年实习内推职位哦,加油,祝2023届毕业生大展宏图!!!