TCP服务器的设计
大多数TCP服务器是并发的,当一个新的连接请求到达服务器,服务器接受这个请求,并调用一个新的进程来处理这个新的客户请求。不同的操作系统使用不同的技术来调用新的服务器进程。在Unix系统下常用fork函数来创建新的进程,如果系统支持也可以用轻型进程,即线程。
1)TCP服务器端口号
首先使用netstat命令来观察端口状态
例如 Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.21.168.157:60352 10.21.3.63:4999 ESTABLISHED
tcp 0 0 10.21.168.157:33689 10.21.3.66:6379 ESTABLISHED
tcp6 0 0 :::6379 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::11169 :::* LISTEN
其中:::* 星号通常称为通配符,这表示传入的连接请求SYN将被任何一个本地接口所接受。如果该主机是多接口主机我们可以制定其中一个IP地址为本地IP地址,并且只接受来自这个端口的连接。 远程地址显示:::* 表示还不知道远端IP地址和端口号,因为该端还处于LISTEN状态。处于LISTEN状态的服务器进程仍然存在。这个服务器进程用于接收其他连接请求,当传入的连接请求到达并被接受时,系统内核的TCP模块就创建一个处于ESTABLISHED状态进程。只有处于LISTEN状态的进程能够接受新的连接请求,不能接受数据报文段,处于ESTABLISHED的进程不能接受SYN报文段。
2)限定的本地IP地址
如果为一个程序指定一个IP地址或主机名并作为他的服务器,那么该IP地址就成为处于LISTEN服务器的本地IP地址。例如,10.21.168.157:60352
3)限定的远端IP地址
本地地址 远端地址 描述
localIP.lport foreifnIP.fport 限制到一个客户进程
localIP.lport *.* 限制为到达一个本地接口:Local IP的连接
*.lport *.* 接受发往LPort的所有连接
第一行将最先尝试,最后一个最不常用
4)呼入连接请求队列
一个并发服务器调用一个新的进程来处理每个客户请求,因此处于被动连接请求的服务器应该始终准备下一个呼入连接请求,但仍可能出现当服务器在创建一个新的进程时或操作系统正忙于处理优先级更高的进程,到达多个连接请求。用到了呼入连接请求队列。
UDP服务器的设计
大多数UDP服务器是交互服务器,也就是说,单个服务器进程对单个UDP端口上的所有客户请求进行处理。
1)客户IP地址及端口号
2)目的IP地址
3)UDP输入队列
4)限制本地IP地址
5)限制远端IP地址