tcp是可靠的数据传输协议,相对于udp来说,基于udp的通信速度更快,但是没有数据的完整性的保证,更重要的是udp不会保证数据是否到达了目的方。
TCP协议建立的tcp连接是有状态的,称之为tcp的有限状态机
SYN_SENT:主动建立连接的一方发起连接建立请求,也就是SYN=1,当发出同步位,状态转换位SYN_SENT
SYN_RCVD:服务器端收到了客户端发送的同步报文,按照tcp协议的规定,回复ACK报文同时SYN位至1,此时服务器的状态转换为SYN_RCVD
ESTABLISHED:当客户端收到服务器端发来的SYN确认报文,客户端就由此转入连接建立状态(established),并向服务器端回送确认报文
状态为ESTABLISHED,双方就可以发送数据进行通信了,但是TCP又有所谓的长连接和短连接,一般在应用程序没有启用keepalived的情况下,TCP连接建立之后发送一个数据请求得到结果后就断开连接,而长连接就是在一个数据请求之后并不立即断开,而等待应用程序定义的TIMEOUT等条件满足之后断开(或者收到了对方的FIN)
tcp建立连接的时候称w为三次握手,一般都是由客户端先向服务器端发起连接请求
tcp断开连接的时候称为四次挥手,在断开连接的时候有可能是客户端先发起的也有可能是服务器端先发起的
在这里选用如图,客户端先发起断开连接请求(但是双方都要发送FIN)
FIN_WAIT1:主动方发起断开连接请求等待对方确认,将自身的状态转入FIN-WAIT1
CLOSE-WAIT:被动方收到FIN报文,回复ACK,将状态转为CLOSE_WAIT
在tcp的连接中,在自己发出FIN位之后就不能再发送数据,但是可以读取,所以在被动方回复了主动放的FIN之后,只要自己还没有发送FIN位,就可以发送还没有发送完的数据
FIN_WAIT2:主动方接收到对方的ACK,将状态转入FIN_WAIT2
LAST_ACK:被动方发送FIN,将自身tcp连接状态转为LAST_ACK,意思就是等待最后一个确认报文之后就可以关闭连接
TIME_WAIT:主动方收到了被动方的FIN,将tcp连接状态转为TIME_WAIT,在这里主动方会等待2msl的时间之后转入closed
closed:被动方收到确认报文后,关闭连接
在linxu上,例如web服务的搭建维护调优过程中,我们就经常需要关注服务器的连接状况以最大化的发挥服务器的性能
netstat命令是在linux中最常用的显示网络子系统的命令,可以显示路由表,某个地址上建立的连接,tcp连接的状态等等
netstat
--route ,-r显示路由表
--groups 显示多播组相关信息
-t:显示tcp连接相关
-u:显示udp连接相关
-p:显示进程名称
-n:以数字方式替换显示端口等信息
-l:显示处于监听状态的
-a:显示全部监听和非监听状态的套接字信息
查看服务器上开启的监听服务:
netstat -tunlp(以数字形式显示哪些进程监听在tcp或者udp的某些端口)
统计80端口连接数
netstat -nat | grep -i "80" | wc -l
查看http并发连接请求及tcp状态
netstat -nat | grep -i "80"
查看已经建立的http连接数
netstat -nat | grep ".*80.*ESTABLISHED"
查看httpd的相关进程数
ps aux | grep httpd |wc -l或则是ps -ef | grep httpd | wc -l