理解Socket

Socket的概念

什么是Socket?很多博客总结的不到位。这里做一个全面的解释。

基本原理的角度来看,Socket起源于Unix,Unix/Linux基本哲学之一就是“一切皆文件”,Socket是一种"打开—读/写—关闭"模式的实现,可以被认为是服务器和客户端各自维护的一种特殊文件,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

进程通信的角度来看,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。还可以认为,Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。


Socket通信流程

网络中不同主机的进程能够通信的基本前提是什么?

对于本地进程通讯,可以使用PID来唯一标示一个进程,但PID只在本地唯一,但网络中的两个进程PID冲突机率很大,这时候用一个三元组可以在全局唯一标志一个进程:

(协议,本地地址,本地端口号)

这样一个三元组,叫做一个半相关,它指定连接的每半部分。


顺便提一下半相关和全相关:

半相关:是一个三元组(协议,本地网络地址,端口号);在全局中唯一地标示一个进程;socket就是半相关描述;

全相关:是一个五元组(协议,本地网络地址,本地端口号,远端网络地址,远端端口号),在网际中唯一地标示一次通信。


有了这个基本前提,就可以实现进程间跨网络通信。

前面提到过,Socket本质上可以被理解为"打开—读/写—关闭"模式的实现,Socket提供的函数接口对应于这些操作。

关于每个函数具体的解析就不介绍了,这里只看Server端和Client端调用函数实现通信的过程。

从TCP连接的视角看Socket通信流程,如下图所示:

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章