Socket常用面试题
socket通常称为”套接字”,用于描述IP地址和端口,是一种通信链的句柄。应用程序通过
套接字向网络发出请求和应答的网络请求
套接字之间的连接过程
- 服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
- 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
- 连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
三次握手
- 第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认。
- 第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
socket和http的区别
socket不属于协议范畴,而是一个调用接口(API),是对TCP/IP协议的封装。实现服务
器与客户端之间的物理连接,并进行数据传输。socket处于网络协议的传输层,主要有TCP
/UDP两种协议。
Socket
- socket连接是长连接,理论上客户端和服务器端一旦建立连接就不会主动断掉;
- 但是由于各种因素可能会断开,比如:服务器或客户端宕机、网络故障等,为了维持连接需要发送心跳消息。
- 数据可自定义,为字节级,数量小,可加密,数据安全性高,适合client/Server直接信息实时交互。
HTTP
- HTTP是基于TCP/IP协议的应用层协议,定义的是传输数据的内容规范。
- HTTP是基于请求/响应形式的短连接,即客户端向服务器发送一次请求,服务器响应后链接就会断掉
- HTTP是无状态协议,session/cookie来解决无状态
- HTTP传输速度慢,数据包大,数据传输安全性差。
应用场景
- socket一般用于比较即时的通信和实时性较高的情况,比如推送,聊天,保持心跳长连接等;
- http一般用于实时性要求不那么高的情况,比如信息反馈,图片上传,获取新闻信息等。
某些场合使用http不使用socket的原因是socket一旦连接上了,就一直保持连接,就会造成阻塞IO,与此相对的的,还有非阻塞IO。
阻塞IO是指客户端请求服务器端,服务器端进行处理后,返回值给客户端。
但当客户端太多、同时并发请求的时候,服务器端处理不过来,就会卡,因此提出了非阻塞IO,
客户端请求服务器端,服务器端有一些监听器负责接受请求,接受好了,就告诉客户端已经接受好了,处理完后把数据发给客户端。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ThinkBIM!
评论