这篇文章主要记录一下使用netstat查看tcp连接状态的实例
tcp的连接状态主要是通过三次握手和四次挥手进行状态转移,关于三次握手和四次挥手的详情可以看我的上一篇文章《总结三次握手和四次挥手》

先上一张状态转移图

其中红色线代表客户端的正常状态转换流程
黑色虚线表示服务端的正常状态转换流程

这里看到了其中有几处红色标号,这是几种异常的状态转换,在这里介绍一下(这里还是抽象主动连接一方为客户端,被动连接方为服务端)

  • 状态异常转换
    标号①:这种状态转移是因为在自己向一方发起SYN连接请求后恰好又收到了来自于另其他方对自己的连接请求,所以这里的状态转移其实是面向其他方连接状态的转移。比如A向B发送连接请求,此时处于SYN_SENT,然后此时又有一个C向A发出连接请求,所以此时A的状态转移为SYN_RCVD。
    标号②:这是由于上篇文章提到的四次挥手变为三次挥手,主要是由于客户端发送连接终止报文段之后,恰好服务端的数据发送完毕,然后就把ACK和FIN一同发给了客户端,这里就不存在FIN_WAIT_2状态而直接进入TIME_WAIT状态了。
    标号③:这种状态属于一种比较罕见的例外状态,是由于自己发送了FIN和ACK也收到了FIN但是没有收到ACK,一般情况下是ACK和FIN一起收到了,而之所以出现这种状态是由于双方几乎同时发送关闭连接请求,所以进入CLOSING状态,表示都在进行关闭连接,等收到最后一个ACK应答之后进入TIME_WAIT状态。
    标号④:这种情况也在之前文章提到过,是由于服务端进入SYN_RCVD状态后在等待ACK确认,但是这个时候如果等不到ACK会进行超时重传,指数增加达到64s后发送RST进行连接中断,或者是第三次握手丢失,服务端收到了来自客户端的数据并认为是非法数据,便会发送RST中断连接。

  • 查看网络相关状态信息

○ 命令:netstat
○ 参数:-a (all)显示所有选项,默认不显示LISTEN相关-p 显示建立相关链接的程序名-n 拒绝显示别名,能显示数字的全部转化成数字。-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-l 仅列出有在 Listen (监听) 的服务状态

(1)启动服务器,此时服务器进入监听状态


(2)客户端连接,然后进入ESTABLISHED状态


(3)客户端断开连接,进入TIME_WAIT状态,大约一分钟以后连接断开

(4)服务端发送断开连接请求后,由于客户端数据还未发送完,此时服务端进入FIN_WAIT2,等待客户端的FIN请求,客户端进入CLOSE_WAIT,发送完数据后进行FIN请求。此时重启服务端的时候显示端口被占用,是因为上个连接还未关闭。


(5)客户端发送完数据之后连接断开,在使用netstat查看不到连接状态

由于知识有限,加上三次连接的过程是通过内核完成的,所以捕捉不到全部的过程,但是也可以通过这几个例子查看到netstat确实可以查看连接所达到的状态,这也是学习状态转移的意义之一,通过这种方法,当连接出现异常时可以进行查看。
最后上一下服务端和客户端的代码,有兴趣的可以自己尝试下

  • 服务端代码
// 并发的服务器代码,父进程监听后fork子进程进行通信
#include <stdio.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
//信号捕捉处理函数
void child_handle(int num)
{pid_t pid;while((pid=waitpid(-1,NULL,WNOHANG))>0){printf("child has handled pid=%d\n",pid);}}
int main(int argc,char *argv[])
{struct sockaddr_in serv,clie;int sockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("sock error");exit(1);}serv.sin_family=AF_INET;serv.sin_port=htons(8000);//设置端口号为8000serv.sin_addr.s_addr=htonl(INADDR_ANY);int res=bind(sockfd,(struct sockaddr*)&serv,sizeof(serv));//绑定if(res<0){perror("bind error");exit(1);}res=listen(sockfd,128);    //监听if(res<0){perror("listen error");exit(1);}/注册信号捕捉,实现自动回收子进程struct sigaction act;act.sa_handler=child_handle;//设置处理函数act.sa_flags=0;sigemptyset(&act.sa_mask);//清空阻塞集sigaction(SIGCHLD,&act,NULL);//int length=sizeof(clie);//定义变量length,用来当做传出参数放到accept中while(1){//当在等待连接的时候,子进程退出,此时信号捕捉到//信号捕捉完之后回去处理进程回收函数//当处理完进程回收,accept监听不再阻塞,返回-1,此时errnu=EINTRint cfd=0;cfd=accept(sockfd,(struct sockaddr*)&clie,&length);while(cfd<0&&errno==EINTR){cfd=accept(sockfd,(struct sockaddr*)&clie,&length);}printf("connect successful\n");pid_t pid=fork();//子进程if(pid==0){char buf[512]={0};//定义接受数组close(sockfd);//关闭监听套接字(避免资源浪费)while(1){char ip[20];printf("user ip=%s,port=%d ",inet_ntop(AF_INET,&clie.sin_addr.s_addr,ip,sizeof(ip)),ntohs(clie.sin_port));memset(buf,0,sizeof(buf));int res=read(cfd,buf,sizeof(buf));if(res<0){perror("read err");exit(1);}else if(res==0){printf("connect over\n");close(cfd);break;}else{printf("send:%s",buf);write(cfd,buf,res);}}return 0;}//父进程else if(pid>0){close(cfd);//关闭通信套接字}}return 0;
}
  • 客户端代码
#include <stdio.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{char buf[512];int i=0;if(argc!=2){printf("./a.out ip\n");exit(1);}int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd<0){perror("sock err");exit(1);}struct sockaddr_in clisock;memset(&clisock,0,sizeof(clisock));clisock.sin_family=AF_INET;clisock.sin_port=htons(8000);inet_pton(AF_INET,argv[1],&clisock.sin_addr.s_addr);int res=connect(cfd,(struct sockaddr*)&clisock,sizeof(clisock));if(res<0){perror("connect err");close(cfd);exit(1);}for(;i<5;++i){char mes[512]={0};memset(buf,0,sizeof(buf));printf("输入数据:\n");fgets(buf,sizeof(buf),stdin);write(cfd,buf,strlen(buf));int res=read(cfd,mes,sizeof(mes));if(res==0){break;}else if(res<0){perror("read error");close(cfd);exit(1);}else{printf("server:%s",mes);}}close(cfd);return 0;
}

本篇文章为自己原创,本人编程小白一枚,如果文章出现错误,欢迎告知,最后希望大家能一起学习一起进步。

netstat查看TCP连接状态相关推荐

  1. 使用netstat查看tcp连接、udp连接

    [root@dbserver ~]# netstat -nt --->>>查看tcp连接,注意看第二列和第三列 Active Internet connections (w/o se ...

  2. 查看TCP连接状态及问题排查

    一.连接状态 LISTEN:服务器在等待进入呼叫 SYN_RECV:一个连接请求已经到达,等待确认 SYN_SENT:应用已经开始,打开一个连接 ESTABLISHED:正常数据传输状态 FIN_WA ...

  3. linux查看tcp连接状态

    netstat -an |grep tcp   查看所有tcp连接包括LISTEN状态 netstat -an |grep ESTABLISHED   查看所有正在连接中的tcp连接 如果需要统计tc ...

  4. linux查看tcp连接状态_Linux使用lsof查看打开的文件和网络连接

    lsof是List Open Files的缩写.顾名思义,它用来查看系统中进程打开了哪些文件:因为Linux几乎所有的设备都可以看成是文件,所以lsof经常也可以用来查看管道,sockets的使用状态 ...

  5. Linux netstat查看网络连接状态

    centos7安装netstat组件: https://zhangxueliang.blog.csdn.net/article/details/104330051

  6. CentOS查看系统连接状态

    1.查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ {++S[$NF]} ...

  7. 查看 并发请求数及其TCP连接状态

    服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ps -ef|grep httpd| ...

  8. 查看Apache的并发请求数及其TCP连接状态

    查看Apache的并发请求数及其TCP连接状态: Linux命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a] ...

  9. 查看Apache并发请求数及其TCP连接状态 --张宴

    [ 2007-7-20 18:30 | by 张宴 ]     [文章作者:张宴 本文版本:v1.1 最后修改:2007.07.27 转载请注明出处:http://blog.s135.com] 这两天 ...

最新文章

  1. NVIDIA Jetson TX2使用
  2. 使用深度学习进行基于AI的面部识别的不同方法
  3. Solid Converter PDF
  4. Java编程基础篇第二章
  5. Linux权限和进程管理、网络配置、任务调度(四)
  6. WTL 自绘 进度条Progressbar
  7. vue接收json数据_Vue之使用ajax获取json数据,并用v-for循环显示在表格中
  8. linux查看svn信息,SVN 查看历史信息
  9. 百一测评c语言两个数求和程序,2017计算机二级C语言考前测试题与答案
  10. 记录——《C Primer Plus (第五版)》第十章编程练习第六题
  11. 什么原数据更容易平稳_为什么老年人更容易患上艾滋病?
  12. php html 去空格 换行,实用的php清除html,php去除空格与换行,php清除空白行和换行,提取页面纯文本...
  13. 怎么在国内创建谷歌账号_如何在Google文档中创建模板
  14. 艺术和设计的区别是什么?蓝蓝推荐
  15. NGINX源码之:ngx_bufchain
  16. 采访UI设计师Kiro
  17. 神还原女神照片!GAN 为百年旧照上色
  18. JSP及MVC三层架构
  19. 命令行把java项目打成jar包
  20. Eden和Survivor

热门文章

  1. python解最小二乘(least square)
  2. ‘latin-1‘ codec can‘t encode characters in position 103-115: Body (‘一串中文‘) is not valid Latin-1
  3. 《数据结构》学习记录(6):链栈
  4. 推荐一个基于MPV的视频播放器--Baka MPlayer,使用Qt开发的图形界面
  5. 计算机系统基础(五)之RISC-V指令集
  6. php-fpm状态页监控,使用监控宝监控php-fpm状态
  7. 学习记录662@项目管理之项目整体管理
  8. 【中科院大学】广州校区将落户南沙科学城
  9. c语言设计之歌曲信息管理系统,C语言课设之歌曲信息管理系统
  10. qml 矩形 rectangle