TCP常见问题(二) | 青训营笔记

168 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记

在 TCP 正常挥手过程中,处于 TIME_WAIT 状态的连接,收到相同四元组的 SYN 后会发生什么?

MSL报文最大生存时间,在Linux中默认30s

如果双方开启了时间戳机制:

1、如果客户端的 SYN 的「序列号」比服务端「期望下一个收到的序列号」要并且SYN 的「时间戳」比服务端「最后收到的报文的时间戳」要。那么就会重用该四元组连接,跳过 2MSL 而转变为 SYN_RECV 状态,接着就能进行建立连接过程。

2、如果客户端的 SYN 的「序列号」比服务端「期望下一个收到的序列号」要或者SYN 的「时间戳」比服务端「最后收到的报文的时间戳」要。那么就会再回复一个第四次挥手的 ACK 报文,客户端收到后,发现并不是自己期望收到确认号,就回 RST 报文给服务端

在 TIME_WAIT 状态,收到 RST 会断开连接吗?

可以自由设置是否提前结束TIME_WAIT状态断开连接

TCP连接一端断电和进程崩溃有什么区别

无数据发送情况如下:

先说一下tcp_keepalive:默认不启用,当应用程序启用tcp_keepalive时,若客户端长时间不与服务器进行通信,那么服务器会进行保活机制,每隔一段时间向客户端发送一条消息,若客户端回应则重新设置保活计时器,若客户端连续几次都没有回应,那么服务器就会认为客户端已经不再存活之后便会与客户端断开连接

在tcp没有启动保活机制的情况下:

🍿若客户端主机断电,那么服务器将一直处于establish阶段,直到服务端重启进程

🍿若客户端进程崩溃,操作系统是能够感知到的,之后客户端发送FIN将于服务器进行四次挥手

有数据发送情况:

若客户端宕机并立即重启,客户端重新接收到服务器消息后会回复RST报文以重置连接

若客户端宕机没有重启,服务器将重传消息,直到先达到最大超时时间或者最大重传次数,之后便会停止重传向应用程序汇报tcp连接有问题

拔掉网线后tcp连接还在吗

有数据发送情况:

客户端拔掉网线后,tcp连接在Linux内核上的状态并没有改变,也就是说拔掉网线不会影响tcp连接的状态,双方都处于establish状态,当服务端发送数据时,等待一段时间将会超时重传,之后若及时重新插上网线,客户端将会接收消息就像是正常连接的tcp一样。若插网线不及时此时服务端已经断开连接了,那么之后客户端若发送消息给服务端,服务端将回送RST报文,之后客户端也将会断开TCP连接。

无数据发送情况:

若启用tcp_keepalive,过一段时间后双方都将启动保活机制,

若无tcp_keepalive,双方就会一直处于establish状态

tcp_tw_reuse为什么是默认关闭的

🍿现在考虑这样一种情况,服务器端口尚未打开,客户端发送请求想要连接,服务器发送RST,这个RST被延时了,之后服务器端口打开,三次握手四次挥手正常,现在客户端处于time_wait状态,客户端复用处于time_wait状态的四元组继续与此服务器建立连接,三次握手之后服务器上次连接的RST到了,这时候RST被客户端接收,客户端会断开TCP连接,这种就属于异常了

🍿会使被关闭方不正常关闭,客户端第四次挥手没有到达服务端,服务端就需要重传FIN,再次到达客户端时客户端已不再和此服务器连接,会发送RST使得服务端不正常关闭

\