什么是Socket
在计算机中Socket被翻译为“套接字”,是计算机之间进行通信的一种约定或方式
通过这种约定,一台计算机可以向其他计算机接收和发送数据
不同系统下的Socket
UNIX/Linux
Socket返回的是一个文件描述符(File Descriptor)
UNIX/Linux 中的一切都是文件,网络连接也是一个文件
有了文件描述符就可以使用普通的文件操作函数来传输数据了,也就是说建立网络连接之后剩下的就是普通文件操作,不区分socket和文件
Windows
Socket返回的是一个文件句柄(File handle)
但是会区分socket和文件,Windows会把socket当作一个网络连接,需要调用专门针对socket设计的数据传输函数,针对普通文件的输入输出函数就无效了
套接字的类型
套接字类型有很多,其中DARPA Internet(Internet套接字)是最常用的
根据数据的传输方式,将Internet套接字分成流格式套接字(SOCK_STREAM)和数据报格式套接字(SOCK_DGRAM)
因此,当我们通过socket()函数创建连接时,必须在里面说明使用哪种数据传输方式
流格式套接字(SOCK_STREAM)
流格式套接字是一种可靠的、双向的通信数据流,数据在运输中如果损坏丢失了,可以重新发送,其有自己的纠错机制
有以下几个特征:
- 数据在传输过程中不会消失
- 数据是按照顺序传输的
- 数据的发送和接收不是同步的(不存在数据边界)
由于其采用的是TCP协议(The Transmission Control Protocol,传输控制协议),就保证了数据按照顺序到达并且没有错误
流格式套接字内部有一个字符数组缓冲区,通过socket传输的数据会被保存到这个缓冲区,接收端在收到数据后并不一定立即读取,只要数据不超过缓冲区的容量,接收端有可能在缓冲区被填满以后一次性读取,也有可能分成好几次进行读取。即发送和接收的节奏不一定是一致的,接收端只需要根据自己的要求读取
补充:
TCP/IP协议:TCP 用来确保数据的正确性,IP(Internet Protocol,网络协议)用来控制数据如何从源头到达目的地,也就是常说的“路由”。
数据报格式套接字(SOCK_DGRAM)
数据报格式套接字也叫做“无连接的套接字”,是一种不可靠的、不按顺序传递的、以追求速度为目的的套接字
这种套接字模式只管传输数据不作数据校验,从而传输效率比流格式高,同时如果数据在传输中丢失错误了是没办法重传补救的
有以下特征:
- 强调快速传输而非传输顺序
- 传输的数据可能丢失也可能损毁
- 限制每次传输的数据大小
- 数据的发送和接收时同步的(存在数据边界)
数据报套接字使用的是 UDP 协议(User Datagram Protocol,用户数据报协议),也使用IP协议作路由