Skip to content

Socket

image.png

Socket 位于应用层和传输层之前的抽象层,是一组调用接口,TCP/IP网络的API函数。

实际上是对 TCP/IP协议的封装,只是为了更方便使用 TCP/IP 协议。

TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。 这个就像操作系统会提供标准的编程接口,比如win32编程接口一样。 TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。

Socket 通信流程

image.png

Socket按照四元组来标识不同客户端与服务端之间的连接。

四元组「源 IP、源端口、目的 IP、目的端口」

  • accept()

    服务端绑定端口之后,进入 accept(), accept()作用就是接受客户端请求,阻塞,直到有客户端请求进来。

对于客户端来说,出口就是 Socket。对于服务端来说,入口就是 Socket。Socket 并不负责具体的网络读写,只负责接受客户端请求,然后将客户端请求转发给实际处理的应用程序。

短连接

连接 → 传输数据 → 断开连接

传统 HTTP 是无状态的,建立连接后发送完数据就断开连接。

比如:请求不频繁间隔较久的场景可以使用短链接。因为维持长链接也是需要消耗资源的。

长连接

连接 → 传输数据 → 保持连接 → 传输数据 …… → 断开连接

长连接就是建立 Socket 之后,即使传输数据完成后也保持连接。

比如:数据库的连接一般用长连接。

网络编程的核心

  1. 建立连接
  2. 读取网络数据
  3. 写网络数据