所谓端口,是指计算机中为了标识在计算机中访问网络的不同程序而设的编号。每一个程序在访问网络时都会分配一个标识符,程序在访问网络或接受访问时,会用这个标识符表示这一网络数据属于这个程序。这里的端口并非网卡接线的端口,而是不同程序的逻辑编号,并不是实际存在的.
端口号是一个16位的无符号整数,对应的十进制取值范围是0~65535。不同编号范围的端口有不同的作用。低于256的端口是系统保留端口号,主要用于系统进程通信。例如网站的 WWW 服务使用的是80号端口,FTP服务使用的是21号端口。 不在这一范围的端口号是自由端口号,在编程时可以调用这些端口号。
Socket(套接字) 是网络编程的一种接口,它是一种特殊的 I/O。在TCP/IP协议中,"IP地址+TCP或UDP端口号”可以唯一标识网络通讯中的一个进程。可以简单地认为 :"IP地址+端口号”就称为socket。在TCP协议中,建立连接的两个进程各自有一个socket来标识,这两个 socket组成的socket对就唯一标识一个连接。用socket函数建立一个socket连接,此函数返回一个整型的socket描述符,随后进行数据传输。
通常,socket分为三种类型:流式socket、数据报socket和原始socket。
注意:一个完整的socket有一个本地唯一的socket号,由操作系统分配。最重要的是,socket是面向客户/服务器模型而设计的。
区分不同应用程序进程间的网络通信和连接,主要使用三个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。在编程时,就是使用这三个参数来构成一个 socket。这个 socket 相当于一个接口,可以进行不同计算机程序的信息传输。
在TCP/IP世界中,socket接口是访问Internet最广泛的方法。在网络中如果有一台地址是192. 168 .0.5的FTP服务器,在另一台主机上运行一个FTP服务软件,执行命令 ftp 192.168.0.5, 在这台主机上将打开一个socket,并将其绑定21端口,与其建立连接并对话。
因此,一个IP地址,一个通信端口,就能确定一个通信程序的位置。为此,开发人员专门设计了一个套接结构,就是把网络程序中所用到的网络地址和端口信息放在一个结构体中。
一般,套接口地址结构都以"sockaddr"开头。socket根据所使用的协议的不同,可分为TCP套接口和UDP套接口,有些参考书称为流式套接口和数据套接口。
注意:UDP是一个无连接协议,TCP是一个可靠的端对端协议。传输UDP数据包时,Linux不知道也不关心它们是否已经安全到达目的地! 而传输TCP数据包时,则应先建立连接,以保证传输的数据被正确接收。
在设计网络程序之前,应该了解两个重要的数据类型:sockaddr和sockaddr_in, 如图9. 2 所示。 这两个结构类型都是用来保存socket信息的,如1P地址、通信端口等,它们的具体说明如下所示:
sockaddr用来保存一个套接字,定义方法如下所示:
struct sockaddr { unsigned short int sa_family; char sa_data[14]; };
本文来源:《Linux程序设计》,金国庆等,浙江大学出版社
部分图引用自:《图解网络v3.0》,小林coding