三次握手

由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)ESTABLISHED

2.数据传输阶段

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

#include

#include

#include

#include

#include

int main(){

//创建套接字

int sock = socket(AF_INET, SOCK_STREAM, 0);

sleep(20);

//向服务器(特定的IP和端口)发起请求

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充

serv_addr.sin_family = AF_INET; //使用IPv4地址

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址

serv_addr.sin_port = htons(1234); //端口

connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

sleep(20);

//读取服务器传回的数据

char buffer[40];

read(sock, buffer, sizeof(buffer)-1);

printf("Message form server: %s\n", buffer);

//sleep(60);

//关闭套接字

close(sock);

sleep(60);

return 0;

}

server.c

#include

#include

#include

#include

#include

#include

#include

int main(){

//创建套接字

int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

//将套接字和IP、端口绑定

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充

serv_addr.sin_family = AF_INET; //使用IPv4地址

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);; //具体的IP地址

serv_addr.sin_port = htons(1234); //端口

bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

//进入监听状态,等待用户发起请求

listen(serv_sock, 20);

sleep(20);

//接收客户端请求

struct sockaddr_in clnt_addr;

socklen_t clnt_addr_size = sizeof(clnt_addr);

int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);

sleep(20);

//向客户端发送数据

char str[] = "Hello World!";

write(clnt_sock, str, sizeof(str));

sleep(20);

//关闭套接字

close(clnt_sock);

sleep(20);

close(serv_sock);

sleep(20);

"5.c" 36L, 1183C 1,1 Top

close(serv_sock);

sleep(20);

return 0;

}

C语言获取linux接口状态,[linux] C语言Linux系统编程-TCP通信的11种状态相关推荐

  1. TCP协议连接的11种状态浅谈

    了解TCP的协议可以在很大程度上帮助我们分析服务器当前的TCP连接状态,同时也是排查一些网络故障的基础,首先来看一下TCP协议的三次握手与四次断开. TCP协议三次握手   1.客户端首先发起连接,也 ...

  2. Linux云计算架构-grafana美化工具+zabbix数据源的使用(含11种panel面板的使用)

    文章目录 Linux云计算架构-Grafana美化工具+Zabbix数据源的使用(含11种panel面板的使用) 1. grafana菜单介绍 2. Graph panel面板 3. Heatmap( ...

  3. 【转载】C语言嵌入式系统编程修炼之二:软件架构篇

    C语言嵌入式系统编程之软件架构篇 模块划分 模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设 ...

  4. 浅谈C语言嵌入式系统编程注意事项

    C语言嵌入式系统编程注意事项之背景篇   本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程技巧 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上 ...

  5. C语言嵌入式系统编程修炼(经典中的经典)

    C语言嵌入式系统编程修炼      http://blog.chinaunix.net/u/25764/showart_326589.html转载自这里,真是太经典了. C语言嵌入式系统编程修炼   ...

  6. C语言嵌入式系统编程

    不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发 ...

  7. C语言嵌入式系统编程注意事项

    不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑, 汇编语言 具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是 嵌入式系 ...

  8. C语言嵌入式系统编程修炼

    C语言嵌入式系统编程修炼之内存操作篇 数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力.在嵌入式 ...

  9. c语言嵌入式系统编程软件,C语言嵌入式系统编程软件设计研究论文

    C语言嵌入式系统编程软件设计研究论文 摘要:近年来,C语言编程在嵌入式系统越来越受到广大技术人员的青睐.介绍了C语言系统软件的编程思路,阐述了嵌入式系统编程软件架构的基本知识,包括模块划分.分层架构. ...

  10. C语言嵌入式系统编程修炼之道——性能优化篇

    C语言嵌入式系统编程修炼之道--性能优化篇 作者:宋宝华  e-mail:[email]21cnbao@21cn.com[/email] 1.使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌 ...

最新文章

  1. Docker Desktop添加对Kubernetes的支持
  2. 用计算机源码计算加法,MFC实现简单计算器(支持加减乘除和括号运算)
  3. 在调研近百家企业需求后,我们推出了新产品线——神策客景
  4. 一文看懂Python(三)-----字典篇
  5. 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇:简介及目录》(附上完整工程文件)...
  6. 中职高级计算机操作员,计算机操作员专业排行榜
  7. 创建一个delete触发器_基于 Django 信号机制实现类似触发器的效果
  8. Python正则表达式初识(七)
  9. day12 装饰器的进阶
  10. OneProxy中间件生产使用经验视频分享
  11. exoplay切换全屏_ExoPlayer播放视频的简单使用及播放视频宽高设置的源码分析
  12. 台式电脑主板插线步骤图_图解电脑主机电源线接法图解
  13. [Maven实战-许晓斌]-[第三章] Mave使用入门二(在IDE中的使用) [第四章] 案例的背景介绍...
  14. 关于勾股数的规律及证明
  15. 安卓开发:怎样实时在百度地图上绘制运动轨迹?
  16. 爱普生EPSON Stylus Color 580 打印机驱动
  17. Linux——孤儿进程|进程的优先级 用top命令去修改优先级 其他概念 环境变量 PATH 获取环境变量
  18. Visiom Transformer 代码实现--ViT
  19. AlphaFold蛋白质结构预测协助发现首个CDK20的小分子抑制剂
  20. openwrt - 性能监控 netdata

热门文章

  1. sqlserver中系统库的作用
  2. xmlhttp资料(收集)
  3. 第4 章 变量、作用域和内存问题
  4. 8.Prometheus 监控技术与实践 --- Pushgateway
  5. 6.大数据架构详解:从数据获取到深度学习 --- 交互式分析
  6. 5.企业应用架构模式 --- 并发
  7. 4. 创建 bundle
  8. 61. Event altKey 事件属性
  9. mysql留存率除了存储过程_基于MySQL分析线上充值留存率
  10. Hbase的安装与测试