unp第七章补充之TCP半开连接与半闭连接
半打开(Half-Open)连接和半关闭(Half-Close)连接。TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全"来说的。
英文写法是:Full-Duplex Transmissions
是指交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的交换机都支持全双工。
全双工的好处在于迟延小,速度快。
与之对应的是【半双工】这个概念:就是指一个时间段内只有一个动作发生,举个简单例子,一天窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种
情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是实行半双工的产品。随着技术
的不断进步,半双工会逐渐退出历史舞台。
在串行通信中,数据通常是在两个站(如终端和微机)之间进行传送,按照数据流的方向可分成三种基本的传送方式:全双工、半双工、和单工.但单工目前已很少采用,下面仅介绍前两种方式.
1 、全双工方式( full duplex )
当数据的发送和接收分流,分别由两根不同的传输线传送时,通信双方都能在同一时刻进行发送和接收操作,这样的传送方式就是全双工制.在全双工方式下,通信
系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送.全双工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对
那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利.这种方式要求通讯双方均有发送器和接收器,同时,需要 2
根数据线传送数据信号.(可能还需要控制线和状态线,以及地线).
比如,计算机主机用串行接口连接显示终端,而显示终端带有键盘.这样,一方面键盘上输入的字符送到主机内存;另一方面,主机内存的信息可以送到屏幕显示.
通常,往键盘上打入 1
个字符以后,先不显示,计算机主机收到字符后,立即回送到终端,然后终端再把这个字符显示出来.这样,前一个字符的回送过程和后一个字符的输入过程是同时
进行的,即工作于全双工方式.
2 、半双式方式( half 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队列)中了
unp第七章补充之TCP半开连接与半闭连接的更多相关文章
- unp第七章补充之socket tcp 产生 rst响应的情况
socket tcp 产生 rst响应的情况(属于硬错误) 1. syn发送到服务器主机,但是目的端口并未运行.则产生一个ECONRFUSED错误.客户端立即返回.比如telnet 192.1 ...
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...
- 网络操作系统 第七章 管理TCP/IP网络
本章小结 本章介绍了TCP/IP的相关概念,并且在此处基础上,介绍了Windows Server 2008中使用TCP/IP网络配置工具实现网络连接和管理的方法,在Linux系统中,讲解了是如何使用图 ...
- 第七章 TCP和UDP原理
一.引入 1.TCP/IP协议族的传输层协议主要包括TCP和UDP 2.TCP是面向连接的可靠的传输层协议.它支持在并不可靠的网络上实现面向连接的可靠的数据传输 3.UDP是无连接的传输协议,主要用于 ...
- UNP——第五章,TCP客户/服务程序
tcpser void str_echo(int sockfd) { long arg1, arg2; ssize_t n; char line[MAXLINE]; for ( ; ; ) { if ...
- 读《编写可维护的JavaScript》第七章总结
第七章 事件处理 7.1 典型用法 作者首先给了个我们一个处理事件的方法.看起来也没啥俩样,不过后来给出的优化方法很值得学习: // 不好的写法 function handleClick(even ...
- Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧
第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...
- IDEA第七章----插件
idea的另一个可爱之处,就是它的强大的插件,下面我以CodeGlance插件为例,这个可以快速定位代码 第一节:安装插件 ● All plugins 显示所有插件. ● Enabled 显示当前所有 ...
- 《python for data analysis》第七章,数据规整化
<利用Python进行数据分析>第七章的代码. # -*- coding:utf-8 -*-# <python for data analysis>第七章, 数据规整化 imp ...
随机推荐
- python中字符串(str)的常用处理方法
str='python String function' 生成字符串变量str='python String function' 字符串长度获取:len(str)例:print '%s length= ...
- android 线程间的通信
(转自:http://www.cnblogs.com/allin/archive/2010/05/19/1738800.html) andriod提供了 Handler 和 Looper 来满足线程间 ...
- nginx expires配置
配置expiresexpires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入 1 ...
- ZOJ1363 Chocolate
Chocolate Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge In 2100, ACM chocolat ...
- jfinal如何获取参数为数组的值
前台: var postParams = { ids:["qw","ew"]}; 后台: String[] userids = this.getParaValu ...
- mysql rowid实现
) a, b b表是数据表
- 利用 bugly 分析应用崩溃
Bugly-Crash监控能让我们及时的掌控应用的Crash,并快速修复.这种情况就在于我们把应用发布出去了,但是用户那边有着各种各样我们想象不到的系统崩溃,我们无法通过简单的控制台捕获错误信息和崩溃 ...
- Linux 常用命令标记
1.linux 服务器之间拷贝文件 scp 本地用户名@IP地址:文件名1 远程用户名@IP地址:文件名2 该命令可以变型为目的服务器204上输入如下命令:红色部分是需要接受目的地,-r是递归复制该文 ...
- 170809、 把list集合中的数据按照一定数量分组
/** * @Desc : 切分list位多个固定长度的list集合(我这是业务需要,直接是1w条数据切分) * @Author : RICK * @Params: [historyList] * @ ...
- Oracle字符串连接的方法
Oracle数据库中,使用“||”进行字符串连接,下面就让我们一起了解一下Oracle数据库中字符串连接的方法,希望对您能有所帮助. 和其他数据库系统类似,Oracle字符串连接使用“||”进行字符串 ...