作者:V7
博客:https://www.jvmstack.cn
一碗鸡汤
少年辛苦终身事,莫向光阴惰寸功。 —— 杜荀鹤
Socket概述
在计算机中产生和接受IO流的数据源是多种多样的,在网络编程中,有一个特殊的数据源就是socket。通俗点socket类似于日常生活中的电源插座,链接电源插座接收的是电流,在网络编程中,连接socket接收的就是数据流或者IO流
那么我们怎么理解socket在网络编程中扮演的角色呢?我们可以从几个不同的层次来理解。
从高一点的层次或者概括性的层次来说,可以认为socket是所有网络通信的一个端点,如下图所示:
上图中服务器端和客户端基于IP和端口进行通信的一个端点我们就把它称为一个socket。
在Unix中socket是什么?
在Linux环境下,用于表示进程x间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是文件主要应用于本地持久化数据的读写,而套接字多应用于网络进程间数据的传递。
在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。
TCP套接字编程
典型的网络应用是由一对程序(客户端程序和服务器端程序)组成的,它们位于两个不同的端系统中。开发人员在创建一个网络应用时,其实就是在编写客户端和服务端的程序代码。当运行这两个程序时,就是创建了一个客户端程序进程和服务端程序进程,同时它们通过从套接字读出和写入数据进行彼此通信。
网络应用程序有两类。一类是实现在协议标准(如一个RFC或某种其他标准文档)中所定义的操作;这样的应用程序又称为“开放”的。
另一种网络应用程序时专用的网络应用程序。这种情况下的客户和服务器程序应用的应用层协议没有公开发布在某RFC中或其他地方。
UDP套接字编程
运行在不同机器上的进程彼此通过套接字发送报文来进行通信。每个进程好比是一座房子,该进程的套接字则好比是一扇门。应用程序位于房子中门的一侧;运输层位于该门朝外的另一侧。应用程序开发者在套接字的应用层一侧可以控制所有东西;然而它几乎无法控制运输层一侧。
下图主要显示了客户和服务器的主要与套接字相关的活动,两者通过UDP运输服务进行通信。
了解实时技术文章,关注编程之艺术
一起学习、进步。