`

linux - 网络连接状态

阅读更多
【基本情况】
这里介绍网络连接的11种状态,TCP三次握手/四次挥手

【详细介绍】



通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手
SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。

ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。

FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。

1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN. /* The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 */
2)、SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT. /*The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求 */

3)、SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV /* A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 */

4)、ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了。/* The socket has an established connection. 代表一个打开的连接,数据可以传送给用户 */

5)、FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态./* The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认 */

6)、CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT. /* The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 */

7)、FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2 ./* Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求 */

8)、LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认 */

9)、TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态。/* The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认 */

10)、CLOSING: 比较少见./* Both sockets are shut down but we still don’t have all our data sent. 等待远程TCP对连接中断的确认 */

11)、CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束./* The socket is not being used. 没有任何连接状态 */
TIME_WAIT状态的形成只发生在主动关闭连接的一方。
主动关闭方在接收到被动关闭方的FIN请求后,发送成功给对方一个ACK后,将自己的状态由FIN_WAIT2修改为TIME_WAIT,而必须再等2倍 的MSL(Maximum Segment Lifetime,MSL是一个数据报在internetwork中能存在的时间)时间之后双方才能把状态 都改为CLOSED以关闭连接。目前RHEL里保持TIME_WAIT状态的时间为60秒。

当然上述很多TCP状态在系统里都有对应的解释或设置,可见man tcp

二、关于长连接和短连接:
通俗点讲:短连接就是一次TCP请求得到结果后,连接马上结束.而长连接并不马上断开,而一直保持着,直到长连接TIMEOUT(具体程序都有相关参数说明).长连接可以避免不断的进行TCP三次握手和四次挥手.
长连接(keepalive)是需要靠双方不断的发送探测包来维持的,keepalive期间服务端和客户端的TCP连接状态是ESTABLISHED.目前http 1.1版本里默认都是keepalive(1.0版本默认是不keepalive的),ie6/7/8和firefox都默认用的是http 1.1版本了(如何查看当前浏览器用的是哪个版本,这里不再赘述)。Apache,java

一个应用至于到底是该使用短连接还是长连接,应该视具体情况而定。一般的应用应该使用长连接。

1、Linux的相关keepalive参数

a、 tcp_keepalive_time – INTEGER
How often TCP sends out keepalive messages when keepalive is enabled.
Default: 2hours.
b、 tcp_keepalive_probes – INTEGER
How many keepalive probes TCP sends out, until it decides that the
connection is broken. Default value: 9.
c、 tcp_keepalive_intvl – INTEGER
How frequently the probes are send out. Multiplied by
tcp_keepalive_probes it is time to kill not responding connection,
after probes started. Default value: 75sec i.e. connection
will be aborted after ~11 minutes of retries.

2、F5负载均衡上的相关参数说明

a、Keep Alive Interval
Specifies, when enabled, how frequently the system sends data over an idle TCP connection, to determine whether the connection is still valid.
Specify: Specifies the interval at which the system sends data over an idle connection, to determine whether the connection is still valid. The default is 1800 milliseconds.
b、Time Wait
Specifies the length of time that a TCP connection remains in the TIME-WAIT state before entering the CLOSED state.
Specify: Specifies the number of milliseconds that a TCP connection can remain in the TIME-WAIT state. The default is 2000.

c、Idle Timeout
Specifies the length of time that a connection is idle (has no traffic) before the connection is eligible for deletion.
Specify: Specifies a number of seconds that the TCP connection can remain idle before the system deletes it. The default is 300 seconds.

3、Apache的相关参数说明
以下是Apache/2.0.61版本的默认参数和说明

a、KeepAlive:
default On.Whether or not to allow persistent connections (more than
one request per connection). Set to “Off” to deactivate.
b、MaxKeepAliveRequests:
default 100.The maximum number of requests to allow
during a persistent connection. Set to 0 to allow an unlimited amount.
We recommend you leave this number high, for maximum performance.
c、KeepAliveTimeout:
default 15. Number of seconds to wait for the next request from the
same client on the same connection.

TCP三次握手/四次挥手详解

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可用状态了。
最后有2个问题的回答,我自己分析后的结论(不一定保证100%正确)
1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
2、 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为:虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

【参考引用】
http://www.cnblogs.com/hnrainll/archive/2011/10/21/2220518.html
  • 大小: 69.7 KB
分享到:
评论

相关推荐

    arm-linux-gnueabihf-gdb-8.2_Ubuntu16.04.tar.gz

    3. **连接目标设备**:使用GDB的target remote命令连接到远程ARM设备,如通过串口、网络或JTAG接口。 4. **设置断点**:在源代码的关键位置设置断点,以便在执行到这些点时暂停程序。 5. **启动程序**:使用continue...

    linux-ppp-scripts.rar

    总的来说,配置移远5G模块在Linux下的PPP拨号上网涉及对PPP协议的理解、5G网络特性、Linux网络配置以及脚本编写。正确配置后,用户可以在没有固定有线连接的情况下,利用5G网络实现高速的互联网访问。对于物联网设备...

    kubernetes-server-linux-amd64.tar.gz

    - 启动`kube-scheduler`,连接到apiserver。 5. **设置Worker节点**: - 在每个Worker节点上启动`kubelet`,配置apiserver的地址以及认证信息。 - 启动`kube-proxy`,同样需要apiserver的地址。 6. **初始化...

    linux-wlan-ng-0.2.9.rar_linux wlan_linux-wlan-ng_linux-wlan-ng 0

    5. **测试连接**:使用`ifconfig`或`iwconfig`命令检查网络接口状态,然后通过`dhclient`或手动配置IP地址来建立网络连接。 在实际应用中,用户可能还需要解决硬件兼容性问题、与其他软件的集成问题,或者根据特定...

    kubernetes-client-linux-amd64.tar.gz

    - 网络策略:定义网络规则,如Ingress,以控制服务的网络访问。 - 存储管理:挂载持久卷为Pod提供存储,确保数据在Pod重启后仍可访问。 - 自动化工作流:结合Kubernetes的作业(Job)、cron作业(CronJob)等,实现...

    MLNX-OFED-LINUX-4.0-2.0.0.1-ubuntu16.04-x86-64.tgzz OFED 4.1 驱动

    **正文** `MLNX-OFED-LINUX-4.0-2.0.0.1-ubuntu16.04-x86-64....这个包对于依赖高速、低延迟网络连接的应用至关重要,如大数据处理、HPC集群和云计算环境。正确安装和配置OFED驱动是充分发挥Mellanox硬件潜力的关键。

    syncthing-linux-amd64-v1.9.0.tar.gz

    6. **网络限制**:可以设置同步规则,如仅在特定网络或时间进行同步,节约带宽。 7. **Web界面**:提供直观的Web界面,便于管理和监控同步状态。 8. **事件日志**:记录所有同步活动,方便问题排查和分析。 使用...

    pushgateway-1.4.2.linux-amd64.tar.gz

    - 安全性:由于Pushgateway接收来自客户端的数据,所以必须确保网络连接的安全,避免未经授权的指标注入。 - 资源管理:Pushgateway可能会占用相当的内存和CPU资源,尤其是在处理大量指标时,因此合理规划其部署和...

    node_exporter-1.0.0-rc.0.linux-amd64.tar.gz

    这些指标可以涵盖CPU使用率、内存使用情况、磁盘I/O、网络状态等。Prometheus的数据模型允许用户定义复杂的查询语言来提取和分析数据,从而实现报警和性能监控。 Node_Exporter作为Prometheus的导出器之一,它的...

    xray-linux-amd64

    总结来说,【xray-linux-amd64】是Linux平台上的一款强大网络工具,它提供了高效的网络代理和穿透能力,具有高度的灵活性和安全性。通过合理的配置和使用,用户可以有效地管理和控制网络流量,提升网络访问速度,...

    kubernetes-node-linux-amd64.tar.gz-v1.14.11,二进制下载

    - **网络配置**:Kubernetes节点之间需要有可靠的网络连接,以便进行通信和数据传输。 - **认证与授权**:在加入节点到集群时,需要使用适当的证书和密钥进行身份验证和授权。 - **存储配置**:Kubernetes需要配置...

    cef-linux-x64

    CEF提供了丰富的接口供你与网页内容进行交互,比如注入JavaScript代码、修改DOM元素、处理网络请求等。 4. 更新和管理:当需要更新网页内容或进行其他操作时,你可以调用CEF提供的方法。同时,还需要管理CEF的生命...

    linux-8139cp,realtek8139网卡linux下的驱动

    在Linux操作系统中,驱动程序是连接硬件设备与操作系统内核的关键组件。对于Realtek 8139型号的网络适配器,`...通过对这些文件的分析和操作,用户不仅可以解决网络连接问题,还可以深入学习Linux驱动开发的相关知识。

    Reading-and-comprehense-linux-Kernel-network-protocol-stack_y123456yz.tar.gz

    `sock`结构体封装了网络连接的状态,`socket`函数用于创建新的套接字。 5. **网络协议栈的调度和队列管理**:如`netpoll`机制用于高效地处理网络事件,`sk_buff`(socket buffer)数据结构用于缓冲网络数据。 通过...

    Qualcomm-Atheros-QCA9377-Wifi-Linux-master.zip

    总的来说,这个压缩包提供的驱动程序是Linux用户为了充分利用QCA9377 Wi-Fi芯片功能所必需的,它涉及到Linux内核模块的编译和安装,是Linux系统中进行硬件适配和网络连接优化的关键部分。正确安装和配置此驱动将有助...

    linux-1.2.13 网络协议栈源码

    Linux 1.2.13 网络协议栈源码是学习TCP/IP协议栈实现的一个经典入口。这个版本的Linux内核虽然较旧,但因其简洁性和完整性,非常适合初学者深入理解网络通信的核心原理。在Linux内核中,网络协议栈是负责处理网络...

    netstat查看linux服务器网络连接状态.docx

    "netstat 命令在 Linux 服务器网络连接状态查看中的应用" Netstat 命令是一个功能强大且广泛使用的网络命令行工具,能够显示网络连接、路由表和网络接口信息。通过使用 Netstat 命令,系统管理员可以实时查看 Linux...

    mongodb-linux-x86_64-rhel70-3.6.11.tgz

    - 调整网络设置,如TCP连接超时、套接字选项等。 8. **高可用性**: - MongoDB支持复制集,可以实现数据冗余和故障切换。 - 分片集群能提高大规模数据处理能力。 以上就是关于"mongodb-linux-x86_64-rhel70-...

    go-ipfs_v0.4.22_linux-amd64.tar.gz

    5. **网络连接**:`ipfs swarm`命令用于管理节点的网络连接,包括添加和删除对等节点,查看当前连接状态等。 6. **节点配置**:通过`ipfs config`命令可以修改IPFS节点的配置,例如设置API端口、数据存储路径等。 ...

    linux-wlan-ng-0.2.5.tar.gz_linux wlan_linux 驱动_wlan

    此外,它还包含了无线扫描、网络连接状态监测等功能,使得用户可以方便地管理无线网络连接。 为了确保驱动的正常工作,你需要确保你的硬件被正确识别,可以通过`lspci`命令查看无线网卡的设备信息。如果在安装过程...

Global site tag (gtag.js) - Google Analytics