暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

半连接队列和全连接队列-定时拉起APP之后的一些思考(三)

彪哥分晓 2020-07-12
267

先上图,我们本片仅讨论

    两个队列,半连接队列和全连接队列。两个状态,SYN_SENT、SYN_RECV

    嫌麻烦的同学可以直接去看结论。


    两种状态分析

    SYN_SENT

    如何查看

      netstat -np | grep SYN

      如何复现

      启动如下配置的openresty

        worker_processes 1;


        events {
        worker_connections 1024;
        }


        http {
        server {
        listen 28090 backlog=16;


        location = /cent {
        content_by_lua_block {
        local index = 0
        for i = 0, 1000 * 1000 do
        for j = 0, 1000 do
        for k = 0, 5 do
        index = index + 1
        end
        end
        end
        ngx.say("ok\t", index)
        }
        }
        }
        }

        在打压机器上执行

          ./wrk -c 1000 'http://172.26.186.7:28090/cent'

          出现了很多的syn_sent状态的包

          半连接队列已满

          全连接队列已满

          抓包图

          从抓包图上看,仅看到客户端发给服务端的SYN包,而没有看到服务端回的回应。则说明服务端发生了对新建连接的丢包处理。

          SYN_RECV

          如何查看

          在服务端执行

            netstat -np | grep -c SYN_REC

            如何复现

            在压测机端执行

              sudo hping3 -S -p 28090 172.26.186.7 --flood

              在服务端半连接状态如下所示。

              全连接状队列态如下所示

              可以看到半连接队列已满,而全连接队列还是为空。

              抓包图

              从抓包图中可以明显看到发起syn flood 的时候TCP仅有两次握手包而没有客户端第三次的确认包。

              结论

              一图胜千言。当然了,全连接队列未满也可能会丢弃包。本文不做讨论。


              文章转载自彪哥分晓,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论