半打开(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半开连接与半闭连接的更多相关文章

  1. unp第七章补充之socket tcp 产生 rst响应的情况

    socket tcp 产生 rst响应的情况(属于硬错误) 1.     syn发送到服务器主机,但是目的端口并未运行.则产生一个ECONRFUSED错误.客户端立即返回.比如telnet 192.1 ...

  2. ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

    ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...

  3. 网络操作系统 第七章 管理TCP/IP网络

    本章小结 本章介绍了TCP/IP的相关概念,并且在此处基础上,介绍了Windows Server 2008中使用TCP/IP网络配置工具实现网络连接和管理的方法,在Linux系统中,讲解了是如何使用图 ...

  4. 第七章 TCP和UDP原理

    一.引入 1.TCP/IP协议族的传输层协议主要包括TCP和UDP 2.TCP是面向连接的可靠的传输层协议.它支持在并不可靠的网络上实现面向连接的可靠的数据传输 3.UDP是无连接的传输协议,主要用于 ...

  5. UNP——第五章,TCP客户/服务程序

    tcpser void str_echo(int sockfd) { long arg1, arg2; ssize_t n; char line[MAXLINE]; for ( ; ; ) { if ...

  6. 读《编写可维护的JavaScript》第七章总结

      第七章 事件处理 7.1 典型用法 作者首先给了个我们一个处理事件的方法.看起来也没啥俩样,不过后来给出的优化方法很值得学习: // 不好的写法 function handleClick(even ...

  7. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...

  8. IDEA第七章----插件

    idea的另一个可爱之处,就是它的强大的插件,下面我以CodeGlance插件为例,这个可以快速定位代码 第一节:安装插件 ● All plugins 显示所有插件. ● Enabled 显示当前所有 ...

  9. 《python for data analysis》第七章,数据规整化

    <利用Python进行数据分析>第七章的代码. # -*- coding:utf-8 -*-# <python for data analysis>第七章, 数据规整化 imp ...

随机推荐

  1. MySQL的ALTER变更、正则查询、分组查询、排序查询以及事务查询的概

    MySQL的表和字段信息的变更 ALTER TABLE table-name DROP column-name; #删除某个字段 ALTER TABLE table-name ADD column-n ...

  2. 2015.7.12js-11(DOM基础)

    1.childNodes,获取子节点,本身就是一个数组,可以通过下标childNodes[i]来获取某个子节点. alert(obj.childNodes.length); //高级浏览器会有空白节点 ...

  3. C# 批量上传

    完整例子下载 效果: 前台: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="d ...

  4. Logstash自带正则表达式

    USERNAME [a-zA-Z0-._-]+ USER %{USERNAME} INT (?:[+-]?(?:[-]+)) BASE10NUM (?<![-.+-])(?>[+-]?(? ...

  5. wpgcms---碎片管理的使用

    这里很神奇的是碎片管理是编辑器,所以拿到的配置都是富文本,所以在前台作为字段来使用的时候,需要过滤掉字符串. 具体示例: {% set qq = wpg.fragment.get("qq&q ...

  6. 转Python SciPy库——拟合与插值

    1.最小二乘拟合 实例1 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq p ...

  7. Maven 搭建 SSM框架——Spring+SpringMVC+Mybatis的搭建教程

    一:概述 SSM框架在项目开发中经常使用到,相比于SSH框架,它在仅几年的开发中运用的更加广泛. Spring作为一个轻量级的框架,有很多的拓展功能,最主要的我们一般项目使用的就是IOC和AOP.Sp ...

  8. 【vue】vue.js安装教程/vue项目搭建

    前提:已安装nodejs——npm  (备注教程  “物理安装”  ) 第一步:建了一个managerSys文件夹,用于保存项目 第二步:从cmd进入该文件夹,之后开始安装vue.js相关 1)在该项 ...

  9. OpenCV学习笔记之课后习题练习3-3

    3.3 创建一个100*100的拥有三个通道的二维字节类型矩阵,将其元素全部置0.通过cvPtr2D函数将指针指向中间通道(绿色),以(20,5)和(40,20)为顶点间画一个绿色的长方形. cvPt ...

  10. SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改)

    SQL Fundamentals || Oracle SQL语言 1.表的基本操作 (CREATE TABLE, DROP TABLE,TRUNCATE TABLE, RENAME tablename ...