socket 状态转换

udp 调用connect 后切换网络会出现什么情况 Udp client端快速感知服务端异常如挂掉,udp 调用connect 后切换网络会出现什么情况背景正题 最近有点想法,有点像溜溜球的赶脚,来回总结了一下,发现以前忙忙碌碌地学习,学的也不少但是能记住不多,平时做的笔记也比较随意,很散,现在梳理感觉有点吃力,莫名的感觉到一味地瞎搞没有认真总结是一种非常不明智做法,效率真心不高。从此刻无论如何只要有新知识必须上了梳理一波,想变强必须严格要求,别懒死啊,兄弟~~~注意学习方法,积累知识,进入正题。。。 背景 最近和一个兄弟在搞可靠udp相关开发,具体实现仿 阅读详情


一.TCP简介
        TCP提供一种面向连接的,可靠的字节流服务。面对连接意味着两个使用TCP的应用,在彼此交换数据之前必须先建立一个连接。TCP通过以下方式提供可靠性:
     1. 应用数据被分割成TCP认为最适合发送的数据块,由TCP传递给IP的信息单位成为报文段。 
     2. 当TCP发出一个段后,它就启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
     3. 当TCP收到TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,而是延迟发送的。
     4. TCP将保持对它首部和数据的校验和,这是一个端到端的校验和,目的是检测数据在传输在传送过程中的任何变化。如果收到段得检验和有错误,TCP将丢弃这个报文段和不确认收到报文段。
     5. TCP将对收到的数据进行重新排序,将收到的数据以正确的方式交给应用层。
     6. TCP的接收端必须丢弃重复的数据
     7. TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。


二. TCP状态迁移路线图

下面的文章按照client/server两条路线讲述TCP状态迁移路线图。


 
   1. 连接建立

   1) Client
当Client端调用socket函数调用时,相当于Client端产生了一个处于Closed状态的套接字。
Client端又调用
connect函数调用,系统为Client随机分配一个端口,连同传入connect中的参数(Server的IP和端口),这就形成了一个连接四元组,connect调用让Client端的socket处于SYN_SENT状态
当Server返回确认,并发送SYN,Client返回确认及SYN后,套接字处于ESTABLISHED阶段,此时双方的连接已经可以进行读写操作

   2)Server
当Server端调用socket函数调用时,相当于Server端产生了一个处于Closed状态的监听套接字
Server端调用
bind操作,将监听套接字与指定的地址和端口关联,然后又调用listen函数,系统会为其分配未完成队列和完成队列,此时的监听套接字可以接受Client的连接,监听套接字状态处于LISTEN状态。
当Server端调用accept操作时,会从完成队列中取出一个已经完成的client连接,同时在server这段会产生一个会话套接字,用于和client端套接字的通信,这个会话套接字的状态是ESTABLISH。
 
   2. 连接关闭
与连接建立分为server/client不同,连接关闭并没有绝对的server/client之分,连接关闭分为主动关闭和被动关闭。Server和client都可以担任这两个角色中的任意一个。如client可以关闭它与server的连接,同样的server一样也可以关闭一些长时间无读写事件发生的连接。既然这么说了,下面就会分成两个部分:client主动关闭,server主动关闭。

Client主动关闭,Server被动关闭:
Client主动关闭,Server被动关闭的情况还是蛮多的,比如说短连接中,当一次会话结束时,client就可以关闭它与server之间的连接。我们这边直接说close而非shutdown。
当client想要关闭它与server之间的连接,首先client这边会首先调用close函数,client端会发送一个FIN到server端,client端处于FIN_WAIT1状态。当server端返回给client ACK后,client处于FIN_WAIT2状态,server处于CLOSE_WAIT状态。
当server端检测到client端的关闭操作(read返回为0),server端也需要调用close操作,server端会向client端发送一个FIN。此时server的状态为LAST_ACK,当client收到来自server的FIN后,client端的套接字处于TIME_WAIT状态,它会向server端再发送一个ack确认,此时server端收到ack确认后,此套接字处于CLOSED状态。

Server端主动关闭的流程与Client端关闭类似,就不再多讲,下面还需要关注的是TIME_WAIT这个状态,分别按照client/server两个部分讲述。
首先说一下TCP/IP详解中描述的关于TIME_WAIT的描述及其存在的必要性:
主动关闭的socket当收到对端的FIN操作后,该socket就会处于TIME_WAIT状态,处于TIME_WAIT状态的socket会存活2MSL(Max Segment Lifetime),之所以存活这么长时间是有理由的:
一方面是可靠的实现TCP全双工连接的终止,也就是当最后的ACK丢失后,被动关闭端会重发FIN,因此主动关闭端需要维持状态信息,以允许它重新发送最终的ACK。
另一方面TCP在2MSL等待期间,定义这个连接(4元组)不能再使用,任何迟到的报文都会丢弃。设想如果没有2MSL的限制,恰好新到的连接正好满足原先的4元组,这时候连接就可能接收到网络上的延迟报文就可能干扰最新建立的连接。
当Client主动关闭时,正常情况下client的socket会经历TIME_WAIT的状态

连接在关闭的时候,双方都会有状态的迁移,这就要求我们的程序中一定要有比较完全的


   3. Server端的监听套接字与会话套接字的不同:

当server端的socket调用bind和listen之后,监听套接字的状态就会变为LISTEN状态,监听套接字的工作决定了它只是监听连接。
当server端调用accept,相当于从套接字的完成队列中取出一个client的连接,可以确定
四元组,即:client的IP和port;server的IP和port,双方各有一个套接字进行交互,这里需要说一下server端的socket,我称server端accept后产生的套接字为会话套接字,这个套接字一出生的状态就是ESTABLISH
由server端得四元组我们可以看出,一个server从理论上可以接收的连接数量取决于文件描述符的个数

 

4. 套接字关闭

一般来说,tcp正常关闭需要四个包。比如a和b关闭连接,a先给b发一个fin,b会进行确认ack,然后b也会发出fin,当a接受到这个fin,并发出最后一个ack后,就会处于time_wait状态。这个时间长短跟操作系统有关,一般会在1-4分钟,也就是两倍的数据包(2msl)最大生存时间。TCP主动关闭方采用TIME_WAIT主要是为了实现终止 TCP全双工连接的可靠性及允许老的重复分节在网络中消逝,等过了2msl(大约1~4分钟)后TIME_WAIT就会消失。   
TIME_WAIT状态的目的是为了防止最后a发出的ack丢失,让b处于LAST_ACK超时重发FIN


   所以说,主动发起关闭连接的一方会进入time_wait状态,这个时候,进程所占用的端口号不能被释放。除非在你的程序中用setsockopt设置端口可重用(SOCK_REUSE)的选项,但这不是所有操作系统都支持的


   解决TIME_WAIT的办法主要有以下几种:    


   1、修改LINGER值,缩短关闭时间
   LINGER    lingerStruct;
   lingerStruct.l_onoff    =    1;
   lingerStruct.l_linger     =    0;
   setsockopt(m_socket,SOL_SOCKET,SO_LINGER,(char *)&lingerStruct,sizeof(lingerStruct));
   不过这种办法不是很安全的,不过现在网络都很好啦,不会有问题的。

   2、修改注册表
   [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters]
   "TcpTimedWaitDelay"=dword:00000005
   这个值好像是300秒到30秒之间,改成30秒后你会发现TIME_WAIT很快就会消失了。


   3、禁用LINGER
   //如果你使用的是Socket API,可以这样
   BOOL bDontLinger=FALSE;      
   setsockopt(m_socket,SOL_SOCKET,SO_DONTLINGER,(LPCTSTR)&bDontLinger,sizeof(BOOL));
   closesocket(s);

   //如果你使用的是CAsyncSocket,需要响应的修改,例如禁用LINGER可以这样
   BOOL bDontLinger=FALSE;   
   m_socket->SetSockOpt(SO_DONTLINGER,(const char *)&bDontLinger,sizeof(bDontLinger),SOL_SOCKET);
   m_socket->Close();

   4、客户端可以不BIND(),这样,即使断开连接后再次连接,SOCKET将使用不同的端口(1025-5000),
   等几分钟后,原有的端口就会自动关闭。

关闭BITCOMET后系统出现的几个TCP状态

 

146Linux 网络编程2,创建服务器端客户端,socket,bind,listen,accept,connect,C/S模型-TCP,出错封装函数,TCP状态转换图,端口复用setsockopt 例如上一节的UDP段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03,地址1是0xe8,也就是先发0x03,再发0xe8,这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址存0xe8。发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。本质为内核借助缓冲区形成的伪文件。 阅读详情

相关推荐

基于SOCKECT的TCP的通信

能够实现基本的TCP的通信,并且具有图形化界面。

Sockect原理分析

SOCKET原理   套接字(socket)概念       套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。       应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程

李海明的博客 2121

TCP/IP Sockect通信

常用的TCP/IP Socket编程技术,不是很难,很容易看懂

Unix 网络编程:Socket 状态图&编程参数

Flags (9 bits) (aka Control bits) . Contains 9 1-bit flags书中对这个参数的描述是这样子的:根据书中描述, 这个参数比较模糊. 曾被定义为是上面两个队列之和的最大值. 源自 Berkeley 的实现, 给 增加了一个模糊因子: .不过, 不要把 设置为0, 如果你不想监听套接字, 那就关掉它. 版本支持的最大值为 5. 但当今许多系统允许修改该值.更多详细内容, 可以参考 在Linux中, 如果收到一个三次握手的 ACK 数据包并且 队列已经满了,

AI天才研究院 2万+

C#下Sockect的简易聊天室

搜集的关于C#编写简易聊天室的资料,欢迎补充出处及各资料来源

学习windows sockect 的好资料

学习windows sockect 的好资料 pdf格式。

Sockect 服务端与客户端(一对多)~音响小案例 【java基础-网络编程】

Sockect 服务端与客户端(一对多)~音响小案例 【java基础-网络编程】

伟庭的博客 920

快衰落、慢衰落,平坦衰落、频率选择性衰落

目录一、大尺度衰落和小尺度衰落二、平坦衰落和频率选择性衰落1.反射墙、固定天线模型2.相干带宽和时延扩展三、快衰落和慢衰落1.反射墙、运动天线模型2.相干时间和多普勒扩展四、联系总结 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、大尺度衰落和小尺度衰落 移动无线信道的主要特征是信道强度关于时间和频率的变化,大致分两种: 大尺度衰落: .

weixin_45662974的博客 3万+

TCP协议二:TCP状态转换(重要)

TCP状态转换图及分析

weixin_43200943的博客 1174

JLink版本不兼容?手把手教你解决APM32F003F6P6在Keil中烧写闪退和报错

本文详细解析了APM32F003F6P6在Keil中烧写闪退和报错的解决方案,重点介绍了JLink版本兼容性问题。通过实测不同版本组合,推荐使用JLink 7.20a或6.86b与Keil 5.25的黄金组合,并提供详细的降级驱动和工程配置步骤,帮助开发者高效解决烧写困境。

weixin_33694620的博客 416

图文并茂把Ubuntu22.04安装到u盘,实现即插即用

1、刚好打算把Ubuntu安装到u盘,随便记录下整个过程。 2、前提准备:u盘(我的是16g大小),Vmware虚拟机,Ubuntu镜像文件(可以去官网下载); 3、下面记录全过程: 1、打开虚拟机,并选择创建新的虚拟机: 2、选典型: ​ ...

子非鱼 1万+

TCP/socket状态转换及TCP服务端出现大量close_wait状态socket的原因

TCP、socket状态转换、出现大量close_wait状态socket的原因

qq_42323056的博客 1194

STK中的传感器与通信组件:雷达、发射机、接收机与天线的协同建模

本文深入解析了STK软件中传感器、雷达、发射机、接收机与天线的协同建模方法。通过构建一个完整的卫星对地数传系统实例,阐述了各组件如何分工协作,实现从几何指向到射频链路的高保真仿真,为复杂航天通信与探测系统的设计与分析提供了高效、灵活的解决方案。

weixin_29271263的博客 273

Winsock(7) TCP socket 状态转换过程

TCP socket 状态转换过程 编写Winsock程序时,你可以不知道TCP状态转换,但是如果你想知道Winsock API调用如何影响底层协议时,你需要知道它。本章将详解服务端、客户端建立以及退出时的 TCP SOCKET 状态转换情况。 TCP的状态转换过程即众所周知的TCP三次握手。 TCP socket服务端建立状态转换过程 所有socket都从 CLOSED 状态开始,当服务端soc...

?.?的专栏 797

使用.NET 免费开源包ViewFaceCore做一个人脸识别并注册的功能,没有比我更全的

本文介绍了一个基于WinForm的免费人脸识别系统实现方案。系统使用AForge和ViewFaceCore库,支持从USB或电脑自带摄像头采集图像,具备人脸注册和快速识别功能。硬件方面仅需普通摄像头,软件依赖多个NuGet包(如AForge.Video、ViewFaceCore等)。界面包含视频显示、图像预览和功能按钮控件,后台采用SQLServer存储用户面部特征数据。核心代码展示了人脸检测、特征提取和多线程处理逻辑,通过ViewFaceCore实现高效识别。系统具有识别速度快、准确率高的特点,适合Win

一个靠“吃代码”长大的程序猿,专治各种“Bug 饥饿症”。 817

AutoSAR系列讲解(实践篇)7.3-AppL在Dev中的配置(下)

接着讲解Dev中剩下的几个定义项

雪云飞星的博客 1万+

TCP(socket)状态转换时序图

说明: 1. 这张图分三部分,粗线(表示主动发起连接或释放连接方)、虚线(被动方)、细线(同时发生,典型如客户端和服务器同时发送FIN,来断开连接) 2. 连接进入TIME_WAIT状态后, 之所以要等2MSL(Linux系统中大概一分钟),是因为在发出ack后, 不确定对端是否有收到。如果没有收到,对端还会发送FIN,这时如果没有处于等待状态,而是直接进入CLOSED状态,那对端就会反复发送FIN。所以这个2MSL就是尽量确保对端有收到最后这个ack。 3. 重要的三个状态: ESTABLISHE.

Tom098的博客 1972

A2B V1.0协议学习笔记(A2B System Specification V1.0)

A2B全称是 Automotive Audio Bus 汽车音频总线,主要是解决传统音频总线线多、线重、成本贵等问题。本文是以A2B V1.0规范为准,现在ADI又推出了A2B V2.0,物理层不兼容,采用了QPSK编码方式,后续有时间再更新。A2B总线的优点:支持1主多从的架构(最多10个子节点)支持50Mbps(具体是49.152 Mbps)的高带宽传输以及

qflook的博客 4426

【UNP_socket编程】TCP连接建立与断开、TCP状态转换图

文章目录1.三次握手建立连接2.四次挥手断开连接3.TCP状态转换图 1.三次握手建立连接 2.四次挥手断开连接 3.TCP状态转换图

Eternally123的博客 363

C++ 小游戏程序 (共七款)

C++编程小游戏_闪耀的天狼星的博客-优快云博客_游戏c++C++跑酷小游戏_闪耀的天狼星的博客-优快云博客。好玩的c++编程小游戏,共六款。代码】C++跑酷小游戏。

小天狼星_布莱克 的博客 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

UNIX SOCKET编程概述

1 . Layered Model of Networking Socket 编程的层次模型如下图所示, 最上面是应用层,应用层下面的是 SOCKET API 层,再下面是传输层和网络层…… 实际上, Sockets API 层并不是一个真正定义的网络层次,但却很好的描述了 Socket 编程所处的位置和所扮演的角色。 TCP 状态转换图 2

fzubbsc的专栏 556

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

UNIX SOCKET编程简介

1  .  Layered Model of Networking Socket  编程的层次模型如下图所示,   最上面是应用层,应用层下面的是  SOCKET API  层,再下面是传输层和网络层……  实际上,  Sockets API  层并不是一个真正定义的网络层次,但却很好的描述了  Socket  编程所处的位置和所扮演的角色。 TCP  状态转换图   2  .什么是  SOCK...

weixin_34341229的博客 88

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Socket编程

socket可以看成是一种特殊的文件,所以可以通用“open--read/write--close”模式来操作。 socket()函数对应于普通的open()函数,用于创建一个socket。原型 intsocket(int domain, int type, int protocol); domain :协议域/协议族(family) type:指定socket类型 ...

a12274102的博客 174

php socket 编程

php socket 编程 1.实验预习:tcp协议 TCP协议的创建: 创建流程:1.客户端主动调用connect发送SYN分节;2.服务器端必须回复一个ACK分节来确认客户端的SYN分节,并发送一个SYN分节给客户端;3.客户端对服务器端发送SYN分节进行ACK分节的确认 TCP协议的拆除(TCP为全双工的传输协议,所以需要4次分节的交换): 拆除流程:1.首先申请拆除的一端调用cl...

王道长的技术博客 7929

如何优雅地关闭一个socket

最近在windows编程时需要考虑到“如何优雅地关闭一个socket”,查阅了一些资料,现将查到的相关资料做个汇编,希望能对后来者有所帮助(比较懒,所以英文资料没有翻译:-)) 1. 关闭Socket时究竟做了什么     关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况。前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测...

weixin_34228387的博客 226
上一篇: map
下一篇: socket 编程学习
dodo_check
博客等级 码龄19年 29粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值