原理

网络之间的通信,说穿了还是网络流在通信。
客户端跟服务器之间建立的管道,就叫scoket。

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。
套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。
网络套接字是IP地址与端口的组合。

网络通信的三要素

  1. IP
  2. 端口
  3. 协议

网络编程也需要输入流和输出流进行交互,交互步骤:

  1. 使用ServerSocket 指定端口,地址为本机。
  2. 使用accept 接收客户端连接。
  3. 发送数据(流)。

注意:1024以下端口保留给系统。

TCP/UDP

  1. TCP:像打电话,双向的,建产连接的。数据安全,不易丢失。点对点。
  2. UDP:像发知信,单向的,非面向连接。数据不安全,易丢失。

scoket 的由来

Socket 最初是加利福尼亚大学Berkeley分校为Unix系统开发的网络通信接口。
后来随着TCP/IP网络的发展,Socket成为最为通用的应用程序接口,也是在Internet上进行应用开发最为通用的API。

Windows系统流行起来之后,由 Microsoft 联合了其他几家公司在 Berkeley Sockets 的基础之上进行了扩充(主要是增加了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制),共同制定了一套Windows下的网络编程接口,即Windows Sockets规范。
Windows Sockets规范是一套开放的、支持多种协议的Windows下的网络编程接口,包括1.1版和2.0版两个版本。其中1.1版只支持TCP/IP协议,而2.0版可以支持多协议,2.0版有良好的向后兼容性。当前Windows下的Internet软件绝大部分都是基于Windows Socks开发的。

socket 运行在传输层

传输层实现端到端的通信,因此,每一个传输层连接有两个端点。
那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。
传输层连接的端点叫做套接字(socket)。

端到端的通信

根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。

套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。
每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。
套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。

因此,两个应用程序之间的数据传输要通过套接字来完成。
在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现。在Windows环境下,网络应用程序编程接口称作Windows Socket。为了支持用户开发面向应用的通信程序,大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)。