1. 网络相关概念
1.1 套接口的概念
套接口,也叫“套接字”。是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的门户。网络通信,归根到底还是进程间的通信(不同计算机上的进程间通信)。在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是IP地址。两个进程通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程进行通信,因此套接口中还需要包括其他的信息,也就是端口号(PORT)。在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应关系。所以,使用端口号和网络地址的组合可以唯一的确定整个网络中的一个网络进程。
例如,如网络中某一台计算机的IP为123.207.251.21,操作系统分配给计算机中某一应用程序进程的端口号为1500,则此时 123.207.251.21:1500就构成了一个套接口。
1.2 端口号的概念
在网络技术中,端口大致有两种意思:
- 一是物理意义上的端口,如集线器、交换机、路由器等用于连接其他网络设备的接口;
- 二是指TCP/IP协议中的端口;
端口号的范围从0-65535,一类是由互联网指派名字和号码公司ICANN负责分配给一些常用的应用程序固定使用的“周知的端口”,其值一般为0~1024,例如http的端口号是80,ftp为21,ssh为22,telnet为23等;还有一类是用户自己定义的,通常是大于1024的整型值。
1.3 ip地址的表示
通常用户在表达IP地址时采用的是点分十进制表示的数值(或者是为冒号分开的十六进制Ipv6地址),而在通常使用的socket编程中使用的则是二进制值,这就需要将这两个数值进行转换。
ipv4地址:32bit, 4字节,相当于一个整型,通常采用点分十进制记法。
例如对于:10000000 00001011 00000011 00011111, 点分十进制表示为:128.11.3.31。
2. socket概念
Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。它是一种常用的进程之间通信机制,通过它不仅能实现本地机器上的进程之间的通信,而且通过网络能够在不同机器上的进程之间进行通信。
每一个socket都用一个半相关描述{协议、本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述{协议、本地地址、本地端口、远程地址、远程端口}来表示。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过socket来实现的。
2.1 socket类型
2.1.1 流式socket(SOCK_STREAM)
用于TCP通信,流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。
2.1.2 数据报socket(SOCK_DGRAM)
用于UDP通信,数据报套接字定义了一种无连接的服务