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

TCP/IP连接状态图

 
阅读更多

转自:http://drupal.leanmt.com/?q=node/120

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.其他状态迁移

书中的图还有一些其他的状态迁移,这些状态迁移针对服务器和客户端两方面的总结如下

1. LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开连接的嘛。
2. SYN_SENT->SYN收到,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态 调整到SYN收到状态,准备进入ESTABLISHED
3. SYN_SENT->CLOSED,在发送超时的情况下,会返回到CLOSED状态。
4. SYN_收到->LISTEN,如果受到RST包,会返回到LISTEN状态。
5. 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和端口号码,服务器可以很轻松的区别出不同的会话,来进行数据的分发。

掌握本章的状态迁移图才是学习本章的关键。

分享到:
评论

相关推荐

    labview利用TCP/IP协议与PLC交互.zip

    "labview程序.pdf"则可能是关于如何在LabVIEW中建立TCP/IP连接并设计交互界面的指南。LabVIEW中可以使用“TCP/IP Socket”函数库来创建客户端或服务器端的应用程序,与PLC建立连接。用户可能需要学习如何设置IP地址...

    图解TCP/IP协议

    TCP状态转移图详细描述了TCP连接从建立到结束的整个过程,包括CLOSED(起始状态)、LISTEN(服务端等待连接状态)、SYN_SENT(客户端发起连接状态)、SYN_RCVD(服务器接收客户端的SYN请求状态)等不同状态及其转移...

    TCP/IP状态迁移图

    TCP连接状态迁移图是TCP/IP协议栈中非常重要的一个概念。理解这些状态和触发状态改变的事件对于网络编程和故障排查都至关重要。通过这个状态迁移图,开发者可以更好地理解和预测TCP连接的行为,确保网络通信的可靠性...

    笑傲江湖解释TCP/IP协议

    《笑傲江湖》是金庸先生的一部武侠小说,这里将其与TCP/IP协议相结合,用生动的形象来解释网络通信中的关键技术。TCP/IP协议是互联网的基础,它定义了数据在网络中的传输方式。本篇将深入探讨TCP/IP协议的第三层,即...

    修改tcp/ip连接数工具

    标题中的“修改TCP/IP连接数工具”是指一种能够调整计算机操作系统中TCP/IP协议栈的最大并发连接数量的软件。TCP/IP连接数是指同一时间一个系统可以同时维持的网络连接的最大数量,这个值通常由操作系统默认设置,但...

    TCP-IP协议族(第4版)中文高清带标签目录.PDF

    它解释了TCP/IP协议如何在全球范围内连接各种不同的计算机网络,形成一个庞大的信息交换系统。 2. **OSI模型**:开放系统互连(OSI)模型是一种概念性的分层网络模型,包括物理层、数据链路层、网络层、传输层、...

    基于TCP/IP的网络围棋

    在基于TCP/IP的网络围棋中,服务器作为数据交换的中心,接收并处理来自各个客户端的连接请求和棋局数据。 网络编程是实现基于TCP/IP的应用程序的关键,包括创建服务器和客户端程序。服务器端通常使用socket监听特定...

    TCP/IP详解 卷1完整版

    18.6 TCP的状态变迁图 182 18.6.1 2MSL等待状态 183 18.6.2 平静时间的概念 186 18.6.3 FIN_WAIT_2状态 186 18.7 复位报文段 186 18.7.1 到不存在的端口的连接请求 187 18.7.2 异常终止一个连接 187 18.7.3 检测半...

    linux实验——TCP/IP网络接口配置.doc

    在Linux环境中,TCP/IP网络接口配置是管理员必备的技能之一。本实验主要涵盖了以下几个关键知识点: 1. **网络接口配置**: - 使用`ifconfig`命令查看网络接口的状态,如IP地址、子网掩码、广播地址等信息。 - ...

    java版飞鸽传书 TCP/IP连接

    Java版的飞鸽传书是基于TCP/IP协议实现的一款文件传输程序,它允许用户通过网络在不同的设备之间发送和接收文件。TCP/IP(Transmission Control Protocol/Internet Protocol)是一组通信协议,构成了互联网的基础,...

    网络协议TCP/IP实验五 ICMP 协议分析实验

    - 按照网络拓扑图连接好设备。 - **网络拓扑**: 一台锐捷R1760路由器连接2台PC机。 ##### 步骤2: 完成配置 - 完成路由器和PC1、PC2的相关配置。 ##### 步骤3: 截获报文 - 分别在PC1和PC2上运行Ethereal开始截获...

    Linux下用GTK开发基于TCP/IP的网络聊天室

    客户端则需要连接到服务器,创建一个socket并保持连接状态,以便随时发送和接收数据。 GTK与TCP/IP通信的集成,意味着我们需要在GTK事件循环中插入TCP通信的逻辑。例如,可以为发送按钮设置一个回调函数,当用户...

    WinCE下的TCP/IP及动态曲线测试程序(VS2005环境下编译通过)

    客户端则需要主动发起连接请求,并保持连接状态以便进行数据传输。在动态曲线显示方面,接收到的数据可能被解析并添加到曲线数据结构中,然后在界面上实时刷新显示。 总的来说,"WinCE下的TCP/IP及动态曲线测试程序...

    TCP/IP详解 卷1:协议--源代码

    18.6 TCP的状态变迁图 182 18.6.1 2MSL等待状态 183 18.6.2 平静时间的概念 186 18.6.3 FIN_WAIT_2状态 186 18.7 复位报文段 186 18.7.1 到不存在的端口的连接请求 187 18.7.2 异常终止一个连接 187 ...

    TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议

    2.4 状态变迁图 2.5 T/TCP的扩展状态 2.6 小结 第3章 T/TCP使用举例 3.1 概述 3.2 客户重新启动 3.3 常规的T/TCP事务 3.4 服务器收到过时的重复SYN 3.5 服务器重启动 3.6 请求或应答超出报文段最大长度MSS 3.7 向后...

    TCP/IP详解卷1

    书中的内容深入到每个协议的细节,包括头部字段解析、状态机流程图、报文交互示例等,对于网络工程师、开发者和爱好者来说,是一本极具价值的学习资源。 总的来说,TCP/IP是互联网的基石,其复杂性和精细程度使得...

    TCP/IP详解卷 pdf格式

    18.6 TCP的状态变迁图 182 18.6.1 2MSL等待状态 183 18.6.2 平静时间的概念 186 18.6.3 FIN_WAIT_2状态 186 18.7 复位报文段 186 18.7.1 到不存在的端口的连接请求 187 18.7.2 异常终止一个连接 187 18.7.3 检测半...

    C# Socket心跳包跟图片传输,TCP/IP协议响应Demo供学习之用

    心跳包是在网络连接中保持活动状态的一种机制,主要用于检测网络连接是否中断或者异常。在TCP连接中,心跳包可以定期发送,如果一段时间内没有收到对方的回应,就可以认为连接已断开。在C#的Socket编程中,可以设定...

    Labview-TCP.rar_labview TCP_labview TCP/IP_labview-tcp_labview通过

    开发者可以创建按钮、指示灯、文本框等控件,以显示连接状态、数据收发情况等信息。 9. **实时性与效率**:Labview支持实时系统,对于需要快速响应的TCP通信应用,可以通过优化代码和配置实时操作系统来提高性能。 ...

    CodeSys如何实现TCPIP通信

    `SocketOpen`函数需要指定TCP/IP连接的类型(TCP或UDP)、目标IP地址和端口。 3. **数据传输**: 一旦连接建立,你可以使用`SocketSend`和`SocketReceive`函数进行数据的发送和接收。`SocketSend`用于将数据缓冲区...

Global site tag (gtag.js) - Google Analytics