C#网络程序开发(第二版)
上QQ阅读APP看书,第一时间看更新

1.3 网络程序通信机制

1.3.1 端口与套接字

1. 端口

主机之间的通信,看起来只要知道了IP地址就可以实现。其实不然,真正完成通信功能的不是两台计算机,而是两台计算机上的进程。IP地址只能标识到某台主机,而不能标识计算机上的进程。如果要标识进程,完成通信,需要引入新的地址空间,这就是端口(port)。

端口目前有两种意义:一是指物理端口,比如ADSL Modem、集线器、交换机、路由器上连接其他设备的接口,如RJ-45端口、SC端口等;二是逻辑端口,即进程标识,如HTTP的80端口,FTP的21端口等。本书所指的端口都是指逻辑端口。定义端口是为了解决与多个应用进程同时进行通信的问题。端口地址由两字节的二进制数表示。端口号范围从0到65535。由于TCP/IP传输层的两个协议TCP和UDP是独立的两个软件模块,因此各自的端口号也互相独立。端口号的分配规则如下:

(1)端口0:不使用,或者作为特殊的使用。

(2)端口1~255:保留给特定的服务。

(3)端口256~1023:保留给其他服务。

(4)端口1024~49999:可以用作任意客户的端口。

(5)端口5000~65535:可以用作用户的服务器端口。

一个完整的网间通信需要两个进程组成,并且只能使用同一种高层协议,因此可以用一个5元组来标识:协议、本地地址、本地端口号、远地地址、远地端口号。

2. 套接字

套接字是支持TCP/IP网络通信的基本操作单元,是不同主机间的进程进行双向通信的端点,使用套接字便于区分不同应用程序进程间的网络通信和连接。如图1-4所示,有三台建立了通信连接的主机。对通信的一对主机来说,套接字包括发送方IP、发送方端口号、接收方IP、接收方端口号、协议五部分。

图1-4 套接字概况图

1.3.2 基于套接字的网络进程通信机制

网络进程与单机进程之间的不同是前者可以在网络上和其他主机中的进程互通信息。在同一台计算机中,两个进程之间通信,只需要两者知道系统为他们分配的进程号(Process ID)就可以实现通信。但是网络情况下,进程通信变得复杂得多。首先,要解决如何识别网络中的不同主机;其次,不同的主机上的系统独立运行,进程号的分配策略也不同。套接字屏蔽了TCP/IP协议栈的复杂性,使得在网络编程者看来,两个网络进程间的通信实质上就是它们各自所绑定的套接字之间的通信。这时,通信的网络进程间至少需要一对套接字,分别运行于服务端和客户端,根据连接启动方式及本地套接字连接目标,套接字之间的连接可分为服务监听,客户端请求,连接确认3个步骤。图1-5给出了TCP协议下的网络进程通信的步骤。

图1-5 使用套接字传输数据