TCP的三次握手(建立连接)和四次挥手(关闭连接)

  

在平常运维服务器的时候,需要查看各种连接状态,所以必须要对TCP连接状态非常熟悉才知道每个状态的意义,只有知道了这些参数的意义才可以相对应的优化。

[root@tomcat10日志]# netstat na | awk '/^ TCP/{s[6]美元+ +}结束{(s)的关键打印键,s(例子)}”   TIME_WAIT 1443   CLOSE_WAIT 1122   SYN_SENT 3   FIN_WAIT1 2074   FIN_WAIT2 195   成立于89782年   SYN_RECV 7314   听9   关闭9   LAST_ACK 2372

<强>

<李>

听:表示监听的TCP端口已经打开;

<李>

SYN_SENT:客户端在发送建立连接(SYN)请求后的状态;

<李>

SYN_RECV:服务端在收到SYN请求建立连接后,发送SYN + ACK后的状态;

<李>

:建立客户端在发送完后消的状态,服务端在收到ACK后的状态,此时连接正式建立;

<李>

FIN_WAIT1:客户端发送完鳍后的状态;

<李>

CLOSE_WAIT:服务端收到客户端的鳍请求后,发送对鳍的ACK后的状态;

<李>

FIN_WAIT2:收到服务端发送的对之前鳍的ACK后的状态;

<李>

LAST_ACK:服务端处理完最后的数据,发送鳍后的状态;

<李>

TIME_WAIT:收到服务端发送的鳍后的状态,表示处于空闲等待阶段;

<李>

关闭:TIME_WAIT时间到达后,发送对鳍的确认ACK后的状态,发送完ACK表示连接已关闭,

<李>

关闭:连接双方同时发送关闭请求和确认时的状态;

 TCP的三次握手(建立连接)和四次挥手(关闭连接)

 TCP的三次握手(建立连接)和四次挥手(关闭连接)  TCP的三次握手(建立连接)和四次挥手(关闭连接)

。先由客户端向服务器端发送一个鳍,请求关闭数据传输。

b。当服务器接收到客户端的鳍时,向客户端发送一个ACK,其中ACK的值等于鳍+>

c。然后服务器向客户端发送一个鳍,告诉客户端应用程序关闭。

d。当客户端收到服务器端的鳍是,回复一个ACK给服务器端。其中ACK的值等于鳍+>


。确保数据能够完成传输。

b。但关闭连接时,当收到对方的鳍报文通知时,它仅仅表示对方没有数据发送给你了;

c。但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭插座,也即你可能还需要发送一些数据给对方之后

d。再发送鳍报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和鳍报文多数情况下都是分开发送的。

<强>

<强>

服务端收到建立连接的SYN没有收到ACK包的时候处在SYN_RECV状态。有两个相关系统配置:

1。net.ipv4。tcp_synack_retries——比;默认值是5

 TCP的三次握手(建立连接)和四次挥手(关闭连接)

对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个SYN连接请求包。这是所谓的三次握手(三因子握手)机制的第二个步骤。这里决定内核在放弃连接之前所送出的SYN + ACK数目。不应该大于255年,默认值是5,对应于180秒左右时间。通常我们不对这个值进行修改,因为我们希望TCP连接不要因为偶尔的丢包而无法建立。

2。net.ipv4。tcp_syncookies——比;默认值是1

 TCP的三次握手(建立连接)和四次挥手(关闭连接)

一般服务器都会设置net.ipv4。tcp_syncookies=1来防止SYN洪水* * *。假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN + ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN + ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN超时,一般来说这个时间是分钟的数量级(大约为30秒2分钟)。

这些处在SYNC_RECV的TCP连接称为半连接,并存储在内核的半连接队列中,在内核收到对端发送的ACK包时会查找半连接队列,并将符合的requst_sock信息存储到完成三次握手的连接的队列中,然后删除此半连接。大量SYNC_RECV的TCP连接会导致半连接队列溢出,这样后续的连接建立请求会被内核直接丢弃,这就是SYN洪水* * *。

TCP的三次握手(建立连接)和四次挥手(关闭连接)