TCP系列04—连接管理—3、TCP连接的半打开和半关闭
====================================================||
欢迎讨论技术的可以相互加微信:windgs (请备注csdn+xx职业)
====================================================||
目录
一、半开连接
二、半关连接
三、wireshrk抓包示例
1.TCP半开
2.TCP半关
补充说明:
在前面部分我们我们分别介绍了三次握手、四次挥手、同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接。TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全"来说的。
一、半开连接
从协议定义的角度来说,TCP的半开连接是指TCP连接的一端异常崩溃,或者在未通知对端的情况下关闭连接,这种情况下不可以正常收发数据,否则会产生RST(后面内容我们在介绍RST)。比如一个常见的情况是TCP连接的一端异常断电,就会导致TCP的半开连接。如果没有数据传输,对端就不会知道本端的异常而一直处于ESTABLISHED状态(TCP有存活检测机制,后面内容我们会进行介绍)。
另外从linux实现的角度来说,因为linux内部有个半连接队列,TCP半开连接是指发送了TCP连接请求,等待对方应答的状态,此时连接并没有完全建立起来,双方还无法进行通信交互的状态,此时就称为半连接。由于一个完整的TCP连接需要经过三次握手才能完成,这里把三次握手之前的连接都称之为半连接。
二、半关连接
TCP的半关连接是指TCP连接只有一方发送了FIN,另一方没有发出FIN包,仍然可以在一个方向上正常发送数据。这种场景并不常见,一般来说Berkeley sockets API调用shutdown()接口时候就会进入半关闭状态(调用常规的close()一般是期待完整的双向关闭这个TCP连接),shutdown()接口相当指示程序,本端已经没有数据待发送,所以我发送一个FIN到对端,但是我仍然想要从对端接收数据,直到对端发送一个FIN指示关闭连接为止。如下图所示,在红色背景文本框标注的数据传输场景下就是TCP的半关连接
三、wireshrk抓包示例
首先注意半开连接是不能正常传输数据的,而半关连接是可以在其中的一个方向上传输数据的。下面简单附一下wireshark的抓包图示,限于篇幅仅作简要介绍,详细请参考对应的wireshark抓包文件
1.TCP半开
通过单台笔记本的双无线网卡测试tcp连接的半开,步骤如下
server绑定网卡A的地址
client绑定网卡B的地址并连接server 对应截图中的No 1--No 3包
client发送"hello"消息 对应截图中的No 4包
server正常接收到后"hello"消息后 拔掉网卡A
kill掉server进程 使server的FIN消息不能发送到client
插上网卡A 注意在路由器中绑定IP地址和MAC地址,使得网卡A的地址和之前是一致的,此时client和server即处于半开连接状态
client向server发送"world"消息 对应截图中的No 6包
server回复rst消息
2.TCP半关
正常建立连接后,client首先发送"hello"消息给server,然后server发送FIN给client,关闭了server到client方向的数据传输,但是client仍然可以向server传输数据,此时client和server之间的连接即处于半关连接的状态,接下来client向server发送"world"消息,然后发送FIN给server关闭client到server方向的数据传输。
补充说明:
1.目前linux最新的实现已经没有半连接队列了,连接请求的pseudo sock已经插入ehash(e代表establish,ehash即已连接hash队列)中了 详情https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/net/ipv4/?id=079096f103faca2dd87342cca6f23d4b34da8871&context=3&ignorews=0&dt=1
TCP系列04—连接管理—3、TCP连接的半打开和半关闭相关推荐
- 计算机网络中TCP连接管理,计算机网络 TCP协议
TCP:面向连接的运输 TCP协议是面向连接的协议,把连接作为最基本的抽象.每一条TCP连接唯一的被通信两端的两个端点所确定.TCP协议是点对点,而不是点对多点.端点又被称为套接字,TCP协议规定,I ...
- TCP系列11—重传—1、TCP重传概述
在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接.可靠.字节流式.前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传. 很多网络 ...
- TCP协议-TCP连接管理
一.TCP概述 TCP协议是 TCP/IP 协议族中一个非常重要的协议.它是一种面向连接.提供可靠服务.面向字节流的传输层通信协议. TCP(Transmission Control Protocol ...
- gRPC-go源码(1):连接管理
gRPC-go源码(1):连接管理 1 写在前面 在这个系列的文章中,我们将会从源码的层面学习和理解gRPC. 整个系列的文章的计划大概是这样的:我们会先从客户端开始,沿着调用路径逐步分析到服务端,以 ...
- HTTP/1.1(消息格式、连接管理、条件请求、范围请求、缓存、身份验证)
文章目录 概述 消息格式 开始行 请求方法 请求目标 状态码 头部字段 消息体 连接管理 条件请求(Conditional Requests) 范围请求(Range Requests) 缓存(Cach ...
- SOFA 源码分析 — 连接管理器
前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络 ...
- 远程连接管理软件 v1.0
简介: 远程连接管理软件,支持远程桌面.RADMIN.SSH主机的管理,双击主机即可打开连接,RADMIN主机的右键菜单中加入完全控制.仅限查看.文件传送.远程关机多种功能,而且软件无联网功能,支持软 ...
- 物联网平台功能解析(一):“不赚钱”的连接管理平台
来源:物联网空间站 在万物互联阶段,海量数据得以积累,大数据.云计算.人工智能等技术将有用武之地,更多的物联网应用得以成熟并落地,最终,行业将缓慢走向万物智联的状态. 全球移动通信系统协会GSMA曾预 ...
- 用 subsetting 限制连接池中的连接数量
内网使用服务发现后,服务与其它服务的实例之间使用一条 TCP 长连接进行通信.这种情况下常见的做法是按照 registry 下发的 host:port 列表来直接建连. 简单来说就是下图这样: 每一个 ...
最新文章
- 如何在机器学习的框架里实现隐私保护?
- 凭着这把AutoML利剑,这家AI公司荣登 IEEE ISI“铁王座”
- 如何定位cpu占用率高的java线程
- Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes
- 利用STM32 的串口来发送和接收数据实验
- BEA WebLogic平台下J2EE调优攻略--转载
- webuploader结合php实现图片上传到本地和保存数据库
- 容斥原理应用(求1~r中有多少个数与n互素)
- [BZOJ4349]最小树形图
- 事件处理程序的执行上下文
- 程序员面向软件开发时,如何成功?
- C# async/await异步编程深入理解
- 我的Android进阶之旅------百度地图学习:BDLocation.getLocType ( )值分析
- ffplay的音视频同步分析
- Mybatis-代码走查问题整理
- openGL天空盒实现-立方体贴图
- 网易有道词典去广告版
- python unpack函数_python的struct.unpack函数
- Boostnote:适合程序员的笔记软件
- SVN Git GitHub Gitee GitLab区别
热门文章
- 基于Anycloud平台移植Zbar
- 求助:绿联USB2.0对拷线连接不上
- 金蝶KIS旗舰版:禁用的物料如何显示出来,进行反禁用
- 如何用 Siesta 编写 RESTful app
- 微型计算机硬件 电子器件,微型计算机的硬件组成.docx
- oracle日志保存时间设置,关于日志设置的详细介绍
- SQL学习_常用函数参考
- python单位根检验平稳性怎么看是否平稳_Python关于时间序列的平稳性检验
- 单服务台排队系统问题仿真
- python重量计算月球上的物体_Tensorflow.物体检测_资料(raccoon浣熊)