网络通信(Socket/TCP/UDP)

一、Socket

1.概念:

Socket(又叫套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接协议,客户端的IP地址,客户端的端口,服务器的IP地址,服务器的端口。

一个Socket是一对IP地址和端口。

Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。你可以这么理解:Socket是进程之间用来对话的中间层工具。

2.作用:

应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口,区分不同应用程序进程间的网络通信和连接。Socket(套接字)是对 TCP/IP 或者UDP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。通过调用这个接口(API),程序员在开发网络应用程序的时候,就可以不用关心底层是怎么实现的,减轻开发的难度。

3.Socket的实现方式

Socket是一个中间层工具,它存在于操作系统的内核。电脑上的进程为了真正通过Socket来发送/接受数据,Socket必须和一个能够进行数据传送的接口连接起来,再通过这个接口送出数据。这个接口就是端口,而这个连接的过程就叫做绑定。应用层就可以和传输层通过套接字接口(API),区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

假设有两个主机要进行通信 Host A和Host B
 Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。

Socket连接的实现方式:

要通过互联网进行通信,至少需要一对套接字,一个运行于客户机端,称之为clientSocket,另一个运行于服务器端,称之为serverSocket。

基于TCP协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器可以向客户端主动推送消息。

先从服务器说起。服务器先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,要连接的目标是服务器的套接字,为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口,然后就向服务器套接字提出连接请求(connect),当服务器套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

 基于UDP协议(不可靠连接)是无连接模式通讯,占用资源少,响应速度快,延时低。至于可靠性,可通过应用层的控制来满足。

建立一个套接字(Socket)、绑定服务器端IP地址及端口--服务器端、通过SendTo()方法向指定主机发送消息(需提供主机IP地址及端口)、通过ReciveFrom()方法接收指定主机发送的消息(需提供主机IP地址及端口)。

4.Socket与TCP/IP的关系

 创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。

Socket是对TCP/IP协议的封装和应用(程序员层面上)。也可以说,TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:

“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如 果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。WEB使用HTTP协议做应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”

我们平时说的最多的Socket是什么呢,实际上Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等。网络有一段关于Socket和TCP/IP协议关系的说法比较容易理解:

“TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”

实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。Socket是对端口通信开发的工具,它要更底层一些。

5.Socket可以实现的网络应用

=>客户端-服务器通信:通过Socket,客户端可以与服务器建立连接并发送请求,服务器接收请求并返回响应。
=>网络聊天和即时通讯:通过Socket,可以在多个用户之间实现实时的文字、音频或视频通信。
=>文件传输:可以使用Socket在不同计算机之间传输文件,如上传和下载文件。
=>远程控制:可通过Socket在远程计算机上执行指令或操作。
=>P2P(点对点)通信:Socket提供了直接的点对点通信接口,允许两个或多个计算机直接进行数据交换。

使用Socket进行网络编程时,需要考虑协议、端口、IP地址、数据格式等因素,以确保通信的正确性和有效性。不同编程语言和平台都有相应的Socket API和库,可以根据自己的需求选择合适的工具和技术。

二、TCP/IP协议

1.概念:

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网络协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、