套接字,一种独立于协议的网络编程的接口,对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口。在设计模式中,Socket属于门面模式,因为把TCP/IP协议族隐藏在Socket后面,对于用户来讲,这组接口就是全部了,具体的数据让Socket去组织就可以了。

应用程序就包含Socket和解析器即可,不需要针对每一层的协议进行处理,所有的工作都可以交给Socket完成,无需处理细节。应用程序和传输层之间的联系就是Socket。
Socket注意类型有:流套接字、数据报套接字、原始套接字。
Socket一般由五部分构成:协议,本地地址,外部地址,状态,PID。
有时候Socket中可以没有协议部分。

如上图中,每一行都是一个Socket。协议:TCP,本地地址:0.0.0.0:135,外部地址:0.0.0.0:0,状态:LISTENING,PID:1296。
Socket是和应用程序一起建立的。应用程序中包含Socket组件,应用程序启动时,会调用Socket申请创建Socket,然后协议栈就会根据申请创建Socket。
客户端Socket创建完毕后,客户端需要查询服务端的IP地址,并将IP地址告诉协议栈,解决数据要去哪里的问题。
服务端Socket创建完毕后,客户端需要告知服务端自己的IP和端口号,解决数据从哪里来的问题。

若是短连接,每次Socket发送接受后都要断开连接,常用于web网站。若是长连接就不需要多次建立连接,整个通信过程中只需要一次连接和关闭,常用于点对点通信。
TCP连接通过三次握手后,建立连接,可以开始发送数据。
当应用程序将要发送数据时,会调用write将将要发送的数据交给协议栈,协议栈将数据序列化,添加各种报头,然后让数据包放入缓冲区,根据各种策略和实际情况进行发送。发送数据有几个标准:
发送过程中通过请求-确认机制进行你来我往,当数据发送完成后,通过四次挥手断开连接。
断开连接后整个通信过程的工作还没有结束,客户端和服务端会等待一段时间后把Socket删除。