Tcp连接的七次握手浅析

连接的三次握手

  1. 客户端向服务器发送SYN请求
  2. 服务器发送ACK回应请求,并同时发送一个SYN的请求给客户端
  3. 客户端回应ACK应答

关闭的四次握手

对于关闭流程,一共有三种情况:客户端主动关闭,服务器端主动关闭,客户端和服务器端同时主动关闭。这里仅仅以客户端主动关闭为例列出下图。

  1. 客户端主动关闭,发送FIN请求
  2. 服务器回应ACK应答
  3. 服务器被动关闭,发送FIN请求
  4. 客户端回应ACK应答

对于关闭流程,服务器端和客户端是对等的地位,其它两种场景处理过程类似。需要注意的是,由于对端是是可以主动关闭的,因此在代码中需要加上被动关闭的响应流程。

为什么连接和关闭握手次数不一样

看到上述流程,可能有一个疑问:为什么连接和关闭的握手次数不一样?其实,不论是连接还是关闭,客户端和服务器端都是发送了一次请求(SYN/FIN),回应了一次应答(ACK),它们是对称的。但是,在连接的时候服务器端的请求和应答是在一次握手中同时完成的,而关闭的时候却是分两次完成的,所以就造成了连接和关闭的握手次数不对称。

现在,新问题又来了:为什么连接时复用一次握手,而关闭的时候不复用握手?这个则是因为连接和关闭的行为不是一样所造成的。

  • 在连接过程中,客户端是主动连接,服务器端是被动连接,这个顺序是确定了的,因此,可以复用第二次握手。
  • 在关闭的过程中,客户端和服务器端可能同时主动关闭,此时就不能复用第二次握手了,因此请求和应答需要单独的发送。

Tcp连接的状态迁移图

前面只考虑了理想的情况,在实际的过程中,可能还需要处理一些异常操作,如下则是一个完成的TCP连接的状态迁移图。

半打开连接和半关闭连接

如前所述,建立或关闭一个连接时需要三或四步的,在这个过程中,TCP连接则会处于一个半打开或半关闭状态。例如,前面状态图中的FIN_WAIT_1和FIN_WAIT_2就是半关闭状态。

一般来说,半连接只是一个暂停的过程。但是,在一些异常的情况的时候(如远端主机故障)的时候常常会造成半关闭连接,由于Tcp连接处于半打开或半关闭状态的时候,仍然会占用相应的端口资源,尤其对于http之类的海量服务来说,会造成大量端口被占用,会造成资源的浪费。

另外,有的程序也针对Tcp协议的这一特征来恶意进行网络攻击。例如,对于一个服务器,大量的恶意客户端建立连接后,既不发请求,也不close套接字,这种情况下服务器如何保护自己呢。因为如果听之任之的话,大量的恶意连接会耗尽服务器的可用描述符,导致服务器不能服务。就算服务器主动close,如果客户端不close的话,那么这个连接还是不能完全释放。对于服务器来说,需要增加相应的机制进行半连接的处理。

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

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

相关文章

与副交流后总结

昨天和几个项目刚刚上线的3位管理者向副总汇报了一下项目总结,或者是交流(老板直接说是轻松一点的交流) 我的总结主要部分: 亮点: •从可行性研究到最后的上线,思路还算清晰•共好的项目组,同事的有力支持•…

探讨float类型的数值,为什么两个float不能直接相等

转载:http://blog.csdn.net/turkeyzhou/article/details/2755970 在程序编写的时候,我们会忽略一些细节上的问题,尤其是写java这种高级语言,久而久之,我们会对底层缺乏认识,这也是为什么前段时间会有人说j…

android ifw 启动广告,使用 IFW 完全控制 Android 应用行为 | 实用技巧

我们常说 Android 系统最大的优点是开放性与包容性,但这也造成了应用行为不容易掌控的缺点。特别是国内应用与系统,失去了谷歌 Play 商店官方的应用审核政策后普通用户根本无法确定应用获取的权限用来干什么,又在后台执行了哪些行为。谷歌最近…

VS2022安装教程和使用说明来了

我看很多小伙伴已经开始迫不及待的安装VS2022了,虽然我也安装了VS2022,但是我依旧使用VS2019。因为我觉得适合我的才是最好的,并非是最新的,所以大家在使用的时候,根据实际需求选择开发工具,不要一味追求最…

华为交换机RRPP配置实验

在工作中遇到了H3C和HW的RRPP配置,以下就以华为模拟器再作一次实验。大家共同来论讨论遇到的问题。 【理论基础】RRPP具体的理论见配置手册下面只点几个容易出错的地方1、作为RRPP环的接口要关闭STP2、两个重要的命令:control-vlan vlan-id命令&#xff…

Android之AIDL服务

AIDL服务 服务(Service)是android系统中非常重要的组件。Service可以脱离应用程序运行。也就是说,应用程序只起到一个启动Service的作用。一但Service被启动,就算应用程序关闭,Service仍然会在后台运行。 andro…

男人的那些统一话术......

1 当面试官来租你的房子▼2 好家伙(via.dy油画艺术)▼3 学到了(素材来源网络,侵删)▼4 一杯奶茶能加多少料▼5 原来我们如此优秀!(素材来源网络,侵删)▼6 幼儿园里卧…

后端开发者开发前端必会的工具(一):样式调试篇

又来为大家分享干货了,今天主要是分享一点关于后端工程师开发前端比较苦恼的一个问题《如何去调试前端?》,我相信这是所有后端开发者比较困惑的,如果有这个困惑的,记得关注“程序员晓晓”公众号,并给我留言…

C#编程中的66个好习惯,你有多少个?(转)

http://www.cnblogs.com/jxsoft/archive/2012/01/11/2318824.html转载于:https://www.cnblogs.com/ein-key5205/p/3592583.html

sqlite数据库的char,varchar,text,nchar,nvarchar,ntext的区别

1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。 2、VARCHAR。存储变长数据,但存储效率没有CHA…

配置 mybatis的 log4j.properties

log4j.rootLoggerdebug,stdout,logfile### 把日志信息输出到控制台 ### log4j.appender.stdoutorg.apache.log4j.ConsoleAppender #log4j.appender.stdout.TargetSystem.err log4j.appender.stdout.layoutorg.apache.log4j.SimpleLayout### 把日志信息输出到文件:jb…

linux 下 oracle 10.2.0.1 32bit netca报错

现象如下: 今天一同事安装完数据库软件运行netca创建监听时报错(运行netmgr与dbca均可执行成功), 报错信息: [oracleWEB01A bin]$ netca Oracle Net Services Configuration: # # An unexpected error has been detected by HotSpot Virtual Machine:…

adb android源码分析,Android源码分析(十六)----adb shell 命令进行OTA升级

一: 进入shell命令界面adb shell二:创建目录/cache/recoverymkdir /cache/recovery 如果系统中已有此目录,则会提示已存在。三: 修改文件夹权限chmod -R 777 /cache/recovery四: 把ota文件路径写入/cache/recovery/command文件中echo "--update_pac…

如何使用cURL获得请求和响应时间?

✎ 码甲说 hello,老伙计们,又有半个多月没见了,今天给大家分享一个干货编程小技巧,上至架构师、下至开发者、运维男、QA, 得此利器,事半功倍。cURL在我的眼里,就是一个httpClient手办&#xff…

ASP.NET MVC CheckBoxFor为什么会生成hidden input控件

自己开发的公众号&#xff0c;可以领取淘宝内部优惠券 Html.CheckBoxFor(m > m.Bool) 使用CheckBoxFor方法得到的html代码会是下面这个样子 <input checked"checked" data-val"true" data-val-required"Bool 字段是必需的。" id"Bool…

Android Caused by: java.lang.IllegalArgumentException: column '_id' does not exist

出错原因&#xff1a;在查询整个sqlite数据库时&#xff0c;没有查询到 "_id" 这一列。 原来的代码是&#xff1a;mSQLiteDatabase.query(table_name, new String[] {_title}, null, null, null, null, null); 修改后的代码为&#xff1a;mSQLiteDatabase.query(ta…

linux挂载iso文件

mount -o loop -t iso9660 /root/winxp.iso /mnt 转载于:https://blog.51cto.com/xitong/1148436

android 远程调试工具,Android远程调试的探索与实现

文章来源&#xff1a;美团点评技术团队作为移动开发者&#xff0c;最头疼的莫过于遇到产品上线以后出现了bug&#xff0c;但是本地开发环境又无法复现的情况。常见的调查线上棘手问题方式大概如下&#xff1a;方法优点缺点联系用户安装已添加测试日志的APK方便定位问题需要用户…