四次挥手状态图
    image.jpeg
    2MSL(端口不能复用)存在的意义:
    1.保证连接正常关闭 2.防止旧报文对新连接产生影响
    2MSL可以使得旧报文段都消失,这时候如果有新连接化身用了同一个四元组就不会产生影响
    客户端发给服务端的最后一次ACK可能会丢失,如果这时候直接关闭的话ACK丢失了对方会发送FIN报文,主动方就会发送RST报文,被动方就会有connect reset by peer,等待2MSL可以让服务端重新发来FIN报文再发一次ACK
    net.ipv4.tcp.tw_reuse可以使得客户端复用1MSL后的time-wait状态(connect时起作用,只能解决整机拒绝接入的问题,但time-wait占用的资源仍然存在)
    recycle,客户端和服务端都可以复用(不安全,在NAT网络下,新连接可能会直接被拒绝,直接在linux内核4.几版本被废弃)
    max_tw_buckets限制tw最大数量,超出后直接关闭连接 默认18万主要防DDOS攻击
    timewait是主动断开方才会有,尽量让客户端主动断开,而且如果是http服务器的话,注意connection-keepalive要开启
    根据TCP规范,收到任何的发送到未侦听端口、已经关闭的连接的数据包、连接处于任何非同步状态(LISTEN, SYS-SENT, SYN-RECEIVED)并且收到的包的ACK在窗口外,或者安全层不匹配,都要回执以RST响应(而收到滑动窗口外的序列号的数据包,都要丢弃这个数据包,并回复一个ACK包)

    close函数关闭读写方向的连接,称为孤儿连接,netstat对应的进程名为空
    shutdown可以只关闭一个方向的,关闭了写方向的之后依然可以读数据
    image.png