18 TCP连接的建立与中止

TCP 连接状态详解  一个TCP连接的过程中,会经历一系列的状态变化,这些变化包括: LISTEN,SYN_SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT,CLOSED。其中CLOSED是一个虚构的状态,因为CLOSED的TCP连接的TCB(Transmission 阅读详情

TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。这和前面讲到的协议完全不同。前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编程的角度来说,UDP编程也要简单的多----UDP都不用考虑数据分片。

书中用telnet登陆退出来解释TCP协议连接的建立和中止的过程,可以看到,TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。

1.连接的建立

在建立连接的时候,客户端首先向服务器申请打开某一个端口(用SYN段等于1的TCP报文),然后服务器端发回一个ACK报文通知客户端请求报文收到,客户端收到确认报文以后再次发出确认报文确认刚才服务器端发出的确认报文(绕口么),至此,连接的建立完成。这就叫做三次握手。如果打算让双方都做好准备的话,一定要发送三次报文,而且只需要三次报文就可以了。

可以想见,如果再加上TCP的超时重传机制,那么TCP就完全可以保证一个数据包被送到目的地。

2.结束连接

TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN为1的TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。

3.最大报文长度

在建立连接的时候,通信的双方要互相确认对方的最大报文长度(MSS),以便通信。一般这个SYN长度是MTU减去固定IP首部和TCP首部长度。对于一个以太网,一般可以达到1460字节。当然如果对于非本地的IP,这个MSS可能就只有536字节,而且,如果中间的传输网络的MSS更佳的小的话,这个值还会变得更小。

4.TCP的状态迁移图

书P182页给出了TCP的状态图,这是一个看起来比较复杂的状态迁移图,因为它包含了两个部分---服务器的状态迁移和客户端的状态迁移,如果从某一个角度出发来看这个图,就会清晰许多,这里面的服务器和客户端都不是绝对的,发送数据的就是客户端,接受数据的就是服务器。

4.1.客户端应用程序的状态迁移图

客户端的状态可以用如下的流程来表示:

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

以上流程是在程序正常的情况下应该有的流程,从书中的图中可以看到,在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前面提到的结束连接的四次握手。

4.2.服务器的状态迁移图

服务器的状态可以用如下的流程来表示:

CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的ACK包才能进入初始的状态。

4.3.其他状态迁移

书中的图还有一些其他的状态迁移,这些状态迁移针对服务器和客户端两方面的总结如下

  1. LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开连接的嘛。
  2. SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态调整到SYN收到状态,准备进入ESTABLISHED
  3. SYN_SENT->CLOSED,在发送超时的情况下,会返回到CLOSED状态。
  4. SYN_收到->LISTEN,如果受到RST包,会返回到LISTEN状态。
  5. SYN_收到->FIN_WAIT_1,这个迁移是说,可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关闭。
4.4.2MSL等待状态

书中给的图里面,有一个TIME_WAIT等待状态,这个状态又叫做2MSL状态,说的是在TIME_WAIT2发送了最后一个ACK数据报以后,要进入TIME_WAIT状态,这个状态是防止最后一次握手的数据报没有传送到对方那里而准备的(注意这不是四次握手,这是第四次握手的保险状态)。这个状态在很大程度上保证了双方都可以正常结束,但是,问题也来了。

由于插口的2MSL状态(插口是IP和端口对的意思,socket),使得应用程序在2MSL时间内是无法再次使用同一个插口的,对于客户程序还好一些,但是对于服务程序,例如httpd,它总是要使用同一个端口来进行服务,而在2MSL时间内,启动httpd就会出现错误(插口被使用)。为了避免这个错误,服务器给出了一个平静时间的概念,这是说在2MSL时间内,虽然可以重新启动服务器,但是这个服务器还是要平静的等待2MSL时间的过去才能进行下一次连接。

4.5.FIN_WAIT_2状态

这就是著名的半关闭的状态了,这是在关闭连接时,客户端和服务器两次握手之后的状态。在这个状态下,应用程序还有接受数据的能力,但是已经无法发送数据,但是也有一种可能是,客户端一直处于FIN_WAIT_2状态,而服务器则一直处于WAIT_CLOSE状态,而直到应用层来决定关闭这个状态。

5.RST,同时打开和同时关闭

RST是另一种关闭连接的方式,应用程序应该可以判断RST包的真实性,即是否为异常中止。而同时打开和同时关闭则是两种特殊的TCP状态,发生的概率很小。

6.TCP服务器设计

前面曾经讲述过UDP的服务器设计,可以发现UDP的服务器完全不需要所谓的并发机制,它只要建立一个数据输入队列就可以。但是TCP不同,TCP服务器对于每一个连接都需要建立一个独立的进程(或者是轻量级的,线程),来保证对话的独立性。所以TCP服务器是并发的。而且TCP还需要配备一个呼入连接请求队列(UDP服务器也同样不需要),来为每一个连接请求建立对话进程,这也就是为什么各种TCP服务器都有一个最大连接数的原因。而根据源主机的IP和端口号码,服务器可以很轻松的区别出不同的会话,来进行数据的分发。

掌握本章的状态迁移图才是学习本章的关键。

TCP有限状态机(全网最全) TCP状态转换图 TCP的11种状态: CLOSED:初始时没有任何连接的状态。 LISTEN:服务器监听来自客户端的连接请求(SYN包)。 SYN_SENT:客户端socket执行CONNECT连接,发送SYN包,之后等待来自服务器的SYN ACK包(服务器的连接请求和对客户端连接请求的确认)。 SYN_RCVD:服务端收到客户端的SYN包并发送服务端SYN ACK包,之后等待客户端对连接请求的确认(ACK包)。 ESTABLISH:表示连接建立。客户端发送了最后一个ACK包后进入此状态. 阅读详情

相关推荐

TCP状态机与重传机制详解

而接收方会根据接收到的数据包的序列号来判断是否有丢失的数据,如果有丢失的数据,就会要求发送方进行重传。TCP的重传机制是为了保证数据的可靠传输。FIN_WAIT_2(等待对方关闭连接请求状态):表示TCP连接的一方等待对方发送关闭连接请求。LAST_ACK(最后确认状态):表示TCP连接的一方接收到对方的关闭连接请求后发送最后的确认。TIME_WAIT(等待状态):表示TCP连接关闭后的等待状态,用于确保数据的可靠传输。CLOSE_WAIT(等待关闭状态):表示TCP连接的一方接收到对方的关闭连接请求。

ZynCobol的博客 503

windows日志查出警告“TCP/IP 无法建立传出连接 ID4227

所有设备不能与服务器通讯,windows日志查出警告“TCP/IP 无法建立传出连接,事件ID4227”。服务器是windows server 。 TCP/IP 无法建立传出连接,因为选定的本地终结点最近用于连接到相同的远程终结点。 当以高速率打开和关闭传出连接时,会导致所有可用的本地端口被使用,并迫使 TCP/IP 重新使用本地端口进行传出连接,此时通常会产生这种错误。为了最大限度地降低数 据受到损坏的风险,在给定的本地终结点和给定的远程终结点之间的连续连接中, TCP/IP 标准需要等待一段最短的时

yn_duan的博客 1万+

ST-CNN实战:用Python实现交通流量预测(附完整代码)

本文详细介绍了如何利用时空卷积神经网络(ST-CNN)进行交通流量预测的实战过程。通过Python和PyTorch,从数据预处理、构建邻接矩阵,到ST-CNN核心模块的代码实现与模型训练,提供了完整的解决方案,帮助开发者掌握处理时空序列数据的核心算法。

rust6ferris的博客 926

《TCP/IP详解》读书笔记(18章)-TCP连接的建立与中止

TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须在双方之间建立一条连接。这种两端间连接的建立与无连接协议UDP不同,UDP向另一端发送数据报时,无需任何预告的握手。1.建立连接的协议(3次握手)1)请求端发送一个SYN段指明客户端打算连接的服务器端口,以及初始序列号。2)服务器发回包含服务器的初始序号的SYN报文段作为应答。同时将确认序号设置为客户的ISN加1以对客户的SYN报文

上善若水,水善利万物而不争。 3757

DRV2605L触觉驱动芯片实战指南:从自动校准到音频转触觉应用

触觉反馈技术是现代人机交互的核心组成部分,它通过精确控制振动马达来模拟物理触感,广泛应用于智能手机、游戏手柄和汽车触摸屏等领域。其原理在于将电信号转化为机械振动,关键在于如何高效、精准地驱动不同类型的马达(如ERM和LRA)。这项技术的核心价值在于提升交互的真实感和沉浸感。在工程实践中,集成驱动芯片如DRV2605L通过内置智能反馈引擎和自动校准功能,解决了传统驱动方式响应慢、效果不一致的难题。它特别适用于需要高质量触觉反馈的应用场景,例如消费电子、游戏外设和车载信息娱乐系统。其中,自动校准能自适应优化驱动

weixin_42631411的博客 342

VSCode连接SAP ABAP开发环境

本文介绍了使用VSCode连接ABAP开发环境的详细步骤。首先通过SICF或SMICM事务码获取ABAP连接地址,然后安装ABAP remote filesystem插件。提供了两种创建连接的方法:通过命令面板逐步配置(输入服务器地址、账号、系统标识等)或直接编辑JSON配置文件。最后通过命令面板选择已创建的连接即可完成连接,连接成功后可在VSCode左侧工作区查看ABAP系统内容进行开发。JSON配置方式更为简便推荐。整个流程帮助开发者摆脱复杂的Eclipse配置,实现快速便捷的ABAP开发环境搭建。

weixin_45293769的博客 2215

《TCP/IP具体解释》读书笔记(18章)-TCP连接的建立与中止

TCP是一个面向连接的协议。不管哪一方向还有一方发送数据之前。都必须在两方之间建立一条连接。这样的两端间连接的建立与无连接协议UDP不同。UDP向还有一端发送数据报时,无需不论什么预告的握手。1.建立连接的协议(3次握手)1)请求端发送一个SYN段指明client打算连接的serverport,以及初始序列号。2)server发回包含server的初始序号的SYN报文段作为应答。同一时候将确认...

weixin_30485799的博客 112

2024年上市公司ESG评级全解析:六大权威数据源横向对比与应用指南

本文深度解析2024年国内主流ESG评级数据源,包括华证、商道融绿、Wind、富时罗素和彭博,横向对比其覆盖范围、评分逻辑与应用侧重点。文章提供实战指南,帮助投资者与企业根据投资决策、风险管理和学术研究等不同场景,精准选择并有效应用ESG数据,实现从概念到实用分析工具的转变。

weixin_29229055的博客 312

TCP/IP协议详解-18章TCP连接的建立与终止读书笔记part1

@[TOC](这里写自定义目录标题) TCP连接的建立与终止-读书笔记part1 TCP连接的中止与建立 Part1 引言 TCP建立的连接,其实就是在发送和接收的两端各自维系的一个连接的状态。在这个基础上进行重传等可靠性保证的处理。与UDP作对比,UDP是无连接的。 连接的建立与终止 使用tcpdump观察 telnet一个服务器上的某个服务时的报文交互。 3次握手 解释协议头...

暗推中... 237

“三进制”bonsai27b+NInfer=6g显存闪电侠(token真的自由了!)

本文将1.58-bit三元大模型Bonsai27B成功移植至NInfer推理引擎,并在RTX 4080 SUPER上实现100+ token/s的极速推理。通过自研补丁扩展NInfer支持Ada架构与三元量化格式,解决激活布局、行置换等关键bug,实测PPL 6.445,单流吞吐达96.7–130.8 t/s,20题基准得分16/20。附完整复现包(含文档、工具、源码补丁),零权重分发,助力垃圾显卡跑通27B级模型。

shensanshu的博客 1万+

SAP RAP 里的 EML 全解:从语言定位到事务语义,再到真实案例的落地方式

摘要:EML(Entity Manipulation Language)是ABAP RAP模型的核心组件,作为ABAP的子集用于操作业务对象(BO)。它通过声明式语法(READ/MODIFY/EXECUTE/COMMIT)统一访问BO的行为与数据,并由RAP运行时自动处理校验、锁定、草稿管理等生命周期。EML将业务语义融入代码,确保与Fiori应用共享同一套校验逻辑,并通过FAILED/REPORTED/MAPPED管道传递错误与消息。其事务控制(IN LOCAL MODE与COMMIT ENTITIES)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 528

lwip无法连接指定个数TCP连接问题

如题,一次测试中发现,lwip的TCP连接控制块明明设置为26,设备作为服务器,电脑作为客户端去连接,但当连接19个之后发现再连接TCP时,机器自动发送RST数据包,通过追踪发现是因为资源分配不足,tcp_alloc失败,后面看到一篇文章,是因为lwip的内存堆使用太小,本人使用的是rt-thread,apm32f407,最后发现是因为程序使用了110KB,总内存是128,所以给rtt只有18KB,内存堆过小。收到正确的 ACK 标志后,回调 accept 函数,表示有新的连接建立。

qq_40831436的博客 1661

55、磁吸附爬壁机器人运动仿真与位置控制

本文针对大型船舶喷涂作业中人工操作存在的高风险与低效率问题,提出一种基于麦克纳姆轮的磁吸附爬壁机器人运动控制方案。通过建立Adams虚拟样机与MATLAB/Simulink控制系统的联合仿真模型,设计了速度和位置双闭环控制系统,采用模糊PI控制器优化速度响应,并引入位置反馈补偿重力引起的垂直偏移。研究结果表明,模糊PI控制器在响应速度、超调抑制和位置稳定性方面优于传统PI控制器,且位置反馈能有效校正横向移动中的下坠现象,尤其在跨越焊缝等复杂工况下仍可保持稳定运行,显著提升了爬壁机器人的运动精度与作业可靠性。

linux6sysadmin的博客 168

netty 你的主机中的软件中止了一个已建立的连接_对Netty的一些理解

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持。作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也是基于Netty的NIO框架构建。Netty 利用 Java 高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 构建一个客户端/服务端,其具有高并发、传输快、...

weixin_39628160的博客 1078

中台战略-第五章、中台建设方法论

文章目录第五章、中台建设方法论5.1 中台架构整体策略5.2 业务顶层设计5.3 业务中台设计方法论5.3.1 能力支撑是基础5.3.2 中心自治是承载形式5.3.3 3层模型是骨架5.3.4 5步法是指导思想1. 业务抽象2. 高阶设计3. 组件建模4. 开发交付5. 持续运营5.4 数据中台设计方法论5.4.1 总体规划5.4.2 数据集成5.4.3 模型建设5.4.4 通用研发5.4.5 资产管理5.4.6 数据服务5.5 应用向中台迁移的3中途径和方法5.5.1 方法1:新应用替换旧应用5.5.2

沧海之巅的专栏 1461

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

18、TCP连接三次握手的过程,为什么是三次,可以是两次或者更多吗【高频】

TCP连接三次握手的过程,为什么是三次,可以是两次或者更多吗

2402_84438596的博客 570

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TCP协议里的时间

一、建立连接 在发送SYN报文段后,如果在75秒没有收到相应相应,连接建立将中止。这个时间也就是阻塞connect系统调用的超时时间。 二、保活 SO_KEEPALIVE选项保持连接检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP连接的输入。设置该选项后,如果2小时内在此套接口的任一方向都没有数据交换,TCP就自动给对方 发一个保持存活探测分节(keepalive probe...

kimi's blog 1324

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

在Azure中使用Load Runner测试TCP最大并发连接数

对于Azure中的每一台虚机,它所能支持的TCP最大并发连接数是50万(参考微软官网: http://azure.microsoft.com/en-us/documentation/articles/azure-subscription-service-limits/#networkinglimits)。在绝大部分情况下,应用程序不会触及这一限制,从而感觉不到这个限制的存在。但是,在一些极端情

微软云计算:Microsoft Azure 中文博客(优快云镜像博客) 2832

TCP/IP详解学习笔记

 TCP/IP详解学习笔记[http://blog.youkuaiyun.com/goodboy1881/category/204448.aspx?PageNumber=2]TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议     摘要:TCP/IP协议中最核心的IP协议,实际上非常的单纯,只是简单的承载数据,并不保证送达。    ——点击此处阅读全文

visame的专栏 7451

西门子连接id_西门子PLC的TCP通讯(不同项目下)①--TSEND_C指令

西门子PLC的TCP通讯(不同项目下)①--TSEND_C指令本期说一下,不同项目下的,连个西门子1200的TCP通讯,这次我们用TSEND_C和TRCV_C组合使用,这次先了解下TSEND_C指令是大概啥样的1.0 从右边指令栏--通信--开放式用户通讯--其他,选择TSEND_C拖动到程序1中,如下图2.0 下面说下具体这个指令块的参数设置REQ:指的是上升沿触发,发送作业,跟建立通讯无关,这...

weixin_39865952的博客 1993

FTP再学习 (四)

<!--google_ad_client = "pub-5143338080895292";/* 728x90, created 4/10/08 */google_ad_slot = "8165396160";google_ad_width = 728;google_ad_height = 90;//--> <script type="text/javascript"

OpenBSD 咨询与维护 1832

BGP邻居建立过程及报文详解

      BGP邻居建立过程及报文详解BGP是基于TCP的,要建立邻居首先得建立TCP连接,所以要保证邻居地址可达,可以利用IGP协议来完成邻居的连通性。所以我们在R1和R2上分别配置静态路由完成邻居连通性R1:iproute10.10.10.10255.255.255.255192.168.1.2R2:iproute1.1.1.1255.255.255.2...

weixin_34179968的博客 1143
上一篇: 17 TCP协议概述
下一篇: unix网络编程环境
otuhacker
博客等级 码龄18年 21粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值