[linux] C语言Linux系统编程-TCP通信的11种状态

三次握手由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

#include <.h> sock = socket(AF_INET,SOCK_STREAM, &serv_addr,,(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(); serv_addr.sin_port = htons(); connect(sock,( sockaddr*)&serv_addr, buffer[(buffer)-printf(</span><span style="color: #800000"&gt;"</span><span style="color: #800000"&gt;Message form server: %s\n</span><span style="color: #800000"&gt;"</span><span style="color: #000000"&gt;,buffer); </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;sleep(60); </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt;关闭套接字</span>

<span style="color: #000000"> close(sock);
sleep(<span style="color: #800080">60<span style="color: #000000">);
<span style="color: #0000ff">return <span style="color: #800080">0<span style="color: #000000">;
}

server.c

#include <.h>.h> serv_sock = &serv_addr,(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);; serv_addr.sin_port = htons(); bind(serv_sock, listen(serv_sock, = clnt_sock = accept(serv_sock,( sockaddr*)&clnt_addr,& str[] = ,1183C ,

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...