先来一个类比:
两个人打电话
①任何用户在通话之前,首先要占有一部电话机,相当于申请一个 Socket 号;同时要知
道对方的电话号码,相当于对方有一个 Socket。
②然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址) 。
③对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求), 拿起电话话筒,双方就可以正式通话,相当于连接成功。
④双方通话的过程,是向电话机发出信号和从电话机接受信号的过程,相当于向 Socket 发送数据和从 Socket 接受数据。
⑤通话结束后,一方挂起电话机,相当于关闭 Socket,撤消连接。
专业一点:
socket —— 电话机
|
|
通信连接的端点
在Unix/Linux中,一切皆文件。那对于这两个操作系统而言,“端点”就是一个特殊的文件,也就是说Socket实际上就是文件。
既然Socket是文件,那就可以用 open ——write/read——close 的操作文件流程。
socket与TCP\UDP
socket 类比为电话座机,所以他是一个东西,它运用了TCP\UDP协议。
对于一个Socket而言,它至少需要3个参数来指定:
1)通信的目的地址;
2)使用的传输层协议(如TCP、UDP);
3)使用的端口号。
所以根据使用的协议不同,socket有以下分类:
1)SOCK_STREAM:流式套接字,提供面向连接、可靠的数据传输服务,数据按字节流、按顺序收发,保证在传输过程中无丢失、无冗余。TCP协议支持该套接字。
2)SOCK_DGRAM:数据报套接字,提供面向无连接的服务,数据收发无序,不能保证数据的准确到达。UDP协议支持该套接字。
3)SOCK_RAW:原始套接字。允许对低于传输层的协议或物理网络直接访问,例如可以接收和发送ICMP报文。常用于检测新的协议。
具体为啥TCP是流式,UDP是数据报式,参见上一篇文章。