TCP3次握手和backlog溢出

来源:互联网 发布:网络社区 编辑:程序博客网 时间:2024/05/22 15:15

TCP3次握手,实际上可分为4步:

客户端发起connect(),发送SYN j

服务器从SYN queue中建立条目,响应SYN k, ACK J+1

客户端connect()成功返回,响应ACK K+1

服务器将socketSYN queue移入accept queueaccept()成功返回

注:SYN/FIN各占一个序列号,ACK/RST不占序列号



SYN queue长度由
tcp_max_syn_backlog指定,accept queue则由net.core.somaxconn决定,listen(fd, backlog)backlog上限由somaxconn决定;

Backlog解释

Now it specifies the queue length for completely established sockets waiting to be accepted, instead of the number of incomplete connection requests.

The maximum length of the queue for incomplete sockets can be set using the tcp_max_syn_backlog sysctl.

When syncookies are enabled there is no logical maximum length and this sysctl setting is ignored.

If the socket is of type AF_INET, and the backlog argument is greater than the constant SOMAXCONN (128 default), it is silently truncated to SOMAXCONN.

客户端connect()返回不代表TCP连接建立成功,有可能此时服务器accept queue已满,OS会直接丢弃后续ACK请求;

客户端以为连接已建立,开始后续调用(譬如send)等待直至超时;

服务器则等待ACK超时,会重传SYN k, ACK J+1给客户端(重传次数受限net.ipv4.tcp_synack_retries)

注:accept queue溢出,即便SYN queue没有溢出,新连接请求的SYN也可能被drop

Accept backlog is full. If we have already queued enough of warm entries in SYN queue, drop request. It is better than clogging SYN queue with openreqs with exponentially increasing timeout.

clog:


如何查看accept queue溢出

Netstat -s | grep LISTEN 返回***SYNS to LISTEN sockets ignored



以下案例全部来自维信公众号基础架构快报”TCP三次握手之backlog”,感兴趣的可以加微信阅读原文。


案例1

Nginx作为7层反向代理,客户端HTTP请求 – NGINX – 透明代理,透明代理接口存在大量慢请求;


思路

抓包,客户端同nginx通信,nginx立即返回ACK(1ms),但是3s后才返回响应数据;

Nginx同后端通信,发送SYN请求等待3s后端才响应;


结论

Backlog设置过小,导致accept queue溢出,SYN被丢弃导致3s重传;

backlog50增加到512somaxconn=512

案例2

Testserver随机生成RAR/ZIP文件,testclient访问testserver获取生成文件,所有调用采用block方式;

运行一段时间后程序永久阻塞,strace发现testclient阻塞在recvmsg


思路

抓包观察3次握手协议,服务器返回SYN+ACK,客户端响应ACK,可服务器再次发送同样的SYN+ACK

客户端响应的ACK丢包,而net.ipv4.tcp_synack_retries = 1


结论

三次握手最后一步失败,server保持SYN_RECV状态等待接收ACKclient发送ACK状态变为ESTABLISHED其认为connect()成功故接着调用recvmsg()

Syn+ack被设置为只重传一次,若这次重传仍失败,则客户端永久阻塞

其他案例1

Backlog过大,连接积压在accept queuenginx由于连接超时而断开PHP accept返回时连接已被客户端close,故报告PHP write Broken pipe


其他案例2

Backlog过小,accept queue溢出,握手第3步的ACK被丢弃,但client认为连接成功并发送数据,造成所谓慢请求


http://jaseywang.me/2014/07/20/tcp-queue-%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/


http://blog.itpub.net/15480802/viewspace-1399303/


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝评价错了追评评价错了怎么办 淘宝给客户退款后还给差评怎么办 淘宝账号处于下单保护状态怎么办 淘宝卖家物流单号写错了怎么办 有个人给我发直播消息怎么办 网贷申请多了现在秒拒怎么办 顺丰快递寄的瓜果坏了怎么办 淘宝退货快递公司填错了怎么办 不小心把淘宝账号注销了怎么办 腾讯视频会员开通一个月贵怎么办 微交易买美国指数输了四千块怎么办 淘宝地址中包含了违禁词怎么办 微信支付失败但是钱扣了怎么办 支付宝向别人收款交易关闭了怎么办 从淘宝充的晋江币充值异常怎么办 接手转让店铺会员要求退卡怎么办 转转买手机卖家拒绝退款怎么办 淘宝买的东西电话号码留错了怎么办 平板电脑没电关机没保存文件怎么办 恢复出厂设置需要谷歌账号怎么办 华为手机云端里照片删除了怎么办 客户退货卖家一直没收到货怎么办 在淘宝买到假货投诉不管用怎么办 差评不接电话不回旺旺不要钱怎么办 饿了么同行恶意差评怎么办 苹果手机更新后淘宝用不了怎么办 淘宝网快递丢件了买家怎么办 评价后忘了截图五星好评怎么办 在淘宝被骗了好评返现怎么办 苹果4s微信版本过低怎么办 微信版本太低无法登录怎么办 苹果4微信版本低登录不了怎么办 安卓手机微信版本低登录不了怎么办 苹果微信版本低登录不了怎么办 安装包与当前版本不兼容怎么办 游戏与苹果手机系统不兼容怎么办 闲鱼买家申请退款不退货怎么办 在淘宝买的战地1登录不了怎么办 支付宝转账到注销的账号怎么办 支付宝用户支付密码被锁定怎么办 淘宝提现需要的手机宝令怎么办