一台拥有 IP 地址的主机可以提供许多服务,比如 Web服务、FTP服务、SMTP服务等等,这些服务完全可以通过 1 个 IP 地址来实现,那么,主机是怎样区分不同的网络服务呢?显然不能只靠 IP 地址,因为 IP 地址与网络服务的关系是一对多的关系。实际上是通过" IP 地址 + 端口号 " 来区分不同的服务的。
TCP 端口 和 UDP 端口。由于 TCP 和 UDP 两个协议是独立的,因此各自的端口号也相互独立,比如 TCP 有 235 端口,UDP 也可以有 235 端口,两者并不冲突。
(1)TCP 端口
TCP 端口,即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括 FTP 服务的 21 端口,Telnet 服务的 23 端口,SMTP 服务的 25 端口,以及 HTTP 服务的 80 端口等等。
(2)UDP 端口
UDP 端口,即用户数据包协议端口,无需在客户端和服务器之间建立连接,安全性得不到保障。常见的有 DNS 服务的 53 端口,SNMP(简单网络管理协议)服务的 161 端口,QQ 使用的 8000 和 400
0-65535
a.服务器使用的端口号
· 预留端口号
取值范围 0-1023,这些端口我们编程的时候不能使用,是那些 vip 应用程序使用的,只有超级用户特权的应用才允许被分配一个预留端口号
· 登记端口号
取值范围 1024-49151,就是我们平时编写服务器使用的端口号范围
b.客户端使用的端口号
取值范围 49152-65535,这部分是客户端进程运行时动态选择的范围,又叫临时端口号 就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接
netstat -ano
如何查看端口被占用?
netstat -ano | findstr “80”
TCP状态转移要点
TCP 协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接断开否则大量僵死的连接会浪费许多服务器资源。在众多 TCP 状态中,最值得注意的状态有两个:CLOSE_WAIT 和 TIME_WAIT
1.LISTENING 状态
FTP 服务启动后首先处于侦听(LISTENING)状态
2.ESTABLISHED 状态
ESTABLISHED 的意思是建立连接。表示两台机器正在通信。
3.CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成 CLOSE_WAIT此时我方要调用 close() 来使得连接正确关闭
4.TIME_WAIT
我方主动调用 close() 断开连接,收到对方确认后状态变为 TIME_WAIT 。TCP 协议规定 TIME_WAIT 状态会一直持续 2MSL(即两倍的分段最大生成期),以此来确保旧的连接状态不会对新连接产生印象。处于 TIME_WAIT 状态的连接占用资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少 TIME_WAIT 状态造成的资源浪费。