前端面试: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年多多赚钱,守住发际线。💪

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容