三次握手由client主动发出SYN请求,此时client处于SYN_SENT状态(第一次握手)当server收到之后会由LISTEN转变为SYN_REVD状态,并回复client,client收到应答后处于ESTABLISHED状态,这个状态就表示client已经准备好通信了(第二次握手)client收到二次握手应答后回复server,server收到应答之后也处于ESTABLISHED,表示握手成功,可以通信了(第三次握手)
数据传输然后client和server都处于通信状态,不会改变
四次挥手client主动发送FIN请求关闭,此时client处于FIN_WAIT_1状态(短暂)(第一次挥手)server收到之后处于CLOSE_WAIT状态(半关闭状态),并做出应答(第二次挥手)client收到之后处于FIN_WAIT_2状态,等待server发送关闭请求.server会紧接着发送FIN断开请求,并处于LAST_ACK(第三次挥手)client收到之后并应答,此时处于TIME_WAIT状态,这是主动断开的一端的最后一个状态,意思是会等待一定的时间(2MSL-1min),等待之后会变成CLOSED状态(第四次挥手)
TCP的11种状态
CLOSED最初状态1.建立连接三次握手client server(1)SYN_SENT ========> (2)LISTEN(4)ESTABLISHED <======== (3)SYN_RCVD(5) =========> (6)ESTABLISHED2.数据传输阶段3.断开连接四次挥手(1)FIN_WAIT_1 =========> (2)CLOSE_WAIT(4)FIN_WAIT_2 <========== (3)(6)TIME_WAIT <========== (5)LAST_ACK(7) ==========>
使用netstat命令查看各种状态:
1.
2.
3.
4.
服务端监听本机1234端口,客户端进行连接,TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟,自动关掉
参照代码:
client.c
printf(</span><span style="color: #800000">"</span><span style="color: #800000">Message form server: %s\n</span><span style="color: #800000">"</span><span style="color: #000000">,buffer);
</span><span style="color: #008000">//</span><span style="color: #008000">sleep(60);
</span><span style="color: #008000">//</span><span style="color: #008000">关闭套接字</span>
<span style="color: #000000"> close(sock);
sleep(
<span style="color: #0000ff">return <span style="color: #800080">0<span style="color: #000000">;
}
server.c