一场socket引起的面试总结

223 阅读8分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第39天,点击查看活动详情

眼看又到年底,有的小伙伴开始暗戳戳的关注起招聘网站,一年的努力也好,一年的辛苦也罢,不少小伙伴有了换工作的想法,所以分享一些面试的案例和趣事吧。

起因

一个小伙伴,小A,工作大概一年,后端开发,因为跨专业入行,起步进入的公司比较小,呆了一年,决定往大平台努力努力,所以,开始面试,一轮视频会议面试,面试官是hr(据说是因为技术面试官比较忙,先让人事面试),小伙子精神面貌没有问题,积极向上,hr小姐姐对他的评价不错,结果在二轮面试因为socket的问题折戟沉沙,之后一起聊天,谈起,所以有了今天总结。

socket面试思路

socket套接字,使用传输数据过程当中的接受和发送的端口,直观的理解,类似大家家里的网线插口,负责接受和发送网络信息,所以了解socket基本上要了解两部分内容:

1、协议

在网络传输过程当中,为了保证传输质量和效率,需要遵循一定的传输原则和约定,那么这就有了传输协议和OSI参考模型,所以如果你想真正的了解socket,那么基本的TCP,UDP协议就需要掌握了解了,最起基本的面试题,比如:

(1)TCP和UDP的区别

这个问题其实不是很难,而且答案比较固定,一般在回答TCP和UDP区别之前,建议先对TCP和UDP进行简单的介绍,

TCP: 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

UDP:用户数据报协议(UDP,User Datagram Protocol),是一种无需建立连接就可以发送封装的 IP 数据包的协议。

然后再进行区别,至于区别当然是二者的不同和优劣,当然如果能聊聊使用场景那么会更好:

TCP: 是面向连接的, 面向字节流的可靠传输,通过将字节流封装成包进行传输,拥有端到端的校验规则,是一种可靠,安全的传输协议,当然传输的成本也比较高,因为为了实现校验,需要对传输的数据添加首部,通常用在对传输质量要求比较高的地方,比如:文件传输,打字聊天这些场景。

UDP:是无连接的,直接发送发送封装的 IP 数据包,所以相较TCP协议,UDP协议的丢包率更高,更加不可靠,当然由于直接传输,免去了校验和首部,所以传输的成本会比较低,经常用在传输数据量大,对质量要求不高的业务场景当中中,比如视频,音频聊天。

当然基于这个问题还可以延伸出:对TCP首部的了解一些更深入的问题,所以在回答的时候要做好考虑,嘿嘿嘿。

(2)OSI参考模型分别是啥

这个问题其实是一个很简单的面试题,但是对非计算机专业培训出来的小伙伴还是有一定的杀伤力的,因为大家没有学习过网络的知识,没啥技巧,带入一次网络传输,比如访问网站,然后去记就可以了:

物理层:

主要功能是直接在物理传输介质上发送和接收数据位,为数据链路层提供物理连接,比如双绞线,电缆,光纤(是不是很通信)

数据链路层:

主要功能是负责信息从一个结点到另一人结点的物理传输,检测在物理层上传输可能发生的错误并进行纠错,同时处理网络拓扑结构和流量控制等问题。常见协议有: VLAN,WIFI(有没有很熟悉)

网络层:

负责数据从一个结点到另一个结点的传输,并根据地址(IP/IPX地址),为信息在网络中传输是选择最佳路径。常见协议有: IP,ipv6

传输层:

主要功能负责数据传输时端到端的完整性,即在网络上建立发送主机和目的主机之间的逻辑连接,从而隐藏了上一层提供数据传输时任何网络独立信息。常见协议有:TCP,UDP,TLS

会话层:

负责维护两个节点之间的传输联接,常见协议有:LDAP(做访问控制很好用)

表示层:

在应用过程之间传送的信息提供表示方法的服务,一般负责语法转换,语法选择,链接管理。常见协议有:LPP

应用层:

OSI模型中的最高层,是直接面向用户的一层,代码写的功能一般就在这一层,常见的协议有:SMTP 、FTP 、HTTP这些。

(4)TCP的三次握手和四次挥手

三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。

第1次握手:客户端发送一个带有SYN(synchronize)标志的数据包给服务端;

第2次握手:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了;

第3次握手:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束。

其中:SYN标志位数置1,表示建立TCP连接;ACK标志表示验证字段。

image.png

四次挥手:即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。

第1次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态;

第2次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态;

第3次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态;

第4次挥手:客户端收到FIN后,客户端t进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。

其中:FIN标志位数置1,表示断开TCP连接。

image.png

2、通信

socket进行数据传输,所以开发一个好的socket功能,会涉及到好多通信相关的问题,比如:什么是单工通信,半双工通信,全双工通信。

了解这个之前先要了解通信的一个概念,信道,就是抽象出来用来描述通信信息传输的通道,单条信道可以实现从a端到b端的信息传输,也可以实现从b端到a端的信息传输,但是不可以同时进行a到b和b到a端的信息传输,大家可以参照水管来理解信道。

单工通信信道是单向信道,发送端和接收端的身份是固定的,所以发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息,数据信号仅从一端传送到另一端,即信息流是单方向的。常见的通信设备:寻呼机(BB机)。

双向交替通信又称为半双工通信,即通信的双方都可以发送信息,但不能双方同时发送(当然也就不能同时接收)。这种通信方式是一方发送另一方接收,过一段时间后再反过来。常见的通信设备:对讲机。

全双工通信又称为双向同时通信,即通信的双方可以同时发送和接收信息的信息交互方式。全双工以太网使用两条电缆线,而不是像半双工方式那样使用一对电缆线。全双工方式在发送设备的发送方和接收设备的接收方之间采取点到点的连接,这意味着在全双工的传送方式下,可以得到更高的数据传输速度。常见的通信设备:手机。

总结

当然还有很多关于socket议的面试题,比如粘包,消息队列,阻塞,由于篇幅原因之后单独讲解吧,这里只是聊聊我个人觉得最常见的问题,欢迎各位大佬多多指点讨论。