- 最近面腾讯,问了Socket原语和通信原理的问题,没有答好,因此参考资料总结一下。
1. 什么是Socket
- Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
2. Socket原语
- 面试官:socket原语有哪些呢?说一下各自的作用?
- 在socket中,一共有八个原语:
SOCKET 服务原语:用于建立发方通信端点,返回一个整数用作为socket标识。 BIND 服务原语:用于给新建立的通信端点赋予一个地址。 CONNECT 服务原语:在面向连接的TCP服务中用于在本地端点和远地端点间建立一条连接,在无连接的UDP服务中是把对方地址存储下来。 LISTEN 服务原语:服务器为请求连接的客户分配请求连接队列空间,并指定队列长度(一般为5)。 ACCEPT 服务原语:由服务器执行,等待连接请求的到来,请求到达后,服务器创建一个新连接端点,并将该端点的标识符返给请求端,接着产生一个进程为该连接服务,然后再去等待新的连接。 SEND 服务原语:进行发送数据。 RECV 服务原语:进行接收数据。 CLOSE 服务原语:用于释放连接,双方都使用CLOSE原语后,连接即释放。
3. Socket通信原理
- 面试官:Socket通信原理说一下呢?就是客户端和服务器端一次交互的整个过程详细说一下?
- 服务器端先创建初始化Socket,然后与端口绑定bind,对端口进行监听listen,调用accept阻塞,等待客户端连接。
- 客户端创建初始化一个Socket,然后连接服务器connect,如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接close,一次交互结束。
4. 消息接收
- 面试官:客户端发送消息给服务器端,服务器端是立刻接收到还是说等一会儿才收到呢?
- 啊?这是什么问题,当时就傻了,回答的立刻接收到,因为已经建立好连接。但是后来想一想这是考察的IO多路复用的问题,即epoll、select函数这些东西,然后要说到消息来了触发什么机制通知来了消息,然后进行对应的读写。
- IO多路复用的select和epoll函数不就是把socket的fd加进去然后函数阻塞或者回调返回吗。即应该做如下回答。
答 :以epoll为例,首先接收方应该创建一个epoll函数,然后将要监视的socket加入进去并挂载到epoll的监视红黑树上,并且节点设置回调函数,如果有数据到了socket缓冲区,那会将此节点的回调放到就绪链表中然后进行后续操作,这里有涉及到epoll的触发有两种模式,如下: epoll事件有两种模型,边沿触发:edge-triggered (ET), 水平触发:level-triggered (LT) 水平触发(level-triggered) socket接收缓冲区不为空,有数据可读,读事件一直触发; socket发送缓冲区不满,可以继续写入数据,写事件一直触发; 边沿触发(edge-triggered) socket的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件; socket的发送缓冲区状态变化时触发写事件,即满的缓冲区刚空出空间时触发读事件; 边沿触发仅触发一次(即缓冲区中从没有数据到有数据才触发,一直有或一直没有都不触发),水平触发会一直触发(只要缓冲区有数据就会一直触发)。
参考
Socket通信原理
|