Socket通讯原理
1、什么是Socket?
Socket,即套接字。就是两台主机之间逻辑连接的端点。(通俗来说:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket)。
Socket是一套用于不同主机之间通信的API,它工作在我们的TCP/IP协议栈之上,可应用于浏览器、手机应用或用于服务器管理的SSH客户端等。
要通过Socket与不同主机建立通信,我们只需要指定主机的IP地址和一个端口号。
-
IP地址用于唯一标志你的网络设备
-
端口主要用于区分主机上的不同应用(没有端口,操作系统没有办法区分数据到底应该发送到哪一个应用上)
通过Socket我们可以建立一条用于不同主机,不同应用之间的虚拟数据通道,并且它是点对点(应用对应用)的,可以将其比喻为将一条数据线连接在不同应用的插槽上,这也是socket这个名字的由来。
2、Socket的类型
常用的Socket的类型有两种:TCP和UDP
2.1 TCP-传输控制协议
特点1:TCP是可靠的,它的底层会自动检测并回传丢失的数据包,因此对于调用者来说,你发送的数据对方一定会接受到。
特点2:发送和接受到的数据顺序是完全一致的,比如你发送了一段字符,对方就一定会原封不动的收到同样的字符串,这也就是为什么说TCP是基于“数据流”的协议。
TCP要求收发数据的双方扮演不同的角色:服务器和客户端。
服务器会被动等待客户端的连接,它自己不会主动发起请求。
2.2 UDP-用户报文协议
UDP以报文(Datagram)为单位来收发数据,并且UDP不会自动回传丢失的数据包,因此不保证数据一定能被对方接受到。
正是因为缺少了这些检查,UDP通常具有更低的延迟并占用更少的系统资源,它也更适合于像视频语音通话这种实时性要求较高的应用。
3、在两端间传数据
通过Socket,我们可以将与某台机子建立连接,如果想要在两端间传份数据:
两端各执行socket()方法,得到fd句柄之后,对于服务端依次执行bind()、listen()、accept()方法,然后坐等客户端的连接请求执行connect()方法,向服务端发起建立连接的请求,连接建立完成后,客户端可以执行send()方法发送消息,服务端可以执行recv()接受消息。
反过来,服务器也可以执行send()发送消息,客户端执行recv()接受消息。
服务端是怎么区分多个客户端的?
客户端发来的数据包上会有源IP地址和端口,以及目的IP地址和端口,这四个元素构成一个四元组,可以用于唯一标记一个客户端。