前言:

关于TCP协议的重传策略,是TCP数据传输正确性的重要保证。

由于下层网络层协议可能出现的包丢失、重复、失序包等问题,当TCP协议基于某种策略确认当前包已经发生以上情况,就会启动重传。

TCP拥有两套机制来完成重传:基于超时时间;基于确认消息(SACK);

本文主要来模拟下基于超时时间的重传。

1.环境准备

笔者准备两台机器,一台启动ServerSocket服务,另一台就启动telnet命令进行连接发送请求等操作

1.1 ServerSocket

笔者这里使用的是标准的java ServerSocket,来启动一个端口监听,代码如下:

public class BIOServerSocket {private String address;private int port;public BIOServerSocket(String address, int port) {this.address = address;this.port = port;}public void startServer() {try {ServerSocket serverSocket = new ServerSocket();serverSocket.bind(new InetSocketAddress(address, port));System.out.println("bio server start...");while (true) {Socket clientSocket = serverSocket.accept();System.out.println("client connect...");// 写入 threadServerWriteThread serverWriteThread = new ServerWriteThread(clientSocket);serverWriteThread.start();// 读取数据read(clientSocket);}} catch (IOException e) {e.printStackTrace();}}private void read(Socket clientSocket) {try {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String msg = "";while ((msg = bufferedReader.readLine()) != null) {System.out.println("receive msg: " + msg);}} catch (IOException e) {try {clientSocket.close();} catch (IOException ex) {ex.printStackTrace();}e.printStackTrace();}}public static void main(String[] args) {String address = "192.168.3.8";int port = 9999;BIOServerSocket bioServerSocket = new BIOServerSocket(address, port);bioServerSocket.startServer();}
}/*** 从Scanner获取输入信息,并写回到client*/
class ServerWriteThread extends Thread {private Socket socket;private PrintWriter writer;private Scanner scanner;public ServerWriteThread(Socket socket) throws IOException{this.socket = socket;scanner = new Scanner(System.in);this.writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);}@Overridepublic void run() {String msg = "";try {while ((msg = scanner.nextLine()) != null) {if (msg.equals("bye")) {socket.close();break;}writer.println(msg);}} catch (Exception e) {e.printStackTrace();}}
}

代码很简单,笔者不再多述。

1.2 启动客户端telnet

笔者在另一台机器上(Ubuntu docker)启动一个telnet命令,用来创建对上述ServerSocket的连接

root@93de58bae514:/# telnet 192.168.3.8 9999
Trying 192.168.3.8...
Connected to 192.168.3.8.
Escape character is '^]'.

1.3 wireshark监听

笔者在这里提前启动wireshark监听服务,当1.2步骤中的telnet执行完成后,我们可以看到三次握手建立完成。如下所示:

2.超时重传模拟

这里的超时重传,我们本质上是在模拟当客户端发送数据包后,在规定时间内没有收到服务端的ACK包时,自发的一种重传当前数据包策略。

我们通过客户端来模拟下该动作

2.1 正常收发包

客户端正常发包

root@93de58bae514:/# telnet 192.168.3.8 9999
Trying 192.168.3.8...
Connected to 192.168.3.8.
Escape character is '^]'.# 以下数据包逐个发送出去
a
b
c

服务端正常收到以上数据包

client connect...
receive msg: a
receive msg: b
receive msg: c

2.2 模拟网络异常后的发包

如果模拟两台机器之间的网络异常呢?

笔者就直接把服务端的网络禁止掉(服务端笔者使用的是Windows电脑,直接设置成飞行模式,这样外部请求就进不来),此时服务端程序还在,但是无法收发数据包

此时客户端再次发送数据包

root@93de58bae514:/# telnet 192.168.3.8 9999
Trying 192.168.3.8...
Connected to 192.168.3.8.
Escape character is '^]'.# 以下数据包逐个发送出去
a
b
c# 网络异常后再次发送数据包
d
Connection closed by foreign host.

这时我们再看服务端,没有出现receive msg: d,说明客户端的数据包确实没有发送到服务端。

那么数据在哪呢?我们还是通过wireshark来看下包的发送情况:

在163行数据第一次发送数据d失败后,后续一直在重试,一直重试到336行数据为止。

2.3 TCP超时重传规律

根据wireshark的包发送情况,我们可以总结出来这么些规律

1.与SYN包重传策略类似,数据包的重传基本也是指数级避退的(看第二列数据[发送时间]可以看出这个规律)

2.数据包的重传有个最大限制,上图中重传了15次,最终直接关闭了连接

2.4 TCP超时重传阈值设置

TCP拥有两个阈值来决定如何重传同一个报文段。

R1表示TCP再向IP层传递消极建议前,愿意尝试重传的次数;

R2表示指示TCP应放弃当前连接的时机

可以通过查看系统参数获取:

root@93de58bae514:/# sysctl -a | grep net.ipv4.tcp_retries
sysctl: reading key "net.ipv6.conf.all.stable_secret"
net.ipv4.tcp_retries1 = 3  # R1
net.ipv4.tcp_retries2 = 15 # R2

基于R2而言,比较符合我们上述测试的结果,在重试了15次之后,终于放弃重试,关闭当前连接。

总结:

笔者在模拟这个重传还是比较困难的,一直想不到好的办法来模拟,直接关闭服务端进程的话,同时所有的客户端连接也被直接关闭了。

后来才想明白,直接关闭网络,太为难了。

TCP超时重传策略看了N多遍,但总是忘记,所以最好的学习的办法还是实战。实战一次之后就特别清晰了。

与君共勉之!

TCP协议基于计时器的重传策略模拟实战相关推荐

  1. 基于[Python]的ATM取款机模拟实战

    基于[Python]的ATM取款机模拟 -------------------------------- 简介 使用python语言来完成一个ATM取款机,要求功能入下: a)实现用户输入密码 b)实 ...

  2. 网络协议:超时与重传机制

    一 TCP 为什么需要重传 因为网络层有可能出现数据包丢失,数据包重复或者无序的情况.为了保证数据传输正确,不重复和有序,所以TCP才提供可靠的数据传输服务.为了保证数据传输的正确性,所以TCP重传它 ...

  3. Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解

    今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...

  4. tcp 协议中发送窗口的大小应该是_TCP 协议中的三次握手与四次挥手

    今天来聊聊面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手.涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详解 4.什么是 TIME_ ...

  5. TCP协议在传输实时语音流方面的优点

    1. 可靠性高:TCP协议通过确认机制和重传机制保证数据的可靠性,能够保证语音数据的完整性和准确性. 2. 顺序性好:TCP协议能够保证数据的顺序性,能够确保语音数据按照发送顺序被接收. 3. 流量控 ...

  6. TCP协议详解之TCP Flag标志位来判断TCP会话的开始和结束

    首先回顾一下TCP标志位的具体含义. TCP Flag标志位(控制位) 一个TCP包的详细内容: TCP FLAG 标记占1.5个byte,12bit(4bit+8bit,前半个byte与Header ...

  7. TCP协议-TCP超时重传机制

    一.前言 在TCP通信中,既要保证在网络正常的情况下提供可靠的交付服务,又要保证在网络异常的情况下也提供可靠的交付服务.而TCP的超时重传机制就是解决在网络异常情况下的可靠传输问题的. 二.通过序列号 ...

  8. TCP协议中的核心知识点,SYN Flood?ISN?滑动窗口?数据重传?拆包粘包?单tcp连接多请求?拥塞管理?(个人收藏学习笔记)

    TCP协议中的核心知识点,滑动窗口?数据重传?拆包粘包?单tcp连接多请求? 1.前言 2.TCP/IP四层结构 3. TCP 3.1 TCP 协议头 3.2 TCP通信过程 3.2.1 建立连接的三 ...

  9. 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)

    TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...

最新文章

  1. 在Linux上安装QT4
  2. 大数据工具篇之flume1.4-安装部署指南
  3. 在c语言中什么意思,\c在C语言中是什么意思?
  4. 用Way.EntityDB进行Entity Framework Core数据库建模
  5. gitlab将分支代码合并到master上
  6. [洪流学堂]Hololens开发入门篇1之模拟器开发环境配置
  7. 使IE6支持PNG透明图片的JS插件
  8. python 一题多解 —— ndarray 一维数组的拼接
  9. java完成crm系统ppt,客户关系管理系统答辩稿.ppt
  10. 陈一为担任BCF理事
  11. 十万火急的数据采集项目,爬虫代理测试对比
  12. gopup是疫情经济生活搜索指数数据接口
  13. 文本标注工具-brat安装
  14. OpenCV—Python 图像加减乘除-逻辑运算
  15. 固态硬盘在线测试软件,ssd测试软件,详细教您ssd测试软件
  16. 「聚变」前端 客户端 | 第十七届 D2 终端技术大会,开放报名!
  17. TextView 字体(TypeFace) 交通灯Led效果
  18. 【Java项目实战】在线音乐播放器(从需求到产品完整解析)
  19. 这款软件美观大气又好用!内置福利资源
  20. 如何卸载阿里云盾(安骑士)和腾讯云镜的监控?你对这件事一定很感兴趣!

热门文章

  1. 不用第三方之C#实现大容量报表系统(转)
  2. Uploadify/uploadifive上传(中文文档)
  3. 浅谈下关于 速营社 的几个优点
  4. 陪诊服务系统源码,可以在线预约陪诊师的软件平台
  5. 计算机专业认知存在的问题,浅谈新形势下计算机专业存在的问题与对策
  6. After Effects CC SDK 使用指南(二)—— 第一章 介绍 (上)
  7. 2017年度专业技术人员资格考试时间安排
  8. 入手评测 骁龙888Plus、骁龙888和苹果a15哪个好
  9. java 霍思_心术结局是什么
  10. 另一个游戏的启示——富爸爸之现金流游戏