1.TCP状态机
TCP状态机是TCP连接的变化过程。 TCP在三次握手和四次挥手的过程,就是一个TCP的状态说明,由于TCP是一个面向连接的,可靠的传输,每一次的传输都会经历连接,传输,关闭的过程,无论是哪个方向的传输,必须建立连接才行,在双方通信的过程中,TCP的状态是不一样的
下图说明了TCP状态的变化过程
上图中不同线条的含义
TCP各个状态的解释如下:
CLOSED : 表示初始状态
LISTEN : 表示服务器端的某个socket处于监听状态,可以接受连接
SYN_SENT : 与SYN_RCVD呼应,当客户端socket执行connect连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。 该状态表示客户端已发送SYN报文
SYN_RCVD : 表示接收到SYN报文,正常情况下,该状态是服务器端的socket在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。 此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态
ESTABLISHED : 表示连接已经建立
FIN_WAIT_1 : 表示等待对方的FIN报文,当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态
FIN_WAIT_2 : 主动关闭链接的一方,发出FIN收到ACK以后进入该状态,称为半连接或半关闭状态,此时socket只能接收数据,不能发。 当对方回应ACK后,socket即进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到
TIME_WAIT : 表示收到了对方的FIN报文,并发送出了ACK报文,等2MSL后即可回到CLOSED可用状态。 如果FIN_WAIT_1状态下,收到对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态
CLOSING : 这种状态较特殊,属于一种较罕见的状态。 正常情况下,当发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。 但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。 什么情况下会出现此种情况呢? 如果双方几乎在同时close一个socket的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭socket连接
CLOSE_WAIT : 此种状态表示在等待关闭。 当对方关闭一个socket后发送FIN报文给自己,系统回应一个ACK报文给对方,此时进入CLOSE_WAIT状态。 接下来察看是否还有数据发送给对方,若无,则可close这个socket,发送FIN报文给对方,即关闭连接。 所以在CLOSE_WAIT状态下,需要关闭连接
LAST_ACK : 该状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。 当收到ACK报文后,即可以进入到CLOSED可用状态
2.TCP状态分析
2.1 TCP状态分析工具
利用网络助手 + nc命令 + netstat命令工具,来查看及分析TCP状态:
使用网络调试助手创建服务器(或客户端)
使用nc命令(netcat)创建客户端(服务端)
connect to somewhere: nc [-options] hostname port[s] [ports] ...
listen for inbound: nc -l -p port [options] [hostname] [port]
options:
-d detach from console, background mode
-e prog inbound program to exec [dangerous!!]
-g gateway source-routing hop point[s], up to 8
-G num source-routing pointer: 4, 8, 12, ...
-h this cruft
-i secs delay interval for lines sent, ports scanned
-l listen mode, for inbound connects
-L listen harder, re-listen on socket close
-n numeric-only IP addresses, no DNS
-o file hex dump of traffic
-p port local port number
-r randomize local and remote ports
-s addr local source address
-t answer TELNET negotiation
-c send CRLF instead of just LF
-u UDP mode
-v verbose [use twice to be more verbose]
-w secs timeout for connects and final net reads
-z zero-I/O mode [used for scanning]
port numbers can be individual or ranges: m-n [inclusive]
nc 连接服务器
nc 127.0.0.1 6666
nc 建立服务器
nc -l -p 6666
使用netstat和find命令查看tcp状态
netstat命令:
显示协议统计信息和当前 TCP/IP 网络连接。
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]
-a 显示所有连接和侦听端口。
-b 显示在创建每个连接或侦听端口时涉及的可执行程序。在某些情况下,已知可执
行程序承载多个独立的组件,这些情况下,显示创建连接或侦听端口时涉及的组
件序列。在此情况下,可执行程序的名称位于底部 [] 中,它调用的组件位于顶
部,直至达到 TCP/IP。注意,此选项可能很耗时,并且在你没有足够权限时可
能失败。
-e 显示以太网统计信息。此选项可以与 -s 选项结合使用。
-f 显示外部地址的完全限定域名(FQDN)。
-n 以数字形式显示地址和端口号。
-o 显示拥有的与每个连接关联的进程 ID。
-p proto 显示 proto 指定的协议的连接;proto可以是下列任何一个: TCP、UDP、TCPv6
或 UDPv6。如果与 -s 选项一起用来显示每个协议的统计信息,proto 可以是下
列任何一个: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
-q 显示所有连接、侦听端口和绑定的非侦听 TCP 端口。绑定的非侦听端口不一定与
活动连接相关联。
-r 显示路由表。
-s 显示每个协议的统计信息。默认情况下,
显示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息;
-p 选项可用于指定默认的子网。
-t 显示当前连接卸载状态。
-x 显示 NetworkDirect 连接、侦听器和共享终结点。
-y 显示所有连接的 TCP 连接模板。无法与其他选项结合使用。
interval 重新显示选定的统计信息,各个显示间暂停的间隔秒数。按 CTRL+C 停止重新显示
统计信息。如果省略,则 netstat 将打印当前的配置信息一次。
find命令:
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
/OFF[LINE] 不要跳过具有脱机属性集的文件。
"string" 指定要搜索的文本字符串。
[drive:][path]filename 指定要搜索的文件。
如果没有指定路径,FIND 将搜索在提示符处键入文本或者由另一命令产生的文本。
2.2 TCP状态分析流程
使用网络调试助手开启一个服务器,监听“127.0.0.1”和端口“6666”
此时使用nc命令 netstat -an -p tcp | find “6666” 可见端口“6666”的状态为:
LISTENING
重开一个cmd命令对话框,使用nc命令nc 127.0.0.1 6666连接服务器
再次使用nc命令netstat -an -p tcp | find “6666” 可见端口“6666”的状态为:
ESTABLISHED
网络调试助手停止监听后,再次查看tcp端口“6666”,此时的状态为:TIME_WAIT
全部0条评论
快来发表一下你的评论吧 !