前端面试:TCP/IP协议栈中的socket是干什么用的?

“小哥哥,怎么上来就问这么难的问题。”

“女施主,请控制一下你的情绪,明明是你的简历写了了解TCP/IP“


       作为一个前端到底该不该了解这个知识点呢?我觉得因人而异吧,如果今后的发展路线只想做终端类的(h5,app,WebGL),那么其实这一块儿并没有多重要。但是如果您是想要全栈发展的话,socket是一个太基础不过的知识了。

          ————————————————  废话分割线  ————————————————

       我们都是被面试千锤百炼过的了,建立http链接前要先通过三次握手建立tcp链接,已经被各种面试官问的明明白儿白儿的了。但是,如果在下此时问到,建立了TCP链接之后,两个网络中的进程要怎么通信?可能就刷下一大批背题的小机灵鬼儿了。

      回顾一下网络基础知识吧

       OSI七层参考模型相信各位都已经很熟悉了,今天我们只聊

            网络层      传输层      应用层

       网络层的代表 Internet Protocol,简称IP,一个能提供源计算机与目标计算机通信的神奇协议,简单说有了它,两台计算机就可以完成最基本的通信。

       传输层的代表 Transmission Control Protocol,TCP协议(此处不谈UDP),是一种面向连接的、可靠的、基于字节流的传输层通信协议。首先他面向连接,就要依赖网络层ip协议的支持了,其次它是可靠的,就要提到tcp的三次握手机制。

            客户端:老服,咱俩交个朋友吧,给你发了个明信片。【发送SYN报文,进入SYN_SEND状态】

            服务器:收到,我把明信片画个心寄回给你,再塞进一封我们的友谊证明。【返回报文SYN(SEQ=y)ACK(ACK=x+1),进入SYN_RECV状态】

            客户端:收到,我再把你这封友谊证明盖个戳寄回给你,我们此时就算建立革命友谊了【回应一个ACK(ACK=y+1)报文,进入Established状态】

        应用层的代表 Hypertext Transfer Protocol,简称HTTP协议,当前万维网基本上全靠它。大家都是从业人员,不需要我再多介绍了哈。

        我们尝试一下将ip地址想象成一个公司的主机电话,而port端口号是公司某个部门的分机号码。我们知道了这两个信息就可以准确的联系到公司内部门同事。

        但是这样通信只能局限于你一言我一语的打电话,如果某天我们需要发送传真,就需要制定一个新的规则(http),在这个规则里可能我发送010就代表一串文字,111就代表画了个月亮,而传真机(浏览器)能够识别这些编码,将它们在纸上画了出来。


        讲到这里,我们终于要提到socket了。

        严格的来说,socket并不是一种协议,只是一组接口api,能让程序员更方便的使用TCP/IP协议。简单地说我们可以使用socket套接字来建立起一种TCP/IP协议族中协议的链接关系。

                                                        ——高级装逼工程师Yubble

        说成这样可能就比较抽象了,让我们来看看socket的api具体具体是怎么实现的呢?

        让我们来看这样一张图

        首先我们看这个图能知道

            1,套接字肯定是一对儿,客户端和服务端都需要有一个。

            2,首先要有服务端的套接字,且他要完成bind、listen、accept阶段,客户端的socket才能通过connect方法来建立连接

            3,客户端与服务端的通信都是通过write和read方法来通信的,在已经建立了链接的状态下监听read方法,只要对方使用write方法发送消息,自己的read就可以监听到

            4,任何一方调用close方法,建立的链接通道就会关闭掉

        如果这位客爷看到这里还是太抽象,那就

        上干货!!!

        我们是前端银儿,自然用nodejs说话,首先写出服务端的socket:

服务器端

        其实node的net模块还是已经帮我们封装并简化了一些socket的复杂使用方法,一个listen()方法就包含了原生socket中bind()、listen()、accept()三种方法,正确的调用了listen就已经建立了一个等待建立通信的状态。接下来就是使用on.('connection')来监听是否有客户端连接到服务器,使用on.('data')来监听客户端像我发来了什么信息。

客户端

        客户端则更为简单,使用一个connect()方法连接到服务器。通过on('connect')监听来判断是否连接成功。如果连接成功的话,马上使用write()方法向服务器发送信息,然后通过on.('data')来监听是否有回信。

        终端中显示:        

        上面这就是一个简单到不能再简单的demo,我们是不是也可以通过这个demo有一些拓展性的想法。    

        我们可不可以用socket完成一个聊天室?让在家的宅男A与宅男B能在平台上约开黑。

        我们可不可以在socket的基础上完成吞吐封装,自己实现一个http服务器,自定义http头与体中信息的不同功能,类似(cookie, last-modify)等等。

            ————————————————  废话分割线  ————————————————

        看到现在我们这篇博文要讲的东西也已经全部讲完了,也能和各位爷台聊些家常了,其实技术的本质是什么呢?还是去解决问题对嘛~今年的春节少了点热闹的感觉,估计是疫情搞得大家都没法回家过年,没法互相串亲戚拜年,没法出去玩吧。我已经准备好在家大玩switch了,提前祝大家新年快乐,2021年多多赚钱,守住发际线。

你可能感兴趣的:(前端面试:TCP/IP协议栈中的socket是干什么用的?)