# 什么是socket？

* socket 可以看成是用户进程与内核网路协议栈的编程接口。
* socket不仅可以用于本机的进程间通信，还可以用于网络上不同主机的进程间通信。

## 详解

### **socket 可以看成是用户进程与内核网路协议栈的编程接口。**

### ![](https://313308022-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT30T9rtIVtc5eWQf%2F-LfnT9dAhhstiSPRKKVD%2F-LfnTGRQQCSvMKvanOnI%2Fsocket.jpg?generation=1558862971658797\&alt=media)

四层模型：应用层 传输层（TCP协议，UDP协议） 网络层 （IP协议） 数据链路层

TCP/IP的协议栈属于内核的一部分。应该层是用户实现的，属于用户进程的部分（也就是应用在用户空间）。

用户空间当中的程序要想访问内核，使用内核的服务，就需要使用一定的接口访问它，对于网络编程来说这个接口就把它称为套接口。

### **socket不仅可以用于本机的进程间通信，还可以用于网络上不同主机的进程间通信。**

![](https://313308022-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT30T9rtIVtc5eWQf%2F-LfnT9dAhhstiSPRKKVD%2F-LfnTGRSuZE4bk5jAPIE%2Fscoekt_abs.jpg?generation=1558862961177383\&alt=media)

应用程序 机器A 将数据传递给机器B它是通过socket来进行传输的，如过程图，屏蔽了 它底层的一些实际的数据传输方式，所以说我们可把套接口看成一种抽象，是一种网络中进程之间 进行数据传递的抽象，这个抽象使得我们不必关心底层的传输细节，也就是说底层的数据传输对我们来说 是透明，我们可以把它看成是空气，当它不存在。

对于上层的应用程序我们只需要关心套接口的存在， 从这个角度来看我们可以把套接口是一种**网络进程间**通信的手段，主机A上面的进程将数据传递给主机B的一个进程 ，通过套接口来进行数据传递，并且套接口是全双工的通信方式，跟管道（pipe）是不同的，也就是数据流也可以从B主机 到达A主机，这样一个过程也是可以的。

**这就是socket不仅可以用于本机的进程间通信，还可以用于网络上不同主机的进程间通信。**&#x20;

因为应用程序A和应用程序B,它可以宿主在不同的主机之上，而管道（pipe）只能在同一台主机间进行通信。

并且套接口还可以在异构系统间进行通信（A主机使用的机器架构体系结构可以和B主机不一样，比如A机器有可能是一个手机QQ，跟B主机上的一个PC qq进行通信，这是可以的，也就是说他们的硬件架构可以不同，软件架构可以不同 ：手机上面的操作系统和Pc机上的操作系统也可以是不同，这就是异构系统间通信的概念），。

所以说套接口我们可以把它看成是一种**网络进程间通信**的手段。

资料：[网络中进程之间如何通信](http://blog.csdn.net/abcd1f2/article/details/37758605)
