linux网路编程之TCP状态转换及端口复用

(1)TCP状态转换图

         

    其中图中分为三种状态:实线代表的主动发起连接,虚线代表的被动发起连接,细实线代表的可以双向发起连接的状态。

主动发起连接方状态变化:1)主动发起连接的一方发送SYN标志位,进入SYN_SENT状态,等待接收被发起连接方发送ACK应答和数据包序号,接收到ACK应答后,同时向被被发起连接方发送ACK应答,表示数据已经接收到,同一发起连接,此时进入ESTABLISHED状态,表示三次握手完成。2)主动发起连接的一方向另一方发送FIN标志位,请求关闭连接,立即进入FIN_WATI_1,等待被动发起连接方发送ACK应答信号,主动发起连接方接收到ACK应答信号后,进入FIN_WATI_2状态,代表主动发起连接端半关闭完成。此时,如果被动连接方发送FIN信号请求关闭连接,主动发起连接的一方会发送一个ACK应答信号同意关闭,但是此时不确定被动发起连接方是否收到信号(因为主动发起连接方已经关闭),所以要等待一个2MSL时间(确保最后发送的一个ACK应答信号被接收到),2MSL时间一到,被动连接方关闭,四次挥手完成。

被动发起连接方状态变化:1)被动发起连接方处于监听状态,等待连接,当被动发起连接方接收到主动方SYN状态请求连接时,被动发起连接方会发送一个ACK应答同时携带自己的数据报序号给主动方,进入SYN_RCVD状态,等待主动方发送ACK应答信号,当接收到主动方发起的ACK应答信号时,被动发起连接方进入ESTABLISHED状态,表示三次握手完成。2)当主动方发送FIN请求关闭时,被动连接方接收FIN并同时向主动方发送ACK应答,同意关闭,此时被动连接方进入CLOSE_WAIT状态。如果此时被动连接方发送FIN信号,则进入LAST_ACK状态,等待主动方的应答信号,当接收到主动方的应答信号,被动方关闭,四次挥手完成。

双向连接状态:1)当被动发起连接方进入SYN_RCVD状态,等待主动发起方发送ACK应答信号时,此时如果网络中断,则三次握手中断,重新进行三次握手,被接受方发送RST信号,重新连接。2)主动发起连接方接收到FIN信号进入FIN_WAIT_1状态,此时如果主动接收到ACK和FIN信号,同时给被动方发送ACK应答信号,则主动方进入TIME_WAIT状态,等待2MSL时间关闭文件。如果只收到ACK应答信号和FIN信号,则会进入CLOSING状态,当主动发送ACK应答信号时,主动方进入TIME_WAIT状态,等待2MSL时间关闭文件。

(2)C/S模型的TCP状态图

         

(3)半关闭

            当TCP链接中A发送FIN请求关闭,B端回应ACK后(A端进入FIN_WAIT_2状态),B没有立即发送FIN给A,此时A处于半关闭状态,A可以接收B发送的数据,但是A不能向B发送数据了。

           使用close关闭文件描述符只是中止一个连接,它减少的只是描述符的引用计数,并不直接关闭连接,当引用计数达到0时,才关闭连接。而使用shutdown不考虑描述符的引用计数,直接关闭描述符,也可以中止一个方向的连接,只中止读或者写。

            #include<sys/socket.h>

            int   shutdown(int sockfd,int how)

           参数:how        SHUT_RD(0):关闭套接字读功能缓存区

                                      SHUT_WR(1):关闭套接字写功能缓存区

                                      SHUT_RDWR(2):关闭套接字读写功能缓存区

(4)端口复用

             当服务器断开连接时,实际上此时服务器使用的端口处于TIME_WAIT状态,需要等待2MSL时间才能重新被利用。如果想要在服务器断开连接时端口可以被使用,则需要使用端口复用功能,具体方法是使用setsockopt()设置socket描述符选项的S0_REUSEADDR为1,表示允许创建端口号相同,但IP地址不同的多个socket描述符。

           在server代码中的socket()和bind()之间插入代码:

                           int opt=1;

                           setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux网络编程之多路I/o转接服务器select

(1)多路IO转接服务器也叫做多任务IO服务器&#xff0c;其主要思想是不再由程序自己监听客户端连接&#xff0c;取而代之的是由内核替应用程序监视文件&#xff0c;具体实现模型如图所示&#xff1a; 当客户端请求和服务器连接时&#xff0c;内核接收到连接指令&#xff0c;告诉…

linux网络编程之多路I/O转接服务器poll函数

&#xff08;1&#xff09;poll函数 头文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//监控的事件 short revents;//监控事件中满足条件返回的事情 }&#xff1…

《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

C Primer第二章的内容主要介绍了变量和基础类型&#xff0c;包括C语言定义的基础内置类型、变量的定义及声明、符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍&#xff0c;本次博客也从这四个方面进行系统的介绍&#xff0c;如果有不足之处&#xff0c;还望其他…

793. 阶乘函数后K个零 golang

Me(AC 33 / 44 个通过测试用例) func preimageSizeFZF(K int) int {count : 0for i : 0; i < 1000000; i {if trailingZeroes(i) K {count}}fmt.Println(count)//fmt.Println(trailingZeroes(25))return count}func trailingZeroes(n int) int {if n 0 {return 0}return …

小程序radio单选框回显

话不多说&#xff0c;效果图如下&#xff1a; 具体代码如下&#xff1a; <radio-group name"radio" bindchange"getSex"><label><radio value"1" checked"{{xingbie1}}" />男</label><label><radio…

《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究

1.关于无符号数和有符号数的运算 关于无符号数和有符号数的运算&#xff0c;在我看来一直是觉得只要有无符号数和有符号数的运算&#xff0c;有符号数就转化为无符号数&#xff0c;但是在《C Primer 第五版》的p142介绍&#xff0c;关于无符号数和有符号数的运算如下规定的&…

543. 二叉树的直径 golang

文章目录543. 二叉树的直径example正确解法question代码&#xff08;wrong)543. 二叉树的直径 概要: 借鉴了这个题的代码。可是有一个测试用例过不去 https://blog.csdn.net/csdn_kou/article/details/104122067 example 给定一棵二叉树&#xff0c;你需要计算它的直径长度。一…

《C++ Primer 第五版》(第4.11-4.12节)——static_cast,const_cast和reinterpret_cast类型转换, 运算符优先级表

1.static_cast,const_cast和reinterpret_cast类型转换 static_cast:强制的类型转换(不能用于底层的const转换),以前C语言中的强制类型转换都可以使用static_cast来完成。如&#xff1a;int i3; double jstatic_cast<double>(i); const_cast&#xff1a;改变底层const(指针…

《C++ Primer 第五版》(第5.1-5.6节) ——异常处理机制(try语句块,throw表达式和catch异常捕捉处理单元)

1. 异常处理机制 C中使用try,throw和catch三个关键字来实现异常的触发、抛出和处理的功能&#xff0c;具体通用语法形式如下&#xff1a; try{ if(true) normal program-statements&#xff1b;//没有触发异常时候执行的代码 if(false) throw(exception); //出现错误&am…

283. 移动零golang

Me 遍历所有数组&#xff0c;统计0的个数倒着把零写入数组末尾 func moveZeroes(nums []int) {var count, j intfor _, key : range nums {if key 0 {count} else{nums[j] keyj}}for i:len(nums) - count; i < len(nums); i {nums[i] 0} }最优解(快慢指针) 减少了数组…

QT自定义MainWindow

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;自定义边框&#xff0c;标题栏&#xff0c;工具栏&#xff0c;内容栏&#xff0c;状态栏&#xff08;后面三个代码中没有实现实现&#xff09; 2&#xff09;重写鼠标事件…

QTextEdit实现图片和文本同行显示

1.开发环境&#xff1a;Qt 4.7.3 MinGW 32bit (MSVC2015 32bit) 2.实现大纲&#xff1a; 1&#xff09;实现图片和文本在同一行显示&#xff0c;且能够设置字体大小和颜色 2&#xff09;能够手动设置行的宽度和间距 3&#xff09;设置字体样式&#xff0c;然后添加图片&#…

QQuickWidget + QML编程实现酷炫动态动画效果

1.具体需求&#xff1a;当Qt开发项目中需要实现简单的动态酷炫动画效果时&#xff0c;我们可以使用Qt中的QQuickWidget来实现&#xff0c;同时还可以使用QML编程来实现具体的动画效果&#xff0c;具体实现的效果如下所示&#xff1a; 2.具体操作和实现效果图&#xff1a; 1&am…

Qt中的四种信号与槽的连接方式

1. UI界面右键点击控件&#xff0c;选择“转到槽“&#xff0c;系统会在cpp中自动添加这个组件对应的槽函数 2.在Ui界面的下面 siga如l & slot editor栏中手动添加 3.在代码中使用connect显示添加 4. 使用on_对象名_事件名隐式连接&#xff0c;以QPushButton为例 QPushBut…

解决QTreeWidget中item无法整行同时显示相同颜色

对于QTreeWidget来说&#xff0c;继承自QTreeView&#xff0c;因此设计QTreeWidget中的样式设计&#xff0c;归根结底是对QTreeView的样式设计&#xff0c;而对于QTreeView中item样式设计&#xff0c;可以分为对branch和item设计&#xff0c;另外QT Style Sheet可以通过设置sho…

Qt自定义对话框中边框阴影实现

1. 对于Window系统或者Unix系统&#xff0c;QDialog有一个默认的边框(样式看起来有点复古)&#xff0c;不过Qt可以提供自定义的边框设计&#xff0c;通过设置对话框相关属性&#xff1a; setWindowFlags(Qt::Dialog | Qt:: FramelessWindowHint); //设置不适应默认边框 setAt…

从mice到missForest:常用数据插值方法优缺点

一、引言 数据插值方法在数据处理和分析中扮演着至关重要的角色。它们可以帮助我们处理缺失数据&#xff0c;使得数据分析更加准确和可靠。数据插值方法被广泛应用于金融、医疗、社会科学等领域&#xff0c;以及工程和环境监测等实际应用中。 在本文中&#xff0c;我们将探讨三…

22. 括号生成 golang 图解

题目 括号生成 给出 n 代表生成括号的对数&#xff0c;请你写出一个函数&#xff0c;使其能够生成所有可能的并且有效的括号组合。 例如&#xff0c;给出 n 3&#xff0c;生成结果为&#xff1a; [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ] 解法 f…

279. 完全平方数 golang BFS

题目 完全平方数 给定正整数 n&#xff0c;找到若干个完全平方数&#xff08;比如 1, 4, 9, 16, …&#xff09;使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n 12 输出: 3 解释: 12 4 4 4. 示例 2: 输入: n 13 输出: 2 解释: 13 4 9…

343. 整数拆分 golang 动态规划

题目 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你…