1 概述

  • TCP提供可靠的运输层。
  • 可靠性保证之一:确认从另一端收到的数据。
  • 但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。
  • 如果当定时器溢出时还没有收到确认,它就重传该数据。
  • TCP对于每个连接TCP管理4个不同的定时器:
    • 重传定时器:使用于当希望收到另一端的确认。
    • 2MSL定时器:测量一个连接处于TIME_WAIT状态的时间。
    • 坚持(persist)定时器:使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口
    • 保活(keepalive)定时器:用于检测一个空闲连接的另一端何时崩溃或重启。

2 TCP的状态机

超时情况

  • 建立连接时SYN超时

    • client主动打开连接,发送SYN报文给server
    • server收到后被动打开,发送SYN+ACK报文给client,此时client直接下线
    • 导致server无法收到client的ACK报文,即该TCP连接既没有建立也没有断开,所以server又会重传SYN+ACK报文
    • 在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,TCP才会把断开这个连接。
  • SYN Flood

    • 恶意伪造大量的TCP连接并断开Client,导致Server维持了大量的TCP连接,且需要63秒后才会断开,即63秒内的TCP连接数足够多时,Server将承受不住,导致正常的连接不能处理。
    • 处理方案:
      • 减少Server的重试次数
      • 增大SYN的连接数
      • 处理不过来的连接直接丢弃
  • ISN的初始化

    • ISN不是每次建立建立连接时都从1开始
    • 问题:因为如果从1开始,client发送了30个segment给server,此时网络断开,过会client重连,又使用ISN=1来发送报文,但之前的报文已经送到了,即server认为client的ISN(初始化序列号)为30,但是实际上为1。
    • 解决方法:ISN会和一个假的时钟绑在一起,这个时钟会在每4微秒对ISN做加一操作,直到超过2^32,又从0开始。
    • MSL(Maximum Segment Lifetime):TCP段的最大存活时间,4ms*2^32=4.55小时,即TCP段存活时间不超过4.55小时就不会重用ISN。
  • MSL 和 TIME_WAIT:

    • 在TCP的状态图中,从TIME_WAIT状态到CLOSED状态,有一个超时设置,这个超时设置是 2 * MSL。
    • TIME_WAIT(2 * MSL):确保有足够的时间让对端收到了ACK,如果被动关闭的那方没有收到Ack,就会触发被动端重发FIN,一来一去正好不超过2 * MSL。
    • 有足够的时间让这个连接不会跟后面的连接混在一起(有些路由器会缓存IP数据包,导致连接被重用)。

3 TCP重试机制(发送方)

(1)概述

TCP要保证所有的数据包都到达,必需有重传机制。

发送端发了1,2,3,4,5一共五份数据,接收端收到了1,2,于是回ack 3,然后收到了4(注意此时3没收到),此时的TCP会怎么办?

(2)超时重传机制

  • 不回ACK,一直等待SN=3的到来,而发送方一直收不到3的ACK,就会超时重传3.
  • 这种方式会有严重的问题,那就是死等3,所以导致4和5已经被收到了,而发送方也完全不知道(没有收到ACK),所以发送方可能会悲观地认为也丢了(即有可能导致4和5的重传)。
  • 发送方的两种选择
    • 仅仅重传timeout的包,节约宽带,但是需要继续等待后续报文ACK或者timeout重传(效率低)。
    • 重传timeout后的所有包,浪费宽带,而且可能做了无用功。

(3)快速重传机制

  • 如果发送方发出了1,2,3,4,5份数据,1先到了,于是就ack回2,结果2因为某些原因没收到。3到达了,ack也回2,后面的4和5都到了,ack也回2(2没有收到)。
  • 于是发送端收到了三个ack=2的确认,知道了2还没有送达,于是重传2(或者2之后的所有包)。然后接收端收到了2,此时3,4,5都收到了,于是ack回6。
  • 优点:不需要等待ACK超时,但是仍然没有解决是重传2还是重传2与之后的所有包。

(4)SACK 方法

  • SACK回复可以告知发送端需要排除哪些报文进行发送
  • 该协议需要两边都支持。

强烈建议看看叔的文章

参考:https://coolshell.cn/articles/11564.html

TCP协议探究(二):超时与重试的更多相关文章

  1. 高并发服务器建议调小 TCP 协议的 time_wait 超时时间。

    1. [推荐]高并发服务器建议调小 TCP 协议的 time_wait 超时时间. 说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服 务器端会因为处于 ...

  2. TCP协议探究(一):报文格式与连接建立终止

    一 TCP:传输控制协议报文格式 1 TCP服务 提供面向连接.可靠的字节流服务 面向连接意味着两方通信,不支持多播和广播 可靠性的支持: 应用数据被分割成TCP认为最适合发送的数据块.由TCP传递给 ...

  3. TCP协议探究(四):定时器

    1 概述 重传定时器:使用于当希望收到另一端的确认. 坚持(persist)定时器:使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口 保活(keepalive)定时器:用于检测一个空闲连接的另一 ...

  4. TCP协议探究(三):RTT、滑动窗口和阻塞处理

    1 RTT算法 1.1 概述 上一节说了重传机制需要设置一个重传超时值(RTO,Retransmission TimeOut),RTO设长了,重发太慢:设短了,可能导致包没有丢,就重发了,可能导致雪崩 ...

  5. Wireshark分析之TCP协议(二)

    (1)TCP首部格式 源端口:   用来传输数据报的端口 目标端口: 数据包将要发送到的端口 序号: 用来表示一个TCP片段.这个值用来表示数据流中的部分数据没有丢失 确认号:  表示通信中希望从另一 ...

  6. 高并发服务器建议调小 TCP 协议的 time_wait 超时时间

    说明:操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接,在高并发访问下,服 务器端会因为处于 time_wait 的连接数太多,可能无法建立新的连接,所以需要在服务器上 调小此 ...

  7. TCP/UDP协议(二)

    面试问题:Tcp/Udp协议是什么,各有什么异同点,各自的使用场景? Tcp协议(传输控制协议) tcp是面向连接的协议,在收发数据之前,必须与对方建立可靠的连接: 三次握手:简单形象通俗描述: 主机 ...

  8. 网络编程(二)--TCP协议、基于tcp协议的套接字socket

    一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...

  9. 网络编程(二)——TCP协议、基于tcp协议的套接字socket

    TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...

随机推荐

  1. Java实现单例的5种方式

    1. 什么是单例模式 单例模式指的是在应用整个生命周期内只能存在一个实例.单例模式是一种被广泛使用的设计模式.他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存. 2. 单例模 ...

  2. 黑马vue---59-60、组件中的data和methods

    黑马vue---59-60.组件中的data和methods 一.总结 一句话总结: 1. 组件可以有自己的 data 数据 2. 组件的 data 和 实例的 data 有点不一样,实例中的 dat ...

  3. Vue于React特性对比(三)

    最近重学React,再次和vue做了对比. 一,为官方插件提供便利的第三方插件横行 React仅仅是一个ui框架.虽然官方提供了redux,react-router:但也有第三方的redux-thun ...

  4. drawable,andrid 圆形图片,圆角图片

          各种drawable 小的例子,   开源中国地址:https://git.oschina.net/lyxs916/drawable-test.git               bitm ...

  5. export default {} 和new Vue()区别?

    export default 的用法:相当于提供一个接口给外界,让其他文件通过 import 来引入使用. 而对于 new Vue({})部分, 只是创建一个Vue的实例 就是相当于创建一个根组件 h ...

  6. 如何用CSS3来实现卡片的翻转特效

    CSS3实现翻转(Flip)效果 动画效果 效果分析 当鼠标滑过包含块时,元素整体翻转180度,以实现“正”“反”面的切换. HTML分析 分析:.container,.flip为了实现动画效果做准备 ...

  7. [C++/JavaScript]数据结构:栈和数列>案例引入(数制的转换)

    1 案例1:数制的转换 1.1 背景与原理 1.2 编程复现 (JavaScript版 复现) function convert(value, d){ stack = []; // 栈 result ...

  8. Navicat连接MySQL 8出现2059 - authentication plugin 'caching_sha2_password'的解决办法

    进入MySQL控制台,执行如下命令: use mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY ...

  9. C-Lodop提示Access violation at address ...in module 'CLodopPrint32.exe' write of address

    C-Lodop提示 Access violation at address ……in module 'CLodopPrint32.exe' write of address ……最近遇到了个问题,上午 ...

  10. 【ARTS】01_22_左耳听风-201900408~2019004014

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...