客户端TCP状态:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器TCP状态:
CLOSED->LISTEN->SYN_RECV->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
![](https://img.haomeiwen.com/i4618795/06d0953f64ee679a.png)
常用命令:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
一.tcp 三次握手
1.报文
SYN(synchronous):是TCP/IP建立连接时使用的握手信号。
在客户机和服务器之间建立正常的TCP网络连接时,客户机首先会向服务器发出一个SYN消息。
ACK (Acknowledgement)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。
2.状态
①SYN_SENT:表示请求连接,当你要访问其它的计算机的服务时首先要发个SYN信号给该端口,此时客户端状态为SYN_SENT,如果连接成功了就变为ESTABLISHED。
SYN_SENT状态非常短暂。但如果发现SYN_SENT非常多且在向不同的机器发出,那你的机器可能中了冲击波或震荡波之类的病毒了。这类病毒为了感染别的计算机,它就要扫描别的计算机,在扫描的过程中对每个要扫描的计算机都要发出了同步请求,这也是出现许多SYN_SENT的原因。
②SYN_RECV:是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态,是TCP三次握手的中间状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。
如果服务器存在很多的SYN_RECV,有如下两种可能情况
1.客户端没有收到服务器发送的[SYN,ACK]包
2.客户端收到了[SYN,ACK]包却没有发送ACK给客户端。
③ESTABLISHED:表示服务端和客户端TCP连接成功
二.tcp四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:
1.服务器读通道关闭
2.客户机写通道关闭
3.客户机读通道关闭
4.服务器写通道关闭
1.报文
FIN:是TCP/IP关闭时使用的挥手信号。
收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
ACK (Acknowledgement)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。
2.状态
①FIN_WAIT1:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。
而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
②CLOSE_WAIT:表示在等待关闭。(被动关闭)
当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态
③FIN_WAIT2:FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
④LAST_ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文的状态。
当收到ACK报文后,也即可以进入到CLOSED
③TIME_WAIT:(主动关闭)表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。 由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接
###1.报文
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
https://www.cnblogs.com/lovesong/p/5186200.html
https://www.cnblogs.com/strongery/p/5390483.html
https://www.cnblogs.com/jessezeng/p/5617105.html
http://blog.csdn.net/wodatoucai/article/details/64125944
https://www.cnblogs.com/langtianya/p/6648100.html
https://www.cnblogs.com/sunxucool/p/3449068.html
https://www.cnblogs.com/Jessy/p/3535612.html
网友评论