TCP三次握手四次挥手

TCP握手过程和挥手过程     TCP报文首部 源端口和目的端口,各占2个字节,分别写入源端口和目的端口; 序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始; 确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段... 阅读详情


我们之前在 传输层协议TCP与UDP 中详细介绍了UDP协议和TCP协议格式以及他们各自的特点,我们知道TCP协议是面向连接的,那面向连接就得需要做建立连接,维护连接,断开连接这些工作,其实大家都听过TCP三次握手建立连接,四次挥手断开连接,那我们今天就来具体看看,TCP到底是如何三次握手和四次挥手的。

服务器状态转换
[CLOSED->LISTEN] 服务器调用listen后就进入LISTEN状态,等待客户端向自己发起连接
[LISTEN->SYN_RCVD] 一旦监听到连接请求(同步报文段),就会将该连接放入内核中维护的连接等待队列中,并向客户端发送SYN+ACK报文确认已收到看客户端的连接请求
[SYN_RCVD->ESTABLISHED] 服务器一旦收到了客户端的确认报文,就进入ESTABLISHED状态,就可以进行读写数据了
[ESTABLISHED->CLOSE_WAIT] 当客户端主动关闭连接(调用close),服务器收到客户端发送的结束报文段FIN,服务器向客户端返回确认收到关闭连接的报文后,就会进入CLOSE_WAIT
[CLOSE_WAIT->LAST_ACK] 当服务器进入CLOSE_WAIT状态时,说明服务器已经开始准备关闭连接(但是需要先处理完之前的数据),当服务器真正调用close关闭连接时,会向客户端发送FIN报文,自己则进入LAST_ACK状态,等待最后一个ACK的到来(这里的ACK是指客户端对于服务器发送的FIN的响应报文)
[LAST_ACK->CLOSED] 服务器收到了客户端对FIN报文的响应ACK,至此服务器关闭连接成功
客户端状态转换
[CLOSED->SYN_SEND] 客户端调用connect,向服务器发送同步报文段,表示想与服务器建立连接,自己进入SYN_SEND状态等待服务器的响应
[SYN_SEND->ESTABLISHED] connect调用成功,客户端收到服务器的响应报文ACK,进入ESTABLISHED状态,可以读写数据
[ESTABLISHED->FIN_WIAT_1] 客户端主动调用close,向服务器发送结束报文段,自己进入FIN_WAIT_1状态,等待服务器的响应
[FIN_WAIT_1->FIN_WAIT_2]客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2状态,开始等待服务器的结束报文段
[FIN_WAIT_2 -> TIME_WAIT] 客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出对服务器发送的结束报文的的响应 LAST_ACK;
[TIME_WAIT -> CLOSED] 客户端要等待一个2MSL(Max Segment Life, 报文最大生存时间)的时间, 才会进入CLOSED状态(因为要防止服务器没有收到LASK_ACK,需要进行重发的情况).
TCP状态转换图


TCP中常见的面试题
为什么是三次握手,不是一次或者两次
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
两次握手还可能造成服务器资源的浪费,怎么说呢,再举个栗子,假设今天C向S发送了一个连接请求,并等待S的响应,S给C发送ACK之后,就认为连接已经建立,我们知道连接建立之后是需要维护这个连接的,此时S的操作系统就需要分配资源和空间来维护这个连接,那假设S给C的响应丢失了,C并未收到响应则认为连接没有建立成功,不能正常通信,此时S维护的连接就是一个失败的连接,不能成功通信,那假设今天由100万个客户端向S这个服务器发送连接请求,结果都没有收到响应,此时S就维护了100万个无用的连接,浪费服务器的资源
为什么是三次握手,四次挥手
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到Server端所有的报文都发送完了,所有的数据也处理完了之后,Server端才能发送FIN报文表示自己能够断开连接,因此不能一起发送。故需要四步握手。

如果已经建立了连接,但是客户端突然出现故障了怎么办?
答:TCP连接是有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

为什么会有TIME_WAIT状态
现在做一个测试,首先启动server,然后启动client,然后用Ctrl-C使server终止,这时马上再运行server, 结果是:


这是因为,虽然server的应用程序终止了,但TCP协议层的连接并没有完全断开,因此不能再次监 听同样的server端口.我们用netstat命令查看一下:


TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待两个MSL(maximum segment lifetime)的时间后才能回到CLOSED状态.
我们使用Ctrl-C终止了server, 所以server是主动关闭连接的一方, 在TIME_WAIT期间仍然不能再次监听同样的server端口;
MSL在RFC1122中规定为两分钟,但是各操作系统的实现不同, 在Centos7上默认配置的值是60s;
可以通过 cat /proc/sys/net/ipv4/tcp_fin_timeout 查看msl的值
我们来想一想,为什么TIME_WAIT的时间是2MSL

MSL是TCP报文的最大生存时间, 因此TIME_WAIT持续存在2MSL的话
就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据, 但是这种数据很可能是错误的);
同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN. 这时虽然客户端的进程不在了, 但是TCP连接还在, 仍然可以重发LAST_ACK);
解决TIME_WAIT状态引起的bind失败的方法
在server的TCP连接没有完全断开之前不允许重新监听, 某些情况下可能是不合理的

服务器需要处理非常大量的客户端的连接(每个连接的生存时间可能很短, 但是每秒都有很大数量的客户端来请求).

这个时候如果由服务器端主动关闭连接(比如某些客户端不活跃, 就需要被服务器端主动清理掉), 就会产生大量TIME_WAIT连接.

由于我们的请求量很大, 就可能导致TIME_WAIT的连接数很多, 每个连接都会占用一个通信五元组(源ip,源端口, 目的ip, 目的端口, 协议). 其中服务器的ip和端口和协议是固定的. 如果新来的客户端连接的ip和端口号和TIME_WAIT占用的链接重复了,就会出现问题.

使用setsockopt() 设置socket描述符的 选项SO_REUSEADDR为1, 表示允许创建端口号相同但IP地址不同的多个socket描述符


加上了setsockopt之后,ctrl+c终止服务器之后也可以马上启动服务器

————————————————
版权声明:本文为优快云博主「CXYhh121」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/chenxiyuehh/article/details/100146419

TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手 文章目录TCP介绍三次握手四次挥手滑动窗口拥塞避免算法 TCP介绍 三次握手 四次挥手 阅读详情

相关推荐

TCP三次握手,四次挥手问题总结

TCP三次握手,四次挥手问题总结 文章目录TCP三次握手,四次挥手问题总结TCP三次握手,四次挥手解释TCP协议基础TCP服务模型TCP头部状态转换为什么要“三次握手,四次挥手”三次握手四次挥手扩展可以了解的知识: TCP三次握手,四次挥手解释 SYN 包:建立连接请求的包 FIN 包:切断TCP 连接的包 ACK 包:针对SYN 包和FIN 包的确认应答包 1、TCP 的特点及其目的: (1)...

qq_22121229的博客 1339

TCP四次挥手过程详解

深入解析tcp四次挥手

欢迎指正、交流 7147

飞塔防火墙CVE-2022-40684漏洞复现:手把手教你搭建靶场环境(附调试技巧)

本文详细指导如何搭建Fortinet飞塔防火墙CVE-2022-40684认证绕过漏洞的靶场环境,涵盖虚拟机部署、网络配置、调试模式开启及漏洞原理分析。通过手把手教程,读者可掌握漏洞复现与深度调试技巧,深入理解该认证绕过漏洞的利用与防御。

h6i7j8的博客 695

TCP协议中的三次握手和四次挥手 状态图

建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示: 1.jpg 先来看看如何建立连接的: 2.png 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发送报文,并分配资源,这样TCP连接就建立了。 如何断开连接呢?简单的过程如下: 3.png...

phone1126的专栏 9733

红外热成像仪原理及应用

目录什么是红外热成像背景介绍热成像技术原理热成像分类红外热成像和夜视仪之间的区别红外热像仪夜视仪红外照明相机对比红外热像仪都能看透什么如何选择制冷型和非制冷型红外热像仪制冷型红外热像仪非制冷型红外热像仪实例对比成像速度空间分辨率灵敏度光谱滤波同步何如选择合适的红外热像仪像素测温范围和被测物温度分辨率空间分辨率温度稳定性热像仪的距离系数比常见热成像仪关键参数量程视场角 (FOV)红外分辨率热灵敏度(NETD)焦距光谱范围精度内置优化分析NTED(热灵敏度)什么是NETD如何测量NETD?NETD如何影响测量?

zhy295006359的博客 2万+

手把手用瑞萨E1仿真器调试RH850 CAN通信:从报文收发到底层寄存器监控

本文详细介绍了使用瑞萨E1仿真器调试RH850 CAN通信的全过程,包括硬件连接、CS+开发环境配置、CAN控制器寄存器解析以及双通道网关实战开发。通过实战案例和错误诊断技巧,帮助开发者快速掌握RH850F1L的RS-CAN控制器应用,提升车载网络开发效率。

weixin_30919429的博客 163

深入浅出TCP四次挥手 (多图详解)

多图详解,深入浅出TCP四次挥手

林深不见鹿 的博客 3万+

ros_control硬件接口实战:从零构建机器人控制框架

本文详细介绍了ros_control硬件接口在机器人控制框架中的核心作用与实践方法。通过解析硬件接口类型、实现标准接口、构建主控制循环及自定义功能扩展,帮助开发者从零构建高效的机器人控制系统,提升硬件与ROS的协同效率。

lstm7chronicler的博客 500

计算机网络-传输层篇-TCP的四次挥手

计算机网络-传输层篇-TCP的四次挥手

汤键的博客 2199

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4162

【深度学习】手把手教你在远程服务器上跑 YOLOv3 相关代码(含环境配置)

这篇文章主要记录了如何配置项目环境以及如何在远程服务器上跑 YOLOv3 模型。

作者正在煮茶中... 2383

TCP 三次握手和四次挥手

TCP 三次握手和四次挥手

We choose to go to the moon in this decade and do the other things, not because they are easy, but beacase they are hard. 2万+

大数据领域数据架构的工业互联网数据架构设计

工业互联网作为第四次工业革命的重要驱动力,正在深刻改变传统制造业的生产方式和商业模式。本文旨在探讨工业互联网环境下的大数据架构设计,重点解决工业数据采集、传输、存储、处理和分析等关键环节的技术挑战。工业互联网数据架构的核心组件大数据技术在工业场景下的应用数据治理和质量控制边缘计算与云计算的协同架构背景介绍:建立基本概念和问题域核心架构:详细解析工业互联网数据架构技术实现:通过代码和数学模型展示关键技术实践案例:展示真实场景应用工具资源:推荐实用开发工具和学习资源。

软件工程实践的博客 855

TCP三次握手和四次挥手

如果不了解TCP报文的格式可以点击这里 三次握手 第一次握手:由客户端主动发起连接建立请求,发送数据包,将SYN置为 1 ,通常叫做发送SYN包,并且随机产生一个值:seq = J,然后将数据包发送给服务端,客户端进入SYN_SENT状态,等待服务端的确认 第二次握手: 服务端收到SYN报文,对该报文进行回复,将报文的标志位SYN和ACK都置为 1 ,确认应答序号ack = J + 1,同样随机产生一个值seq = K,将数据报发送给客户端,服务端进入SYN_RCVD的状态 第三次握手: 客户端接收到数据包

duxinyu的博客 2555

Linux V3H 平台开发系列讲解(摄像头)2.3.1 MAX96912 MAX96717 GMSL1 CSI 2lane配置

​ 单路摄像头,数据流类型YUV422, mipi接口,经过MAX96717 串行器,gmsl1链路 到解串器MAX96712,最后mipi csi 2lane(lane0 lane1)输出到 renesa v3h soc开发板; ​

xian18809311584的博客 580

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TCP的三次握手、四次挥手

TCP三次握手与四次挥手;为什么要等2MSL;拔网线后TCP连接还存在吗?TCP与UDP的区别几应用场景;SYN报文什么情况下会被丢弃; TCP如何提高传输效率 什么是滑动窗口机制? 服务端不进行accept接收新连接,那么最多可以有多少个连接建立成功? TCP的序号一定是从0开始吗? 通过三次握手最多可以建立多少个TCP连接

qzt__l0ve的博客 3408

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TCP 三次握手四次挥手

三次握手的关键是要确认对方收到了自己的数据包 ,这个目标就是通过“确认号(Ack)”字段实现的。计算机会记录下自己发送的数据包序号Seq,待收到对方的数据包后,检测“确认号(Ack)”字段, 看 Ack = Seq + 1 是否成立,如果成立说明对方正确收到了自己的数据包 。

路星辞*的博客 2508

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TCP的三次握手和四次挥手实现过程。以及为什么需要三次握手?四次挥手?

TCP连接的三次握手和四次挥手实现原理

weixin_51380508的博客 6001

详解TCP三次握手四次挥手

详解TCP三次握手四次挥手 1.TCP报文格式 在了解三次握手和四次挥手之前,先知道TCP报文内部包含了哪些东西。 TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。TCP在发送数据前必须在彼此间建立连接,这里连接意思是:双方需要内保存对方信息(例如:IP,Port…) 报文主要段的意思 序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编...

nigar_的博客 2543

TCP三次握手和四次挥手过程

TCP三次和四次挥手过程1、TCP报文段首部2、TCP三次握手过程及常见问题2.1 TCP三次握手过程2.2 常见问题2、TCP四次挥手过程及问题2.1 TCP四次挥手过程2.2 常见问题 1、TCP报文段首部          要理解TCP三次握手和四次挥手的过程,首先需要了解TCP报文段的某些首部的含义...

weixin_39754631的博客 1589

TCP协议——三次握手和四次挥手

理解tcp三次握手、四次挥手及相关问题

Dirty_artist的博客 1488

TCP的三次握手和四次挥手

一、三次握手 三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包 主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备 过程如下: 第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN©,此时客户端处于 SYN_SENT 状态 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,为了确认客户端的 SYN,将客户端的 ISN+1作为.

Silvia 9564

TCP三次握手,四次挥手

相信大家比较常回答的是:“因为三次握手才能保证双方具有接收和发送的能力。这回答是没问题,但这回答是片面的,并没有说出主要的原因。在前面我们知道了什么是TCP 连接用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。所以,重要的是为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。接下来,以三个方面分析三次握手的原因:三次握手才可以阻止重复历史连接的初始化(主要原因)三次握手才可以同步双方的初始序列号。

qq_62097431的博客 1404
上一篇: TCP 三次握手和四次挥手面试题
下一篇: 解决CLOSE_WAIT、TIME_WAIT等连接状态过多的问题
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值