网络编程3.5:理解TCP状态时序图

news/2024/5/17 16:56:23 标签: TCP

返回:Linux网络编程学习笔记

TCP状态时序图如下:

1. 三次握手(创建连接)

TCP建立连接时,三次握手时序如下:TCP数据报格式:

第一次握手:SYN, 1000(0), <mss 1460>                         

//控制位SYN置1,32位序列号为1000,该段不携带有效载荷(数据字节数为0),mss(Maximum Segment Size,最大报文长度)选项值为1460;

第二次握手:SYN, 8000(0), ACK 1001, <mss 1024>       

//控制位SYN置1,32位序列号为8000,该段不携带有效载荷,ACK置1,32位确认序列号为1001(代表client端1001之前的包,server端都收到了),mss选项值为1024;

第三次握手:ACK, 8001                                                   

//控制位ACK置1,32位确认序列号为8001(代表server端8001之前的包,client端都收到了)。

三次握手发生在内核空间,用户层的主要体现是,connect()和accept()在两端生成网络连接套接字。

使用命令查看端口状态:netstat -apn|grep 9527

root@wang-virtual-machine:/home/wang/nfs# netstat -apn|grep 9527
tcp        0      0 0.0.0.0:9527            0.0.0.0:*               LISTEN      4087/./service
tcp        0      0 127.0.0.1:9527          127.0.0.1:47286         ESTABLISHED 4087/./service
tcp        0      0 127.0.0.1:47286         127.0.0.1:9527          ESTABLISHED 4088/nc

主动发起连接请求端:    CLOSE -- 发送SYN -- SEND_SYN -- 接收 ACK、SYN -- SEND_SYN -- 发送 ACK -- ESTABLISHED(数据通信态)

被动接收连接请求端: CLOSE -- LISTEN -- 接收 SYN -- LISTEN -- 发送 ACK、SYN -- SYN_RCVD -- 接收ACK -- ESTABLISHED(数据通信态)

主动发起连接                                                  被动接受连接

2. 数据传输与滑动窗口

滑动窗口:允许多发单回或多收单确认

第1至第3为建立连接阶段,sender端的滑动窗口缓冲区大小为4k,receiver端滑动窗口的缓冲区大小为6k字节;

第4至第9步,sender向receiver端发送了6次1k的数据;

第10至11步,receiver端告诉sender,缓冲区2k的数据已经处理掉了,空闲大小为4k。

第12至13步,sender向receiver再发2k的数据,并关闭了发送(半关闭);

第14至15步,为ACK应答;

第17步:receive端关闭了发送;

第18步:sender端回复了receive端关闭。

3.四次握手(关闭连接)

主动关闭连接请求端: ESTABLISHED(数据通信态) -- 发送 FIN -- FIN_WAIT_1 -- 接收ACK -- FIN_WAIT_2(半关闭)

                -- 接收对端发送 FIN -- FIN_WAIT_2(半关闭)-- 回发ACK -- TIME_WAIT(只有主动关闭连接方,会经历该状态)

                -- 等 2MSL时长 -- CLOSE 

被动关闭连接请求端: ESTABLISHED(数据通信态) -- 接收 FIN -- ESTABLISHED(数据通信态) -- 发送ACK 

                -- CLOSE_WAIT (说明对端【主动关闭连接端】处于半关闭状态) -- 发送FIN -- LAST_ACK -- 接收ACK -- CLOSE

主动发起关闭                                                   被动接受关闭

client与server建立TCP socket连接后,如果client端主动关闭连接,会进入FIN_WAIT2状态

root@wang-virtual-machine:/home/wang/nfs# netstat -apn|grep 9527
tcp        0      0 0.0.0.0:9527            0.0.0.0:*               LISTEN      4087/./service
tcp        0      0 127.0.0.1:9527          127.0.0.1:47286         CLOSE_WAIT  4087/./service
tcp        0      0 127.0.0.1:47286         127.0.0.1:9527          FIN_WAIT2   -

如果server端主动关闭,其状态会从上方的CLOSE_WAIT变为FIN_WAIT2状态

root@wang-virtual-machine:/home/wang/nfs# netstat -apn|grep 9527
tcp        0      0 127.0.0.1:9527          127.0.0.1:47288         FIN_WAIT2   -
tcp        0      0 127.0.0.1:47288         127.0.0.1:9527          CLOSE_WAIT  4143/nc

在server端主动关闭的情况下,立马重启server端,会出现以下报错信息,主要原因是FIN_WAIT2状态会持续40s,9527这个端口还在被占用。

root@wang-virtual-machine:/home/wang/nfs# ./service
error bind!
: Address already in use

 在server的TCP连接没有完全断开之前不允许重新监听是不合理的。因为,TCP连接没有完全断开指的是connfd(127.0.0.1:47288)没有完全断开,而我们重新监听的是lis-tenfd(0.0.0.0:9527),虽然是占用同一个端口,但IP地址不同,connfd对应的是与某个客户端通讯的一个具体的IP地址,而listenfd对应的是wildcard address。解决这个问题的方法是使用setsockopt()设置socket描述符的选项SO_REUSEADDR为1,表示允许创建端口号相同但IP地址不同的多个socket描述符。
        在server代码的socket()和bind()调用之间插入如下代码:

    int opt = 1;
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

有关setsockopt可以设置的其它选项请参考UNP第7章。


http://www.niftyadmin.cn/n/1824362.html

相关文章

团队选题报告(i know)

一、团队成员及分工 团队名称&#xff1a;I know 团队成员&#xff1a; 陈家权&#xff1a;选题报告word撰写赖晓连&#xff1a;ppt制作&#xff0c;原型设计雷晶&#xff1a;ppt制作&#xff0c;原型设计林巧娜&#xff1a;原型设计&#xff0c;博客随笔撰写庄加鑫&#xff1a…

jqgrid 获取选中行主键集合

如何获取选中行的主键集合呢&#xff1f; 使用 getGridParam(selarrrow) 方法可获取所有选中行的主键集合。 注意&#xff1a;此处的主键集合是指-设置为主键的列&#xff08;key: true&#xff09;。再次提醒&#xff1a;一个jqgrid只能设置一个主键列 //获取选中行集合 $(&q…

网络编程4:高并发服务器——多路I/O转接服务器设计(select、poll、epoll)

返回&#xff1a;Linux网络编程学习笔记 select、poll、epoll三者优缺点对比 多路I/O函数优点缺点select1.函数诞生时间早&#xff0c;跨平台性好&#xff0c;windows、linux、macOS、Unix、类Unix均支持1.监听的文件描述符上限为1024&#xff1b;2.需要添加业务逻辑&#xf…

详解Linux chgrp和chown命令的用法

Linux chgrp和chown命令是管理员的常用命令&#xff0c;对于初学Linux系统管理的人来说&#xff0c;这对Linux chgrp和chown命令具体的用法这里做一介绍。 Linux chgrp命令 功能&#xff1a;改变文件或目录所属的组。 语法&#xff1a;chgrp [选项] group filename? 该命令改变…

存储探秘 走近戴尔光纤存储解决方案访谈实录

现如今大大小小的企业对于数据的存储都是相当重视&#xff0c;可能一次的数据丢失都会给企业带来不小的损失&#xff0c;所以如今很多企业都有自己的网络存储&#xff0c;对于选择一款好的存储方案对企业来说至关重要&#xff0c;通过本期访谈您将会了解到光纤存储的优势与性能…

WC项目

代码参考来源&#xff1a;http://www.cnblogs.com/xc2017/p/7554038.html 错误处理error C4996: fopen: This function or variable may be unsafe 运行之后出现了上面的错误&#xff0c;进过百度&#xff0c;再加自己的理解在文件的属性里面的预处理器加入了_CRT_SECURE_NO_WA…

网络编程6:线程池简介

1. 线程池相关结构体 struct threadpool_t {pthread_mutex_t lock; /* 用于锁住本结构体 */ pthread_mutex_t thread_counter; /* 记录忙状态线程个数de琐 -- busy_thr_num */pthread_cond_t queue_not_full; /* 当任务队列满时&#xff0c;添加任务…

中钢李红:传统企业大数据实施路径思考

大数据是什么&#xff1f;数据、技术、思维、资源、财富、能力。 在中钢集团信息管理部总经理李红多年的信息化经验看来&#xff0c;制造业之前都在解决流程、管理等效率问题。而现如今大数据不仅在数字化转型的过程中发挥着重要作用&#xff0c;同时也在重塑企业的发展竞争格局…