1、建立连接协议(三次握手)
(1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1.
(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。
(3) 客户必须再次回应服务段一个ACK报文,这是报文段3.
2、连接终止协议(四次握手)
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
CLOSED: 这个没什么好说的了,表示初始状态。
LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_RCVD:这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT:这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED:这个容易理解了,表示连接已经建立了。
FIN_WAIT_1:这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING:这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT:这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到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.允许老的重复分节在网络中消逝。
- 大小: 60.2 KB
分享到:
相关推荐
在TCP连接过程中,客户端首先发起连接请求,经过三次握手建立连接。服务器接收到请求后响应,双方确认连接建立。在传输数据后,通过四次挥手断开连接。在这个过程中,TCP协议提供了数据的顺序传输和错误校验,确保了...
1. **TCP连接过程**: TCP连接的建立通常称为三次握手(Three-Way Handshake)。首先,客户端发送一个SYN(同步序列编号)报文段到服务器,请求建立连接。接着,服务器回应一个SYN+ACK报文段,确认并提出自己的...
通过阅读源码,可以学习到具体的SPI通信细节、TCP连接过程的实现以及错误处理等技巧。 总之,通过STM32F103与W5500的配合,我们可以构建一个功能完备的TCP客户端,实现与远程服务器的数据交互,这对于物联网设备、...
9. **TCP/IP配置**:了解TCP/IP协议的工作原理,例如熟知的三次握手和四次挥手过程,有助于理解为何有时候需要手动关闭TCP连接。 掌握这些方法和知识,有助于你在遇到需要强制结束TCP连接的情况时,能够迅速有效地...
在TCP连接过程中,如果服务器端不存在或者未启动,客户端的连接请求会一直等待,直到超时。为了避免这种情况,我们需要实现连接超时机制。这通常涉及设置一个定时器,在特定时间间隔后检查连接是否成功建立。如果...
当客户端使用Socket类的构造函数,指定服务器的IP和端口,并调用connect()方法时,TCP连接过程就开始了。 在本案例中,我们可能会实现以下步骤: 1. 服务器端创建ServerSocket,绑定到特定端口,然后调用accept()...
3. **TCP连接过程**: - `connect(String host, int port)`:创建TCP连接,传入服务器的IP地址(host)和端口号(port)。 - 实现中可能使用`Socket`类的`connect(SocketAddress endpoint, int timeout)`方法,...
本实验报告的主要目的是学习并分析TCP数据包的结构、含义,并研究TCP连接的建立过程和数据传输过程。实验使用Wireshark网络分析软件和实验文件“计算机网络实验.cap”,记录了204个分组的网络通信记录。 TCP数据报...
在TCP连接过程中,每台设备都有一个唯一的IP地址和端口号,构成了TCP连接的两端:源端和目标端。 TCP连接信息通常包括以下关键要素: 1. **源IP和源端口**:发起连接请求的设备的IP地址和使用的端口号。 2. **目标...
TCP连接建立与终止过程剖析
Linux 下 TCP 连接迁移技术是一种基于 TCP 连接迁移的负载均衡方法,它可以将一个 TCP 连接的一个端点迁移到另一个节点,而整个迁移过程对于连接的另一端点来说是透明的。这种技术可以大大减轻前端服务器的负担,...
Wireshark 分析 TCP 连接断开过程分析与总结 Wireshark 是一个功能强大的网络协议分析工具,能够对 TCP 连接断开过程进行详细的分析和总结。下面我们将对 Wireshark 分析 TCP 连接断开过程进行详细的分析和总结。 ...
一、TCP连接过程 在TCP客户端与服务器建立连接之前,需要经历三次握手的过程。这三步分别是: 1. **SYN(同步序列编号)**:客户端首先发送一个带有SYN标志的数据段,请求建立连接。这个数据段包含一个随机的序列号...
TCPTrace是一款强大的网络诊断工具,特别适用于Windows操作系统中的TCP/IP通信监控。该工具的主要功能是对TCP连接进行...它能深入剖析TCP连接过程,帮助开发者和网络管理员识别和解决问题,提升网络性能和应用质量。
TCPView通过显示当前系统中的TCP连接情况,帮助用户理解网络通信的动态过程。 使用TCPView,你可以: 1. **查看连接状态**:TCPView会列出所有活动的TCP连接,包括本地IP地址、远程IP地址、本地端口、远程端口以及...
在监视结果中,我们可以看到TCP连接建立过程的详细信息,例如:SYN包、ACK包、SEQ号、ACK号等。这些信息对于理解TCP建立过程非常重要。 TCP建立过程是TCP协议的核心机制之一,它提供了可靠的数据传输服务,并广泛...
**三次握手**是TCP连接建立的过程: 1. **SYN (同步序列编号)**:客户端向服务器发送一个SYN报文段,其中包含一个随机的初始序列号ISN(Initial Sequence Number)。 2. **SYN+ACK (同步+确认)**:服务器收到SYN后...
在连接过程中,每个TCP连接都有一个唯一的标识,即源IP地址、源端口号与目标IP地址、目标端口号的组合。 2. TCP连接的状态:TCP连接有多种状态,包括SYN_SENT(同步发送)、SYN_RECEIVED(同步接收)、ESTABLISHED...
TCP并发连接数是指同一时间一个用户或进程可以建立的TCP连接的最大数量。在打印机共享环境中,如果多个用户尝试同时连接到同一台打印机,可能就会遇到这个限制,从而影响打印效率。 描述中提到的问题解决方案可能是...
Java Socket编程中的TCP连接过程 在Java Socket编程中,TCP连接的建立主要是通过客户端和服务端之间的交互完成的。以下是对这一过程的具体解析: - **服务端监听**: 服务端首先通过`ServerSocket`类创建一个服务端...