跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
LED灯珠捷比信 · 专业器件主题站

为什么要建立一个链接需要3次握手,而断开一个链接却需要4次波浪?

首先要解决此问题,我们需要了解一些网络知识,我们需要了解tcp方面的知识,例如三向握手和四向波动...很多人会问为什么要建立链接需要三次握手,和4断开链接挥手?让我们看一下以下流程图:首先,进行三步握手:首先,客户端发送连接请求消息,服务器部分在接受连接后响应ACK消息,并分配资源为此连接。客户端收到ACK消息后,还会向服务器段发送ACK消息并分配资源,从而建立TCP连接。然后是中间部分:可以通过以下断开连接再次在两者之间传输数据:[注意]断开的结束可以是客户端或服务器端。假定客户端发起连接请求,即发送FIN消息。服务器收到FIN消息后,它表示“我没有要在客户端上发送给您的数据”,但是如果您仍然有尚未发送的数据,则无需在服务器中关闭Socket。赶快,您可以继续发送数据。因此,您首先发送一个ACK,“告诉客户端我已经收到您的请求,但是我还没有准备好,请继续等待我的消息。”此时,客户端进入FIN_WAIT状态,并继续等待来自服务器端的FIN消息。当服务器端确定已经发送了数据时,它向客户端发送FIN消息,“告诉客户端,好的,我已经在这里完成了数据发送,并且我准备关闭连接”。客户端收到FIN消息后,“知道该连接可以关闭,但是他仍然不相信网络,因为服务器不知道要关闭它,因此在发送完该请求后,它将进入TIME_WAIT状态。确认如果服务器未接收到ACK,则可以重新启动Pass。在服务器接收到ACK之后,其“知道连接可以被断开”。客户端等待2MSL却仍未收到答复,证明服务器端已正常关闭,很好,我的客户端也可以关闭连接。好的,TCP连接是这样关闭的!这样可以理解,当客户端输入time_wait时,等待时间为2 MSL。让我们看一下Linux服务器的网络状态:#netstat-an | awk' / ^ tcp / {++ State [$ NF]} END {for(keyinState)printkey“" State [key]} ' LAST_ACK7LISTEN9SYN_RECV2CLOSE_WAIT125ESTABLISHED1070FIN_WAIT117FIN_WAIT2247CLOSING4TIME_WAIT25087对于网站而言,这种time_wait有点高,这意味着在等待2个正常MSL之后,大量关闭操作完成了,共有65535个TCP端口。如果并发性较高,则可能无法及时释放大量套接字,从而导致性能下降,因此我们可以通过linux内核进行一些网络调整。例如,启用套接字重用和快速恢复:net.ipv4。 tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_max_tw_buckets = 5000net.ipv4.tcp_max_syn_backlog = 8192net.ipv4.tcp_keepalook_SYNC_times = 1200net.ipv4。当SYN等待队列溢出时,将启用cookie进行处理,从而可以防止少量的SYN攻击。默认值为0,表示关闭;否则为0。 net.ipv4.tcp_tw_reuse = 1表示已启用重用。允许将TIME-WAITsocket重新用于新的TCP连接。默认值为0,表示它是关闭的。 net.ipv4.tcp_tw_recycle = 1表示已打开TCP连接中TIME-WAITsocket的快速恢复,默认值为0,表示已关闭。默认情况下,系统tcp_timestamps是打开的,因此,在打开tcp_tw_recycle时,实际上会激活此行为。如果服务器处于NAT环境中,出于安全原因,通常禁止tcp_tw_recycle。至于TIME_WAIT连接过多的问题,您可以通过Activate tcp_tw_reuse来缓解。 net.ipv4.tcp_max_tw_buckets = 5000表示系统同时保持TIME_WAIT套接字的最大数量。如果超过此数目,则将立即清除TIME_WAIT套接字,并打印警告消息。默认值为180000,更改为5000。对于诸如Apache和Nginx之类的服务器,前几行中的参数可以减少TIME_WAIT套接字的数量,但是对于Squid而言,效果并不理想。此参数可以控制TIME_WAIT套接字的最大数量,以防止Squid服务器被大量TIME_WAIT套接字拖到死亡。 net.ipv4.tcp_max_syn_backlog = 8192表示SYN队列的长度,默认值为1024,将队列长度增加到8192可以容纳更多等待连接的网络连接。 net.ipv4.tcp_keepalive_time = 1200表示TCP发送频率