概述
TCP
是一种面向连接的协议,提供了可靠、有序和错误检测机制的字节流服务- 与无连接的
UDP
协议相比,TCP
强调数据完整性和可靠性
特点
- 可靠性
TCP
确保所有数据包按顺序到达,如果丢失或出错,它们将被重新传输
- 面向连接
- 在数据交换之前,通信双方必须建立连接
- 全双工
- 一旦连接建立,数据可以在两个方向上同时流动
- 流控制
- 通过窗口机制,发送方可以根据接收方的处理能力来调整数据的发送速率
- 拥塞控制
- 当网络拥堵时,
TCP
会动态地减少数据传输速率
- 当网络拥堵时,
三次握手
SYN
- 客户端发送一个
SYN
(同步)包到服务器,请求连接
SYN-ACK
- 服务器响应
SYN
包,并向客户端发送ACK
(确认)和自己的SYN
ACK
- 客户端再次发送
ACK
,确认连接
细节
- 第一次:
- 客户端希望与服务器建立连接时,会发送一个TCP包。
这个包的标志位中SYN标志设置为1,序列号为随机产生的值x
- 收到这个包后,服务器知道客户端希望建立一个连接
- 客户端希望与服务器建立连接时,会发送一个TCP包。
- 第二次:
- 在收到客户端的
SYN
包后,服务器必须确认这个请求
服务器向客户端发送另一个TCP
包,其中SYN
和ACK
标志位都设置为1
这个包的序列号也是随机的,设为y
,确认号为x+1
,确认客户端的序列号加1
的值 - 收到这个包后,客户端知道服务器已准备好建立连接
- 在收到客户端的
- 第三次:
- 客户端向服务器发送第三个包来确认连接的建立
这个包中ACK标志位为1,序列号为x+1
,确认号为y+1
- 收到这个包后,服务器知道客户端已经准备好通信
- 客户端向服务器发送第三个包来确认连接的建立
图示
1 2 3 4 5 6 7 8 9 |
客户端 服务器 | ---SYN(x)---> | | | | <---SYN(y),ACK(x+1)--- | | | | ---ACK(y+1)---> | | | | 连接已建立 | V V |
为什么需要三次握手
- 三次握手的主要目的是确保双方主机都准备好建立连接
并确定各自的初始序列号,从而确保数据传输的可靠性和顺序 - 同步序列号:
- 通过三次握手,客户端和服务器可以互相通知对方的初始序列号
- 序列号是TCP用来识别数据字节顺序的方式,因此它们必须被双方明确同步
- 双向通信:
- 当三次握手完成时,客户端和服务器都确认了对方的准备就绪,这样就可以在双方之间建立双向通信
- 避免旧连接初始化:
- 有时,由于网络延迟等原因,旧的连接请求可能会迟到,达到服务器后可能被误解释为新的连接请求
- 通过三次握手,服务器可以识别并丢弃这些陈旧的连接请求,防止不必要的错误连接
- 资源分配:
- 通过三次握手,服务器能确保客户端真实存在并准备好进行通信,这样服务器才分配必要的资源来维护这个连接
- 如果没有这样的过程,一个恶意客户端就能通过发送伪造的连接请求耗尽服务器的资源
- 参数协商:
- 三次握手还允许客户端和服务器在连接建立过程中协商某些参数,例如窗口大小等
四次挥手
- 当连接关闭时,需要四次挥手
FIN
- 主动关闭方发送
FIN
包,表示完成发送
ACK
1. 被动关闭方确认收到FIN
FIN
- 被动关闭方发送自己的
FIN
ACK
- 主动关闭方再次发送
ACK
细节
- 第一次:
- 当一个端点(例如客户端)决定关闭连接时,它会发送一个
FIN
(完成)标志的TCP
段
这个FIN标志表示该端点已经完成了发送,没有更多的数据要传输
- 当一个端点(例如客户端)决定关闭连接时,它会发送一个
- 第二次:
- 当接收到
FIN
段时,对方(例如服务器)会发送一个ACK
(确认)标志的TCP
段来确认收到了FIN
段 - 此时,连接处于半关闭状态,因为虽然主动关闭方已经停止发送数据,被动关闭方仍然可以继续发送
- 当接收到
- 第三次:
- 当被动关闭方也完成了数据发送,它会发送另一个
FIN
标志的TCP
段,表示它也完成了数据传输,并准备关闭连接
- 当被动关闭方也完成了数据发送,它会发送另一个
- 第四次:
- 主动关闭方会回复一个ACK标志的TCP段,确认它已经收到了FIN段
- 在这一步完成后,连接被彻底关闭
TIME_WAIT状态
- 值得注意的是,在最后一个
ACK
发送后,主动关闭方通常会进入一个称为TIME_WAIT
的状态,持续一段时间(通常是2
倍的最大段生存时间,MSL
) - 这个等待时间确保了最后一个
ACK
确实被对方收到,如果没有收到,对方会重新发送FIN
段
为什么需要四次挥手
- 全双工通信:
TCP
是全双工协议,这意味着在一个TCP连接中,数据可以在两个方向上同时传输- 因此,每个方向的连接都需要单独关闭。所以双方都必须发送一个FIN标志来关闭各自的方向,以及发送一个ACK来确认对方的FIN
- 可靠数据传输:
- 通过使用四次挥手,TCP确保了在关闭连接之前,双方都完成了所有未完成的数据传输
- 例如,当一个方向的连接关闭后,另一方向仍然可以继续发送数据,直到也准备好关闭
- 避免旧连接的重启:
- 通过在最后一个
ACK
发送后的时间等待(TIME_WAIT
)阶段,TCP
确保了最后一个确认已被接收,并且旧的重复段不会与新的连接混淆 - 这防止了潜在的连接混乱和数据错误
- 通过在最后一个
- 防止数据丢失:
- 既然两个方向的连接是分别关闭的,其中一个方向的FIN并不意味着双方都不再发送数据
- 因此,需要四次挥手来确保双方都有机会完成其剩余的数据传输
详解TIME_WAIT状态
- 当
TCP
连接的一方A
完成它的数据发送并接收到对方B
的FIN
(表明对方B
已经完成了数据发送)并发送了确认的ACK
后,A
会进入TIME_WAIT状态- 换句话说,
TIME_WAIT
出现在关闭连接的四次挥手过程的最后阶段
- 换句话说,
TIME_WAIT
状态通常持续两倍的最大段生存时间(MSL
,Maximum Segment Lifetime
)。在大多数系统中,MSL
为2
分钟,因此TIME_WAIT
通常持续4
分钟- 有这个状态的目的:
TIME_WAIT
状态确保关闭连接的另一端B
收到了A
对其FIN
段的确认ACK
。如果B
没有收到此ACK
,B
会重新发送FIN
段,A
在TIME_WAIT
状态下可以继续确认TIME_WAIT
也保证了在连接关闭后,来自该连接的旧重复段在网络中已经消失。这确保了之后建立的新连接不会受到旧连接的影响,这对于使用相同的源和目的IP/端口
对的新连接尤其重要- 在高连接速率的服务器上,大量的
TIME_WAIT
状态可能导致端口资源的短时耗尽。
这是因为每个<源IP, 源端口, 目标IP, 目标端口>
组合需要在TIME_WAIT
时间窗口内保持唯一性
解决这个问题的方法之一是在需要的时候启用SO_REUSEADDR套接字选项 - 加入当一个
TCP
连接收到FIN
并发送ACK
后,立即关闭并释放资源?
如果最后一个ACK丢失,那么关闭连接的另一端将重新发送FIN
,这将在新的连接中产生一个未经请求的FIN
,导致错误
流控制
概述
TCP
的流控制(Flow Control
)是一种确保数据在发送和接收方之间高效传输的机制- 流控制有助于防止快速发送方压倒慢速接收方,造成网络拥塞和数据丢失
详解
- 滑动窗口机制:
- 发送窗口: 发送方使用一个窗口来控制其一次可以发送多少数据。
这个窗口大小取决于接收方的窗口大小和网络拥塞 - 接收窗口: 接收方的接收窗口大小告诉发送方它一次可以接收多少数据
窗口太小,效率低
窗口太大,可能超出接收方的处理能力,导致数据丢失
- 发送窗口: 发送方使用一个窗口来控制其一次可以发送多少数据。
- 窗口调整:
- 接收方可以通过在
ACK
中携带的窗口大小字段来动态地通知发送方其可用的窗口大小 - 如果接收方的缓冲区被填满,它可以通知发送方减小窗口,甚至将窗口设置为零,停止发送
- 接收方可以通过在
- 丢包和超时的影响:
- 发送方需要等待对其发送的每个段的确认
- 如果确认超时或丢失,发送方可能需要减小窗口大小,并重新传输未确认的段
- 慢开始和拥塞避免:
- 接收方的流控制,
TCP
还实现了拥塞控制,它与网络中的其他流量和路由器缓冲区的可用空间有关 - 慢开始和拥塞避免算法共同工作,逐渐增加发送窗口大小,直到找到网络当前能够承受的最佳速率
- 接收方的流控制,
- 持续计时器:
- 如果接收方窗口变为零,它可能会在稍后的时间点打开
- 持续计时器定期提示发送方查询接收方的窗口大小。如果窗口打开,则继续发送;否则,继续等待
Silly Window Syndrome(SWS)
的防止:SWS
是指接收方频繁通知发送方有一个很小的窗口可用,例如一个字节- 为了防止这种低效的情况,接收方通常会等待有足够的空间可用后再通知发送方
拥塞控制
简述
TCP
的拥塞控制是一组算法,用来确保TCP
的稳定和高效运行- 当网络中的某个部分变得拥堵时,
TCP
的拥塞控制算法可以防止部分或整个网络被淹没,并有助于实现更公平的带宽分配
慢启动
TCP
连接开始时,拥塞窗口(cwnd
)设置为一个较小的值,然后每确认一个段(ACK
),拥塞窗口就增加一个段的大小,成指数增长- 慢开始的目的是让TCP连接不会突然发送大量的数据,导致网络拥塞
拥塞避免
- 一旦达到阈值(
ssthresh
),增长速率从指数变为线性 - 每经过一个
RTT
(往返时延),窗口大小增加一个段。这样的增长方式会缓慢逼近网络的实际容量
快速重传
- 当接收方连续三次重复确认相同的数据段(三个重复
ACK
),发送方就会假定该段后的第一个数据段丢失,并立即重新传输那个丢失的段
快速恢复
- 与快速重传一起工作,使连接能够在重新传输丢失的段后快速恢复到拥塞避免阶段,而不是回到慢开始阶段
拥塞窗口减少
- 如果接收方超时未确认段(
Timeout
),或者接收到三个重复ACK
,发送方就会减小拥塞窗口大小 - 此时通常会设置
ssthresh
为当前cwnd
的一半,并将cwnd
重置为1
,回到慢开始阶段
拥塞通知
- 如果网络设备检测到拥塞,可以在
IP
包头中设置ECN
位,以通知接收方和发送方网络出现拥塞,从而降低发送速率
其他控制算法
- 除了基本的拥塞控制算法,还有一些其他的拥塞控制算法,如
TCP Reno
,TCP Vegas
,BBR
等,各有不同的特性和适用场景
错误检测
概述
TCP
通过序列号和确认机制确保数据的可靠传输- 失序、丢失或错误的数据将被重新传输
校验和
TCP
头和数据都包括一个校验和字段,用于检测数据是否在传输过程中被损坏- 发送方会计算
TCP
头和数据的校验和,并将其放在TCP
段的校验和字段中 - 接收方收到
TCP
段后,也会计算校验和- 如果计算出的校验和与段中的校验和字段不匹配,则该段被认为是错误的,并被丢弃
序号
- 每个
TCP
段都包括一个序号,表示该段中的第一个字节的序号 - 通过序号,接收方可以确定接收到的段的顺序
- 如果某个段丢失,也可以通过期望的序号和接收到的序号来检测
确认
- 接收方通过发送带有ACK标志的段来确认已接收的数据
- 确认号表示接收方期望收到的下一个字节的序号
- 如果发送方未收到确认,则可以假定数据段已丢失,并重新发送
重传超时
- 如果发送方在一段时间内未收到特定段的确认,则会重新发送该段
- 这个超时时间可能是动态计算的,基于之前的往返时间(
RTT
)
- 这个超时时间可能是动态计算的,基于之前的往返时间(
流控制
- 通过使用滑动窗口机制,接收方可以控制发送方的发送速率,确保其不会超过自己的处理能力
- 如果窗口大小为零,发送方将停止发送,等待窗口大小增加
快速重传
- 如果接收方连续三次收到相同序号的段,它会立即发送确认
- 发送方可以侦测到这三个重复确认,并立即重新发送丢失的段,而不是等待超时
拥塞控制
- 这不仅是错误恢复机制,还是防止错误发生的机制
- 通过控制数据在网络中的流量,拥塞控制有助于防止网络拥堵,从而防止丢包
关闭连接
TCP
提供了一种四次挥手的机制来关闭连接,确保双方都能完成数据传输
选项字段
TCP
头部的选项字段可以用于各种可选的错误检测和恢复功能,例如SACK
(选择性确认)
TCP段
概述
TCP
数据被封装成“段”,每个段都有一个包头,包括源和目标端口、序列号、确认号、窗口大小等
TCP头部
- 源端口(
Source Port
)和目的端口(Destination Port
): 每个字段都占16位,用于标识源和目的进程 - 序列号(
Sequence Number
): 32位字段,表示本段数据的第一个字节在整个字节流中的序号 - 确认号(
Acknowledgment Number
): 32位字段,表示接收方期望收到的下一个字节的序号 - 数据偏移(
Data Offset
): 4位字段,表示TCP
头部的长度。因为头部长度可变,所以这个字段是必需的 - 保留(
Reserved
): 3位保留字段,必须设为零 - 控制标志(
Control Flags
): 9位字段,包括URG
,ACK
,PSH
,RST
,SYN
,FIN
等标志,用于控制TCP
的特定功能 - 窗口大小(
Window Size
): 16位字段,用于流控制,表示接收方可接受的字节数 - 校验和(
Checksum
): 16位字段,用于错误检测 - 紧急指针(
Urgent Pointer
): 16位字段,与URG
标志一起使用,指示紧急数据的位置 - 选项(
Options
): 可选字段,长度可变,用于某些可选功能,如最大段大小(MSS
)、窗口缩放、时间戳等
数据部分
- 数据部分包含了应用程序传输的实际数据
- 其长度可以为零(例如,纯
ACK
段)或者最多可达到16
位的最大值,减去头部的长度
- 其长度可以为零(例如,纯
状态
图示
概述
-
TCP
的状态指的是对应套接字(socket
)的状态- 在
Linux
系统中,每个TCP
套接字的状态保存在内核的数据结构中 - 特别是在
sock
和inet_sock
结构中。这些结构为每个套接字提供了基本的和特定于网络协议的信息
- 在
-
TCP
连接在其生命周期中会经历多个状态,包括 -
LISTEN
,SYN-SENT
,SYN-RECEIVED
,ESTABLISHED
,FIN-WAIT-1
,FIN-WAIT-2
,CLOSE-WAIT
,CLOSING
,LAST-ACK
,TIME-WAIT
,CLOSED
等
LISTEN
LISTEN
是TCP连接建立过程中的一个状态。在服务器端,一个进程通常首先绑定到一个特定的地址和端口,然后开始在这个端口上监听客户端的连接请求。当进程处于这个监听状态时,该进程的套接字处于LISTEN
状态
SYN-SENT
- 当一个
TCP
连接的主动方(即客户端)想要与另一台机器上的服务端建立连接时,它会发送一个包含SYN
(Synchronize
)标志位的TCP
段,并进入SYN-SENT
状态 - 含义:
- 客户端发送了一个
SYN
标志位,并在此标志位中提供了其初始序列号 - 一旦进入
SYN-SENT
状态,客户端就等待服务端响应。服务端的响应应该是一个包含SYN和ACK标志位的TCP段
- 客户端发送了一个
- 可能的状态转换:
- 如果客户端收到一个包含
SYN
和ACK
标志位的段(并且ACK
确认了客户端的SYN
),客户端会发送一个ACK
确认段给服务端,并进入ESTABLISHED
状态,此时连接建立完成 - 如果在特定的超时时间内没有收到服务端的响应,客户端可能会重新发送
SYN
段,或者放弃连接尝试,并将套接字置为关闭状态 - 如果收到一个包含
RST
(Reset
)标志的段,表示服务端拒绝了连接。客户端将退出SYN-SENT
状态,并将套接字置为关闭状态 - 在
SYN-SENT
状态中,应用程序还可以选择取消连接尝试
- 如果客户端收到一个包含
SYN-RECEIVED
- 在三次握手的过程中,当服务器收到来自客户端的第一个
SYN
(同步)报文段,并向客户端发送了SYN
和ACK
(确认)报文段后,就会进入这个状态SYN-RECEIVED
状态在服务器端是一个临时状态,它代表服务器已经同意了连接请求,并且已经发送了确认- 这个状态下,服务器正在等待客户端的最后一个
ACK
报文段来完成握手过程
- 在
SYN-RECEIVED
状态下,如果服务器没有收到来自客户端的ACK报文段,可能会有以下几种情况:- 服务器可能会重新发送
SYN
+ACK
报文段,直到收到客户端的ACK
报文段或达到重试次数限制 - 如果超过了一定的重试次数,服务器可能会关闭连接,并返回到
LISTEN
状态
- 服务器可能会重新发送
ESTABLISHED
- 当三次握手成功完成后,连接的双方都会进入
ESTABLISHED
状态。- 在客户端,它会在发送最后一个
ACK
确认段后进入该状态 - 在服务端,它会在收到这个
ACK
段后进入该状态
- 在客户端,它会在发送最后一个
- 含义:
- 双方都准备好发送和接收数据。数据可以在两个方向上无阻碍地流动
TCP
确保数据的可靠传输,它会检测丢失的数据段并重新传输它们,并确保数据段的正确顺序- 在
ESTABLISHED
状态下,TCP
会实施流量控制,以确保发送方不会淹没接收方的缓冲区 TCP
还会监视网络的拥塞情况,并相应地调整其传输速度
- 可能的状态转换:
- 任何一方都可以开始正常的连接终止过程
- 如果在数据传输期间出现问题(例如,连接丢失或另一方崩溃),
TCP
将尝试恢复连接或终止它 - 如果连接在很长时间内没有活动,某些操作系统可能会选择自动关闭它
FIN-WAIT-1
TCP
(传输控制协议)连接在终止过程中会经过一系列的状态,其中FIN-WAIT-1
状态是其中的一个- 四次挥手:
TCP
连接的终止通常是通过所谓的“四次挥手”过程完成的- 在这个过程中,连接的两端(通常被称为“客户端”和“服务器”)都发送和接收
FIN
(结束)和ACK
(确认)报文来协商连接的关闭
FIN-WAIT-1
状态通常是TCP
连接关闭过程的第一步- 当一个
TCP
连接中的一方想要关闭连接时,它会发送一个FIN
报文,并进入FIN-WAIT-1
状态 - 在
FIN-WAIT-1
状态中,该端点等待远程端点对其发送的FIN
报文的确认。远程端点收到FIN
报文后,会发送一个ACK
报文来确认
- 当一个
- 可能的状态转换:
- 如果收到了
FIN
报文的ACK
确认,则转移到FIN-WAIT-2
状态,等待远程端点的FIN
报文 - 如果同时收到了
FIN
报文和ACK
确认,则可以直接转移到TIME-WAIT
状态
- 如果收到了
- 注意事项:
- 在
FIN-WAIT-1
状态中,TCP
端点仍然可以接收数据,但不能再发送新的数据 FIN-WAIT-1
状态的持续时间可能因网络延迟和其他因素而有所不同
- 在
FIN-WAIT-2
- 第一次挥手:
- 主动关闭连接的一方(我们称为
A
端)发送一个FIN
标志的数据包,请求关闭连接。此时,A
端进入FIN-WAIT-1
状态
- 主动关闭连接的一方(我们称为
- 第二次挥手:
- 被动关闭连接的一方(称为
B
端)收到FIN
请求后,返回ACK
标志的数据包作为确认,并可能发送自己的FIN
数据包关闭自己到A
端的连接 - 如果
B
端立即确认关闭,A
端收到这个ACK
后A
端进入FIN-WAIT-2
状态。如果B
端还有未发送的数据,可能会继续发送,并稍后才关闭连接
- 被动关闭连接的一方(称为
- 第三次挥手:
A
端等待B
端的FIN
数据包,此时A
端已经进入了FIN-WAIT-2
状态。所以A
端将不再发送数据,但仍然接收数据直到B
端关闭其连接
- 第四次挥手:
- 一旦
A
端收到B
端的FIN
数据包,它将发送最后的ACK
确认,并进入TIME-WAIT
状态 - 在等待一段时间后(通常是
2
倍的MSL
,最大报文生存时间),A
端将关闭连接,以确保最后的ACK
被B
端接收
- 一旦
- 注意:
- 在某些情况下,
FIN-WAIT-2
状态可能会持续较长时间,特别是当B
端持续发送数据或延迟关闭连接时- 因为
TCP
协议没有规定FIN-WAIT-2
状态的超时机制,所以理论上,A
端可能会一直停留在这个状态,直到B
端发送FIN
请求
- 因为
- 如果
A
端在FIN-WAIT-2
状态下崩溃或重启,那么与B
端的连接可能永远不会正常关闭,从而可能造成资源泄漏等问题
- 在某些情况下,
CLOSING
CLOSING
状态表示连接正在终止,但尚未完全关闭。它是一个相对罕见的状态,只有在特定的关闭情况下才会出现- 进入这个状态的情况:
- 主机
A
发送FIN
报文,进入FIN-WAIT-1
状态 - 主机
B
几乎同时也发送FIN
报文,但尚未收到主机A
的FIN
报文 - 主机
A
收到主机B
的FIN
报文,但主机B
尚未收到主机A
的FIN
报文的确认(ACK
) - 主机
A
发送FIN
的ACK
,进入CLOSING
状态
- 主机
- 状态转移:
- 此时,双方都在等待对方的
FIN
报文的确认 - 一旦双方都收到对方的
FIN
报文的确认,连接就可以转移到TIME-WAIT
状态,最终关闭
- 此时,双方都在等待对方的
- 重要性:
CLOSING
状态虽然罕见,但它体现了TCP
协议设计的健壮性。即使在双方几乎同时关闭连接的情况下,TCP
协议也能确保可靠的关闭连接
TIME-WAIT
- 当
TCP
连接被关闭时,双方都会发送和接收FIN
(结束)标志- 假设一方(主动关闭方,或“客户端”)发送了最后一个
ACK
(确认)标志,那么它会进入TIME-WAIT
状态
- 假设一方(主动关闭方,或“客户端”)发送了最后一个
TIME-WAIT
目的:- 在
TIME-WAIT
状态中,客户端会等待一段时间以确保最后一个ACK
被对方(被动关闭方,或“服务器”)正确接收
如果服务器没有收到这个ACK
,它会重新发送FIN
,客户端在TIME-WAIT
状态下就能再次回应ACK
- 通过等待一段时间,客户端可以确保网络中的任何延迟数据包都在连接重新使用之前消失
这有助于防止下一个使用相同套接字地址的连接误收到这些旧数据包
- 在
TIME-WAIT
时长:TIME-WAIT
状态通常持续2
个MSL
(最大段生存时间)- 在许多系统中,这相当于
1
到4
分钟。MSL
定义了数据包在网络中的最大生存时间
- 在许多系统中,这相当于
TIME-WAIT
与端口耗尽:- 由于
TIME-WAIT
状态持续的时间较长,所以在高负载的系统中,大量的套接字可能会卡在TIME-WAIT
状态 - 这可能会导致端口耗尽,因为新的连接可能无法使用已被占用的套接字地址
- 某些系统提供了用于控制
TIME-WAIT
状态行为的内核参数或套接字选项,以便在这种情况下进行调整
- 由于
CLOSE-WAIT
- 当一方(假设是客户端)完成数据传输并决定关闭连接时,它会发送一个
FIN
(结束) 标志给另一方(假设是服务器) - 服务器收到这个
FIN
消息后,首先发送一个ACK
(确认) 来确认已经收到FIN
- 此时,从服务器的角度来看,服务器的
TCP
连接状态就会变成CLOSE-WAIT
- 此时,从服务器的角度来看,服务器的
- 在
CLOSE-WAIT
状态,服务器等待应用程序关闭其端的连接- 也就是说,底层的
TCP
栈已经知道了连接应该被关闭,但是它正在等待上层的应用程序(例如,HTTP
服务器)来决定何时实际地关闭它
- 也就是说,底层的
LAST-ACK
- 进入
LAST-ACK
过程:- 当一个
TCP
连接的一方想要关闭连接时,它会发送一个FIN
标志的TCP
段,请求关闭连接 - 被动关闭端(另一方)收到
FIN
后,会发送一个ACK
表示已收到,并发送一个自己的FIN
请求关闭连接 - 主动关闭端收到对方的
ACK
和FIN
后,会进入LAST-ACK
状态,并发送一个最终的ACK
表示同意关闭连接
- 当一个
LAST-ACK
状态行为:- 在
LAST-ACK
状态中,主动关闭端等待对方确认自己的最后一个ACK
- 此时,连接的终止正在进行中,但还没有完全完成。主动关闭端无法发送更多的数据,只能接收
- 在
- 退出
LAST-ACK
状态:- 当主动关闭端收到对方对自己最后一个
ACK
的确认后,它将退出LAST-ACK
状态并进入CLOSED
状态 - 此时,
TCP
连接被成功终止,资源被释放
- 当主动关闭端收到对方对自己最后一个
CLOSED
-
在TCP协议中,
CLOSED
状态表示连接完全关闭的状态- 这是
TCP
连接的初始和最终状态
- 这是
-
进入
CLOSED
状态的方式:- 刚创建的套接字处于
CLOSED
状态,直到应用程序调用了连接或监听操作 - 一方可以通过调用
close
或shutdown
系统调用来关闭连接
这将触发四次挥手的过程。在完成所有必要的终止步骤后,连接将进入CLOSED
状态 - 如果一方接收到另一方的关闭请求(即
FIN
标志),它也会进入关闭连接的过程,并最终进入CLOSED
状态 - 连接也可能由于错误或超时而被关闭
例如,如果在建立连接的过程中出现超时或错误,连接可能会直接进入CLOSED
状态
- 刚创建的套接字处于
-
CLOSED
状态的行为:- 在此状态下,端点不接受任何传入的连接请求
- 应用程序可以通过调用特定的系统调用来开始连接或监听过程,从而使端点离开
CLOSED
状态 - 尝试在
CLOSED
状态下发送数据会导致错误
-
CLOSED
的状态转移:- 如果端点想要接受新的连接请求,它必须从
CLOSED
状态转到LISTEN
状态 - 如果端点想要主动建立新的连接,它必须从
CLOSED
状态转到SYN-SENT
状态
- 如果端点想要接受新的连接请求,它必须从
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Bash Shell 命令09/04
- ♥ Shell 语法记述 第三篇09/05
- ♥ Linux 高性能服务器编程:TCP二11/24
- ♥ Pybind11记述:一07/04
- ♥ Objective-C 解析plist04/28
- ♥ Vim编辑器的操作03/17