Socket
Socket 位于应用层和传输层之前的抽象层,是一组调用接口,TCP/IP网络的API函数。
实际上是对 TCP/IP协议的封装,只是为了更方便使用 TCP/IP 协议。
TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。 这个就像操作系统会提供标准的编程接口,比如win32编程接口一样。 TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。
Socket 通信流程
Socket按照四元组来标识不同客户端与服务端之间的连接。
四元组「源 IP、源端口、目的 IP、目的端口」
accept()
服务端绑定端口之后,进入
accept()
,accept()
作用就是接受客户端请求,阻塞,直到有客户端请求进来。
对于客户端来说,出口就是 Socket。对于服务端来说,入口就是 Socket。Socket 并不负责具体的网络读写,只负责接受客户端请求,然后将客户端请求转发给实际处理的应用程序。
短连接
连接 → 传输数据 → 断开连接
传统 HTTP 是无状态的,建立连接后发送完数据就断开连接。
比如:请求不频繁间隔较久的场景可以使用短链接。因为维持长链接也是需要消耗资源的。
长连接
连接 → 传输数据 → 保持连接 → 传输数据 …… → 断开连接
长连接就是建立 Socket 之后,即使传输数据完成后也保持连接。
比如:数据库的连接一般用长连接。
网络编程的核心
- 建立连接
- 读取网络数据
- 写网络数据