`
huchangan2005
  • 浏览: 78765 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

tcp

阅读更多
tcp状态:

LISTEN:侦听来自远方的TCP端口的连接请求

SYN-SENT:再发送连接请求后等待匹配的连接请求

SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认

ESTABLISHED:代表一个打开的连接

FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

FIN-WAIT-2:从远程TCP等待连接中断请求

CLOSE-WAIT:等待从本地用户发来的连接中断请求

CLOSING:等待远程TCP对连接中断的确认

LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED:没有任何连接状态


1.CLOSED:起始点,在超时或者连接关闭时候进入此状态。
2.LISTEN:svr端在等待连接过来时候的状态,svr端为此要调用socket, bind,listen函数,就能进入此状态。此称为应用程序被动打开(等待客户端来连接)。
3.SYN_SENT:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接,则直接进入CLOSED状态。
4.SYN_RCVD:跟3对应,服务器端接受客户端的SYN请求,服务器端由LISTEN状态进入SYN_RCVD状态。同时服务器端要回应一个ACK,同时发送一个SYN给客户端;另外一种情况,客户端在发起SYN的同时接收到服务器端得SYN请求,客户端就会由SYN_SENT到SYN_RCVD状态。
5.ESTABLISHED:服务器端和客户端在完成3次握手进入状态,说明已经可以开始传输数据了。
以上是建立连接时服务器端和客户端产生的状态转移说明。相对来说比较简单明了,如果你对三次握手比较熟悉,建立连接时的状态转移还是很容易理解。
接下来服务器端和客户端就进行数据传输。。。。,当然,里面也大有学问,就此打住,稍后再表。
下面,我们来看看连接关闭时候的状态转移说明,关闭需要进行4次双方的交互,还包括要处理一些善后工作(TIME_WAIT状态),注意,这里主动关闭的一方或被动关闭的一方不是指特指服务器端或者客户端,是相对于谁先发起关闭请求来说的:
6.FIN_WAIT_1:主动关闭的一方,由状态5进入此状态。具体的动作时发送FIN给对方。
7.FIN_WAIT_2:主动关闭的一方,接收到对方的FIN ACK,进入此状态。由此不能再接收对方的数据。但是能够向对方发送数据。
8.CLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作时接收到FIN,同时发送ACK。
9.LAST_ACK:被动关闭的一方,发起关闭请求,由状态8进入此状态。具体动作时发送FIN给对方,同时在接收到ACK时进入CLOSED状态。
10.CLOSING:两边同时发起关闭请求时,会由FIN_WAIT_1进入此状态。具体动作是,接收到FIN请求,同时响应一个ACK。
11.TIME_WAIT:最纠结的状态来了。从状态图上可以看出,有3个状态可以转化成它,我们一一来分析:
a.由FIN_WAIT_2进入此状态:在双方不同时发起FIN的情况下,主动关闭的一方在完成自身发起的关闭请求后,接收到被动关闭一方的FIN后进入的状态。
b.由CLOSING状态进入:双方同时发起关闭,都做了发起FIN的请求,同时接收到了FIN并做了ACK的情况下,由CLOSING状态进入。
c.由FIN_WAIT_1状态进入:同时接受到FIN(对方发起),ACK(本身发起的FIN回应),与b的区别在于本身发起的FIN回应的ACK先于对方的FIN请求到达,而b是FIN先到达。这种情况概率最小。
关闭的4次连接最难理解的状态是TIME_WAIT,存在TIME_WAIT的2个理由:
1.可靠地实现TCP全双工连接的终止。
2.允许老的重复分节在网络中消逝。


TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接。这和前面讲到的协议完全不同。前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编程的角度来说,UDP编程也要简单的多----UDP都不用考虑数据分片。
书中用telnet登陆退出来解释TCP协议连接的建立和中止的过程,可以看到,TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做四次握手。
1.连接的建立
在建立连接的时候,客户端首先向服务器申请打开某一个端口(用SYN段等于1的TCP报文),然后服务器端发回一个ACK报文通知客户端请求报文收到,客户端收到确认报文以后再次发出确认报文确认刚才服务器端发出的确认报文(绕口么),至此,连接的建立完成。这就叫做三次握手。如果打算让双方都做好准备的话,一定要发送三次报文,而且只需要三次报文就可以了。
可以想见,如果再加上TCP的超时重传机制,那么TCP就完全可以保证一个数据包被送到目的地。
2.结束连接
TCP有一个特别的概念叫做half-close,这个概念是说,TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个FIN为1的TCP报文,然后服务器返回给客户端一个确认ACK报文,并且发送一个FIN报文,当客户机回复ACK报文后(四次握手),连接就结束了。
3.最大报文长度
在建立连接的时候,通信的双方要互相确认对方的最大报文长度(MSS),以便通信。一般这个SYN长度是MTU减去固定IP首部和TCP首部长度。对于一个以太网,一般可以达到1460字节。当然如果对于非本地的IP,这个MSS可能就只有536字节,而且,如果中间的传输网络的MSS更佳的小的话,这个值还会变得更小。
4.TCP的状态迁移图
书P182页给出了TCP的状态图,这是一个看起来比较复杂的状态迁移图,因为它包含了两个部分---服务器的状态迁移和客户端的状态迁移,如果从某一个角度出发来看这个图,就会清晰许多,这里面的服务器和客户端都不是绝对的,发送数据的就是客户端,接受数据的就是服务器。
4.1.客户端应用程序的状态迁移图
客户端的状态可以用如下的流程来表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
以上流程是在程序正常的情况下应该有的流程,从书中的图中可以看到,在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1,FIN_WAIT_2等状态,这些状态的迁移就是前面提到的结束连接的四次握手。
4.2.服务器的状态迁移图
服务器的状态可以用如下的流程来表示:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的ACK包才能进入初始的状态。
4.3.其他状态迁移
书中的图还有一些其他的状态迁移,这些状态迁移针对服务器和客户端两方面的总结如下


LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开连接的嘛。
SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态调整到SYN收到状态,准备进入ESTABLISHED
SYN_SENT->CLOSED,在发送超时的情况下,会返回到CLOSED状态。
SYN_收到->LISTEN,如果受到RST包,会返回到LISTEN状态。
SYN_收到->FIN_WAIT_1,这个迁移是说,可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关闭。
4.4.2MSL等待状态
书中给的图里面,有一个TIME_WAIT等待状态,这个状态又叫做2MSL状态,说的是在TIME_WAIT2发送了最后一个ACK数据报以后,要进入TIME_WAIT状态,这个状态是防止最后一次握手的数据报没有传送到对方那里而准备的(注意这不是四次握手,这是第四次握手的保险状态)。这个状态在很大程度上保证了双方都可以正常结束,但是,问题也来了。
由于插口的2MSL状态(插口是IP和端口对的意思,socket),使得应用程序在2MSL时间内是无法再次使用同一个插口的,对于客户程序还好一些,但是对于服务程序,例如httpd,它总是要使用同一个端口来进行服务,而在2MSL时间内,启动httpd就会出现错误(插口被使用)。为了避免这个错误,服务器给出了一个平静时间的概念,这是说在2MSL时间内,虽然可以重新启动服务器,但是这个服务器还是要平静的等待2MSL时间的过去才能进行下一次连接。
4.5.FIN_WAIT_2状态
这就是著名的半关闭的状态了,这是在关闭连接时,客户端和服务器两次握手之后的状态。在这个状态下,应用程序还有接受数据的能力,但是已经无法发送数据,但是也有一种可能是,客户端一直处于FIN_WAIT_2状态,而服务器则一直处于WAIT_CLOSE状态,而直到应用层来决定关闭这个状态。
5.RST,同时打开和同时关闭
RST是另一种关闭连接的方式,应用程序应该可以判断RST包的真实性,即是否为异常中止。而同时打开和同时关闭则是两种特殊的TCP状态,发生的概率很小。
6.TCP服务器设计
前面曾经讲述过UDP的服务器设计,可以发现UDP的服务器完全不需要所谓的并发机制,它只要建立一个数据输入队列就可以。但是TCP不同,TCP服务器对于每一个连接都需要建立一个独立的进程(或者是轻量级的,线程),来保证对话的独立性。所以TCP服务器是并发的。而且TCP还需要配备一个呼入连接请求队列(UDP服务器也同样不需要),来为每一个连接请求建立对话进程,这也就是为什么各种TCP服务器都有一个最大连接数的原因。而根据源主机的IP和端口号码,服务器可以很轻松的区别出不同的会话,来进行数据的分发。
  • 大小: 87.5 KB
  • 大小: 101.9 KB
  • 大小: 31.7 KB
  • 大小: 23 KB
  • 大小: 19.7 KB
分享到:
评论

相关推荐

    TCP-IP技术大全

    IP和相关协议 第9章 IP协议家族 77 9.1 TCP/IP模型 77 9.1.1 解剖TCP/IP模型 78 9.1.2 协议组件 78 9.2 理解网际协议(IP) 79 9.2.1 IPv4结构 79 9.2.2 IP做什么 80 9.3 理解传输控制协议...

    TCP.rar_28335 IP TCP_tcp 通信

    标题中的"TCP.rar_28335 IP TCP_tcp 通信"可能是指一个关于TCP/IP通信的资源包,其中包含了一些与TCP相关的代码或文档,文件编号可能是"28335"。描述中提到"已经验证过了,可以编译通过",这表明这是一个实际操作过...

    MODBUS-TCP.rar_TCP通信标准_modbus TCP_modbus 标准_modbus-tcp_modbus标准

    MODBUS-TCP是一种广泛应用于工业自动化领域的通信协议,它基于标准的TCP/IP协议栈,将MODBUS协议与网络层的TCP(传输控制协议)相结合,实现了设备间的远程通信。MODBUS-TCP允许不同制造商的设备在以太网或任何其他...

    TCP调试助手源码_tcp助手源码_TCP助手源代码_TCP助手源码_

    TCP调试助手源码是一款专为IT专业人士设计的工具,它帮助开发者深入了解TCP协议的工作机制,同时也为TCP编程提供了一个实践平台。源代码的开放性使得用户可以深入学习TCP协议的实现细节,理解网络通信的基本原理,并...

    android TCP server 和TCP client通信源码

    在Android平台上进行网络通信时,TCP(Transmission Control Protocol)是一种常用的方式,因为它提供了一种可靠的、面向连接的数据传输服务。本示例中的"android TCP server 和TCP client通信源码"着重于实现...

    TCP服务端和TCP客户端工具软件

    在IT领域,网络通信是计算机系统之间交换信息的基础,而TCP(Transmission Control Protocol)作为传输层协议,是网络通信的核心部分。本篇文章将详细探讨TCP服务端和TCP客户端的概念、工作原理以及常用的工具软件。...

    tcp_TCP/IP_tcp_vb.net_VB.NET.tcp_

    本项目名为"tcp_TCP/IP_tcp_vb.net_VB.NET.tcp_",显然,它是一个使用VB.NET语言实现的TCP/IP通信示例。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它的主要...

    tcp转发工具,中转TCP请求

    TCP转发工具是一种网络工具,主要用于将TCP连接从一个端点重定向到另一个端点,它在许多场景下都非常有用,比如穿透内网限制、代理服务、数据加密等。本项目提供的是一套用Java语言编写的TCP请求中转解决方案,旨在...

    TCP和MODBUS-TCP通讯调试软件

    在IT行业中,网络通信是至关重要的一个领域,TCP(传输控制协议)和MODBUS-TCP则是其中两个常见的通信协议。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,而MODBUS-TCP是在TCP/IP协议栈上构建的一种...

    TCP测试工具(TCP Test Tool)

    TCP/IP协议是互联网通信的基础,它定义了网络设备如何交换数据和定位网络资源。TCP(传输控制协议)和IP(互联网协议)是该协议族的两个核心组件,负责端到端的数据传输。UDP(用户数据报协议)则是另一种常用协议,...

    TCP2ComV1串口转TCP工具

    《TCP2ComV1:串口到TCP的通信桥梁》 在现代的计算机通信领域,TCP(Transmission Control Protocol)和串口(Serial Port)是两种常见的通信方式。TCP以其高可靠性、面向连接的特性,广泛应用于互联网通信;而串口...

    tcptrace TCP端口监听工具

    **TCP端口监听工具——tcptrace** 在IT行业中,网络通信是不可或缺的一部分,而TCP(传输控制协议)作为互联网协议栈中的重要一环,其工作状态直接影响到应用层服务的稳定性和效率。tcptrace是一款强大的TCP端口...

    TCP&UDPDebug_tcpudpdebug_tcp_TCP_UDpdebug_UDP_测试工具_

    TCP(Transmission Control Protocol)与UDP(User Datagram Protocol)是互联网协议中的两种主要传输层协议,它们在计算机网络通信中扮演着至关重要的角色。本测试工具专注于帮助开发者在创建网络通信程序时,对TCP...

    TCP2Com-标签版V1.2.9.1免费好用的串口转TCP工具

    一个串口转TCP的程序,能很好的满足远程串口传输、调试需求,功能如下: 1.支持打开物理串口和虚拟串口(不创建虚拟串口,但能打开其他工具创建的虚拟串口)。 2.支持通过TCP客户端连接到远程TCP服务器。 3.支持TCP...

    Modbus TCP和TCP通信测试工具

    Modbus TCP和TCP通信是工业自动化领域中广泛使用的通信协议,尤其在PLC(可编程逻辑控制器)之间进行数据交换时。本主题将深入探讨这两种通信方式及其在测试中的应用,特别是针对西门子SMART S7-200 PLC。 首先,让...

    VB(TCP-IP).rar_TCP服务器_VB TCP IP _VB TCP/IP_tcp_vb客户服务器

    标题中的"VB(TCP-IP).rar_TCP服务器_VB TCP IP VB TCP/IP_tcp_vb客户服务器"表明这是一个关于使用Visual Basic(VB)进行TCP/IP通信的教程,特别关注TCP服务器的实现以及VB客户端和服务器之间的交互。这个压缩包可能...

    uip+tcp_client+tcp_server

    标题中的“uip+tcp_client+tcp_server”指的是一个基于uIP协议栈的TCP客户端和服务器端程序。uIP是一个轻量级的TCP/IP协议栈,适用于资源有限的嵌入式设备,比如微控制器驱动的物联网设备。在这个项目中,我们有两个...

    Modbus TCP_modbustcpplc_ab1756modbustcp_modbusTCP_ab_PLCMODBUS_源

    标题中的“Modbus TCP_modbustcpplc_ab1756modbustcp_modbusTCP_ab_PLCMODBUS_源”关键词表明了这个压缩包是关于使用Modbus TCP协议与Allen Bradley(AB)PLC进行通信的资源集合。描述中提到的“AB PLC MODBUS TCP ...

    labview TCP发送报文,TCP调试助手,断线自动连接

    1. **TCP通信基础**:LabVIEW提供了丰富的TCP/IP函数库,如`TCP Open.vi`用于建立连接,`TCP Write.vi`用于发送数据,`TCP Read.vi`用于接收数据,以及`TCP Close.vi`用于关闭连接。理解这些函数的工作原理是进行TCP...

    三菱Q内置以太网MODBUS TCP示例_三菱Q内置以太网MODBUSTCP示例_modbus_modbusTCP_

    本示例主要探讨的是如何利用三菱Q内置的以太网模块进行MODBUS TCP通信,这是一种广泛应用的工业通讯协议,它允许不同设备之间通过以太网交换数据。以下是对这些知识点的详细说明: 首先,我们需要理解MODBUS协议。...

Global site tag (gtag.js) - Google Analytics