- 浏览: 407740 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
秦时明月黑:
深入浅出,楼主很有功底
hive编译部分的源码结构 -
tywo45:
感觉好多错误,但还是支持!
HDFS+MapReduce+Hive+HBase十分钟快速入门 -
xbbHistory:
解析的很棒!!
Linux-VFS -
darrendu:
执行这个命令,bin/hadoop fs -ls /home/ ...
Hadoop示例程序WordCount运行及详解 -
moudaen:
请问楼主,我执行总后一条语句时,执行的是自带的1.sql,你当 ...
TPC-H on Hive
TCP A TCP B
1. ESTABLISHED ESTABLISHED
(Close)
2. FIN-WAIT-1 --> <SEQ=100><ACK=300><CTL=FIN,ACK> --> CLOSE-WAIT
3. FIN-WAIT-2 <-- <SEQ=300><ACK=101><CTL=ACK> <-- CLOSE-WAIT
(Close)
4. TIME-WAIT <-- <SEQ=300><ACK=101><CTL=FIN,ACK> <-- LAST-ACK
5. TIME-WAIT --> <SEQ=101><ACK=301><CTL=ACK> --> CLOSED
一 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. 没有任何连接状态 */
TCP 状态图:
二
TCP
正常关闭连接的状态变化
根据《TCP/IP详解》中的TCP的建立和终止中有关"TCP的终止"的讲解
TCP的终止通过双方的四次握手实现。发起终止的一方执行主动关闭,响应的另一方执行被动关闭。
1. 发起方更改状态为FIN_WAIT_1,关闭应用程序进程,发出一个TCP的FIN段;
2. 接收方收到FIN段,返回一个带确认序号的ACK,同时向自己对应的进程发送一个文件结束符EOF,同时更改状态为CLOSE_WAIT,发起方接到ACK后状态更改为FIN_WAIT_2;
3. 接收方关闭应用程序进程,更改状态为LAST_ACK,并向对方发出一个TCP的FIN段;
4. 发起方接到FIN后状态更改为TIME_WAIT,并发出这个FIN的ACK确认。ACK发送成功后(2MSL内)双方TCP状态变为CLOSED。
三 Time_Wait 状态解释
根据TCP协议,主动发起关闭的一方,会进入TIME_WAIT状态(TCP实现必须可靠地终止连接的两个方向(全双工关闭)),持续2*MSL(Max Segment Lifetime),缺省为240秒.
TIME_WAIT的等待时间为2MSL,即最大段生存时间.如果 TIME_WAIT
状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。第二个拥有相同相关五元组的连接出现(因为连接终止前发起的一方可能需要重发
ACK,所以停留在该状态的时间必须为MSL的2倍。),而第一个连接的重复报文到达,干扰了第二个连接。TCP实现必须防止某个连接的重复报文在连接终
止后出现,所以让TIME_WAIT态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被丢弃。建立第二个连接的时候,不
会混淆。
为什么TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
修改Time_Wait参数的方法
Windows下在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的
DWORD键,设置为60,以缩短TIME_WAIT的等待时间
Linux下修改:
vi /etc/sysctl.conf
编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p 让参数生效。
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
Time_Wait
引发的问题
:
Timewait是正常的现象,但是比较多的时候(比如3000)则可能引发CPU利用率高需要有效降低
四 Close_Wait 状态解释
CLOSE_WAIT状态的生成原因
通过TCP的状态图我们可以看出只有被动关闭的一端才有CLOSE_WAIT状态,当收到Fin并发送了Ack后
服务器状态就变成了CLOSE_WAIT状态,如果我们的服务器一直处于CLOSE_WAIT状态的话,说明套接字是被动关闭的!,并且没有发送Fin信令,原因往往是没有调用TCP的CloseSocket。
解决CLOSE_WAIT的方法:
1 一般原因都是TCP连接没有调用关闭方法。需要应用来处理网络链接关闭。
2 对于Web请求出现这个原因,经常是因为Response的BodyStream没有调用Close.
比如Widnows下:
使用HttpWebRequest 一定要保证GetRequestStream和GetResponse对象关闭,否则容易造成连接处于CLOSE_WAIT状态
3 TCP的KeepLive功能,可以让操作系统替我们自动清理掉CLOSE_WAIT的连接。
但是KeepLive在Windows操作系统下默认是7200秒,也就是2个小时才清理一次。往往满足不了要求。可以调小该数值。
Windows下的调整方法为
HKEY_LOCAL_MACHINE\CurrentControlSet\Services\Tcpip\Parameters下的以下三个参数:
KeepAliveInterval,设置其值为1000
KeepAliveTime,设置其值为300000(单位为毫秒,300000代表5分钟)
TcpMaxDataRetransmissions,设置其值为5
Close_Wait引发的问题:
Close_Wait会占用一个连接,网络可用连接小。数量过多,可能会引起网络性能下降,并占用系统非换页内存。 尤其是在有连接池的情况下(比如HttpRequest)
会耗尽连接池的网络连接数,导致无法建立网络连接TCP的状态
发表评论
-
密钥和加密算法,MAC和PIN
2013-03-06 22:04 4988举个很简单的例子,比如凯撒密码,就是将字母循环后移n位,这 ... -
spin lock与mutex
2011-11-12 20:25 1086http://www.udpwork.com/item/119 ... -
strcpy, memcpy和memmove的区别
2011-11-05 13:34 1695char* strcpy(char* strDest, con ... -
sizeof
2011-10-27 18:25 1056对于char str[] = "abcdef&q ... -
linux内存分布
2011-10-19 22:23 1002linux下堆,栈和代码段的分布情况,我直接说的是堆最大,其次 ... -
tcp三次握手和time wait
2011-10-19 22:12 1752第一次握手:建立连接 ... -
C语言中int 类型的字节长度
2011-08-22 18:02 2801int 这个数据类型比较特殊,具体分配的字节数与机器字长 ... -
一些资料
2011-07-16 20:20 2从 B 树、 B+ 树、B* 树谈 ... -
cookie和session机制之间的区别与联系
2011-07-04 20:11 835这些都是基础知识,不过有必要做深入了解。先简单介绍一下。 二 ... -
cookie和session机制之间的区别与联系
2011-07-04 20:11 3这些都是基础知识,不过有必要做深入了解。先简单介绍一下。 二 ... -
eclipse安装svn插件
2011-03-22 15:42 811http://subclipse.tigris.org/ser ... -
二进制文件和文本文件
2010-12-01 16:59 1480二进制文件和文本文件 ... -
二进制文件和文本文件
2010-12-01 16:58 1053二进制文件和文本文件 关键字: 二进制文件和文本文件 ... -
Ignoring the Great Firewall of China
2010-03-30 23:37 2013http://www.lightbluetouchpaper. ... -
分类和聚类
2010-01-04 20:33 2487简单地说,分类(Categoriz ... -
堆和栈
2009-12-19 01:14 1041堆和栈的区别 (转贴) 非本人作也!因非常经典,所以收归旗下 ... -
Java堆和栈 内存分配
2009-12-19 01:13 1066堆和栈的区别 Java把内存划分成两种:一种是栈内存,一种是 ...
相关推荐
### TCP状态机详解 #### 一、引言 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。本文旨在深入解析TCP状态机的工作原理及其背后的逻辑,以便读者能够更好地理解和...
TCP(Transmission Control Protocol)是一...理解TCP状态转换对于排查网络连接问题,优化连接建立和关闭的流程,以及处理异常网络条件非常重要。在Windows编程中,正确处理这些状态能够确保网络程序的稳定性和可靠性。
以下将详细解析TCP状态变迁图及其各个状态之间的转换。 1. **CLOSED**: 这是TCP连接的初始状态,表示连接未建立,没有活动的数据传输。 2. **LISTEN**: 当一个服务器端进程准备接收客户端连接请求时,它会进入...
TCP状态机是TCP连接的变化过程 :Tcp在三次握手和四次挥手的过程,就是一个tcp的状态说明,由于tcp是一个面向连接的,可靠的传输,每一次的传输都会经历连接,传输,关闭的过程,无论是哪个方向的传输,必须建立连接...
本文将详细阐述TCP状态转换图中的关键状态,主要关注三次握手和四次挥手过程。 首先,TCP连接的建立过程,也就是著名的三次握手: 1. **CLOSED**: 所有连接的起始和结束状态,表示没有任何连接活动。 2. **LISTEN*...
"TCP 状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题解决" TCP 状态迁移是 TCP 协议中的一种机制,它用于描述 TCP 连接的不同状态。在 TCP 连接中,客户端和服务器端都可以处于不同的状态,例如 ESTABLISHED、CLOSE_WAIT...
TCP状态转换和IO多路转接 TCP状态转换是网络协议中的一种关键技术,它定义了TCP连接的七个状态:LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2和TIME_WAIT。这些状态之间的转换是通过三次握手...
然而,TCP的状态管理复杂,对于实时性要求高的网络游戏来说,如何准确预测和控制TCP状态成为了一个挑战。本文件"网络游戏-基于LSTM循环神经网络的TCP状态估计方法研究"探讨了利用LSTM(Long Short-Term Memory)循环...
下面我们将详细探讨TCP状态转换的各个阶段。 1. **CLOSED**: 这是TCP连接的初始和最终状态,表示连接未建立或已关闭。 2. **LISTEN**: 当一个TCP端点准备接受来自其他端点的连接请求时,它进入LISTEN状态。在这个...
tcp状态图,高清,可以收藏多年。
netstat TCP状态栏排序并统计脚本
### TCP有限状态机详解 #### 一、引言 TCP(传输控制协议)是一种面向连接的、可靠...了解TCP状态机对于理解TCP协议的工作原理至关重要,尤其对于网络工程师而言,掌握这些基础知识对于解决实际网络问题非常有帮助。
TCP状态转换图详解.pdf
labview tcp 检查连接状态.png labview tcp 检查连接状态.png
用VISSO画的TCP协议状态图,用于表示TCp的状态的转换.
察看tcp状态的小程序,可以单独使用,功能没有sniffer强大,但是可以效用以下
TCP、UDP、伪头部、ICMP、ARP、链路封包、协议类型、OSI、TCPIP、TCP状态、CoAP、code协议说明
TCP/IP协议的状态迁移图是理解TCP/IP工作原理的关键,它展示了TCP连接从建立到终止会经过的各种状态,以及触发这些状态变化的事件。 首先,让我们详细解释各个状态: 1. LISTEN:监听状态。在这种状态下,服务器端...