TCP超时重传次数

TCP是可靠的,发送数据必须要收到对方的ACK,如果没有收到对发送数据的ACK,TCP就会重传;
sudo sysctl -a|grep retries查看TCP重传有关的内核参数值:
TCP重传相关的内核参数

建立连接后的重传:超时重传,或者快速重传,如果收到三个冗余ACK,则表明极有可能数据丢失,则重传,此时拥塞窗口减半,如果没有收到三个冗余ACK,但是超时了,也重传,此时拥塞窗口变为1。但是重传也是有一定次数的,由tcp_retries2决定,Linux下默认是15次,每次重传还会设定一个超时时间,最后重传了15次或者超时了则直接关闭连接。
建立连接时的重传:当第一次握手后,没有收到SYC+ACK报文时,会超时重传,次数由TCP_SYN_RETRIES决定,默认是6,6次后直接关闭;当第二次握手后,没有收到ACK时,则服务器重传SYN+ACK报文,重传次数由TCP_SYNACK_RETRIES决定。默认是5。
四次挥手中的重传:第一次挥手后,客户端进入FIN_WAIT1状态,如果没有收到来自服务器的ACK,则超时重传,重传次数由TCP_ORPHAN_RETRIES决定,其值为0,代表重传8次,收到第二次挥手的ACK后,客户端进入FIN_WAIT2状态,服务器可能数据还没有发送完,进入CLOSE_WAIT状态,但由于客户端到服务器的连接已经关闭,不可能一直等待服务器(等待其发送FIN报文),因此,也有一个超时时间 TCP_FIN_TIMEOUT,默认是60S,即60S后,若是服务器还不关闭(发送FIN),则客户端直接关闭。如果服务器发送了FIN,进入LAST_ACK,此时客户端收到,发送ACK,进入TIME_WAIT,等待2MSL,如果服务器没有收到ACK,则重传,重传次数是TCP_ORPHAN_RETRIES,超过这个次数直接关闭,在客户端的2MSL时间内,如果收到FIN,则发送ACK,再次2MSL等待,如果没收到(说明服务器已经收到ACK,可以安全地关闭连接了),则2MSL后关闭客户端的连接。为什么要等2MSL:一方面,服务器在LAST_ACK下等待客户端的ACK,超时则重传,一方面重传的报文要经过一定时间才能到达客户端,MSL是maximum-segment-lifttime.一般超时时间<=MSL,则设置2MSL可以确保如果ACK丢了肯定会收到服务器重传的FIN,另一方面:2MSL后,所有的报文肯定就失效了,这样的话,可以确保旧的报文不会影响到新的连接。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值