【计算机网络】TCP的可靠性传输机制和常见配置讲解

简介: 【计算机网络】TCP的可靠性传输机制和常见配置讲解

1.TCP的可靠性传输机制

  • TCP的可靠性传输机制
  • ACK机制
  • 接收方收到TCP 数据包,要响应一个确认消息 acknowledgement,简称 ACK。
  • ACK有两个信息:期待要收到下一个数据包的编号和 当前接收方的接收窗口的剩余容量。
  • 流量控制
  • TCP连接的双方都有固定大小的buffer缓冲空间,接收端只允许发送端发送接收端缓冲区能接纳的数据。

当接收方处理不过来发送方的数据,会提示发送方降低发送的速率,防止包丢失。

流量控制是让发送方的发送速率不要过快,让接收方来得及接收。

利用可变大小的滑动窗口机制,在TCP连接上实现对发送方的流量控制。

TCP协议有个叫win,即16位的窗口大小。

接受方每次收到数据包,在发送确认报文的时候也会告诉发送方,自己的缓存区还有多少空余空间。

缓存区的空余空间,称为接收窗口大小。

daec045839d14cb799c35a80f331bf77.jpg

拥塞控制通过发送方来控制流量的一种方式,对整个网络 全局性考虑

  • 是一种自适应算法,利用多种机制,根据网络的状况自动调整发送端的发送速率,以避免网络拥塞


慢启动

发送端会以一个较小的窗口值开始发送,每收到一个ACK消息后,窗口值就会翻倍增加,直到窗口值达到最大值

如果不丢包,就加快发送速度;如果丢包,则降低发送速度

这样就可以慢慢地增加发送端的发送速率,避免突然发送大量数据造成网络拥塞。

快速重传

当发送端发送的数据报文没有在规定时间内收到ACK确认消息时,发送端就会认为该数据报文丢失

它会立即重发该数据报文,从而提高数据传输的效率。

拥塞避免

当收到三个重复的ACK消息时,发送端会认为网络出现拥塞,它会减少发送速率

降低发送端的数据量,从而减少网络的拥塞情况

重传机制


超时重传 Retransmission Timeout(时间驱动)


发送一个数据包后就开启计时器,在一定时间内如果没有得到发送的数据报的 ACK 报文,就重发数据,直到发送成功

配置超时重传时间就是 RTO,一般大于RTT**(Round-Trip Time,往返时间)**就行

缺点

报文丢失会等待一定的超时时候才重传,增加端到端的时延

快速重传 Fast Retransmit数据驱动

  • TCP 协议给每个包编号seq(sequence number),第1个包的编号是一个随机数
  • 接收方收到多个包后,方便组装还原,如果发生丢包,可以知道丢失的是哪一个包

例子

接收方收到了6号包,没有收到14号包,ACK 就会记录,期待收到14号包

过了一段时间14号包还是没收到,但是收到24号包,ACK 里面的编号不会变化,总是响应期待14号包

如果发送方收到三个连续的重复 ACK 或者 超时还没有收到任何 ACK,会确认14号包丢包,再次重发这个包。

重传成功后,接收方会返回正常最新的ACK

缺点

快速重传 解决了超时时间的问题,但存在重传的时候,是重传之前的⼀个,还是重传所有的问题

根据不同的实现,两种重传都可能,也有更多机制SACK和D-SACK

ae1b4da34a524467bc97403d6297074c.jpg

2.TCP的传输优化机制 Nagle算法和延迟确认

  • Nagle 算法
  • 是TCP协议的一种流量控制算法,它的目的是为了减少网络中的小数据包的数量,提高网络的效率
  • TCP/IP协议中,无论发送多少数据都要在数据前面加上协议头,对方接收到数据也需要发送ACK表示确认
  • 为了提高利用网络带宽,TCP希望尽可能的发送足够大的数据,诞生了Nagle算法
  • 任意时刻,最多只能有一个未被确认的小段。
  • “小段” 指的是小于MSS尺寸的数据块
  • “未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认。

TCP协议默认开启了Nagle算法,默认TCP_NODELAY选项为false


做法


一个 TCP 连接上最多只能有一个未被ACK确认的数据包,在收到确认信息之前,不再发送后续数据包

在上一个数据包未到达目的地前,即未收到 ack 前,将多个数据包组合成一个数据包发送

当上一个小分组的 ack 收到后,TCP 就将收集的小分组合并成一个大分组发送出去,以减少小包的发送数量

上面条件都没满足,发生了超时(一般为200ms),也会立即发送

禁用Nagle算法

默认开启的,比较适用于发送方发送大批量的小数据,并且接收方作出及时回应的场合,降低包的传输个数

如果业务是实时的发送数据并需要及时获取响应,则不适合开启Nagle算法

延迟要求比较严格的地方,网络比较通畅 或 内部网的情况下,应该关闭nagle算法

游戏类服务器开发也会禁用Nagle

linux提供了TCP_NODELAY的选项来禁用Nagle算法

禁止Nagle算法,每一次send 都会组一个包进行发送,hello被分成5个小包分别发送

不用等待ACK,可以连续发送数据包

  • netty框架里面 .childOption(ChannelOption.TCP_NODELAY, true) 禁用
  • 延迟确认

TCP报文中假如没携带数据,只是发ACK, 但有 40 个字节的 IP 头 和 TCP 头,⽹络效率也是很低的,就产⽣出 TCP 延迟确认

做法

当 TCP 收到一个数据包时,它不会立即发出确认,而是等待一段时间 ,Linux默认延时时间为 40ms

如果在这段时间内有响应数据要发送时,ACK会随着响应数据⼀起发送给对⽅;如果期间没数据发送则40ms后才ACK

TCP 就将这两个数据包一起确认,从而减少了确认报文的数量

这种策略可以有效地减少网络中的报文交换,从而提高网络效率

注意


Nagle 算法和延迟确认不能一起使用

Nagle 算法 是用于延迟发送数据包,延迟确认 是用于 延迟接收数据包

两个凑在一起就会造成更大的延迟,会产生性能问题

3.Linux服务器常见网络内核参数配置

  • 查看内核参数
  • 执行sysctl -a命令,查看当前系统中生效的所有参数
  • sysctl -a 显示参数特别多,常规加 grep 过滤下 sysctl -a | grep net.ipv4.tcp

1ae044e3ca934301b8fdf9a36cb3af02.jpg

两种修改Linux实例内核参数

  • 方法一:通过/proc/sys/目录查看和修改内核参数
  • /proc/sys/目录是Linux内核在启动后生成的伪目录,
  • 目录下的net文件夹中存放了当前系统中开启的所有内核参数,目录树结构与参数的完整名称相关
  • 比如 net.ipv4.tcp_tw_recycle,它对应的文件是/proc/sys/net/ipv4/tcp_tw_recycle文件,文件的内容就是参数值
  • 查看内核参数 net.ipv4.tcp_tw_recycle 的值,命令 cat /proc/sys/net/ipv4/tcp_tw_recycle
  • 修改内核参数 net.ipv4.tcp_tw_recycle 的值,命令 echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle
  • 方法二:通过sysctl.conf文件查看和修改内核参数
  • 修改 /etc/sysctl.conf 文件中的参数: vim /etc/sysctl.conf
  • 执行命令使配置生效. /sbin/sysctl -p
  • Linux文件句柄数限制优化
  • 啥是Linux文件句柄
* 在linux系统设计里面遵循一切都是文件的原则,即磁盘文件、目录、网络套接字、磁盘、管道等
* 所有这些都是文件,进行打开的时候会返回一个fd,即是文件句柄
* 如果频繁的打开文件,或者打开网络套接字而忘记释放就会有句柄泄露的现象
* 在linux系统中对进程可以调用的文件句柄数进行了限制,在默认情况下每个进程可以调用的最大句柄数是1024个
* 如果超过了这个限制进程将无法获取新的句柄,而从导致不能打开新的文件或者网络套接字,对于线上服务器即会出现服务被拒绝的情况。
* 遇到文件句柄达到上限时,会碰到`Too many open files`或者 `Socket/File: Can’t open so many files`等错误

修改方式

  • 局部文件句柄数(单个进程最大打开文件数)
  • ulimit -n 一个进程最大打开的文件数 fd, 不同系统有不同的默认值
  • 编辑 vim /etc/security/limits.conf 文件末尾增加
  • hard nofile 100000
  • soft nofile 100000
  • 其中* 代表所有用户,100000代表修改的值,修改以后需要重新登录才能生效
  • 全局文件句柄数(所有进程所能够创建的文件句柄数)
  • 查看全局文件句柄数:cat /proc/sys/fs/file-max
  • 编辑 /etc/sysctl.conf,在文件末尾加上:fs.file-max=10000000000
  • 使配置文件生效:sysctl -p
  • 注意
  • 一般修改进程级的最大打开文件句柄数即可(很多系统默认1024,有点小)
  • 一般不需要调整系统级的最大数,局部文件句柄数一定不要超过全局文件句柄数
  • Linux常见的网络内核参数说明(backlog的中文意思理解为存储
  • image.png

image.png

4. Linux服务器生产环境常见问题

(1)生产环境Linux服务问题一

  • 现象
  • 业务突然访问不了,诊断出是网络方向的问题
  • Linux实例的/var/log/messages日志信息全是类似“kernel: TCP: time wait bucket table overflow”的报错信息
  • 提示“time wait bucket table”溢出
  • 原因分析
  • 参数net.ipv4.tcp_max_tw_buckets可以调整内核中管理TIME_WAIT状态的数量
  • 当实例中处于TIME_WAIT状态,需要转换为TIME_WAIT状态的连接数之和超过net.ipv4.tcp_max_tw_buckets参数值
  • messages日志中将报“time wait bucket table” 错误,同时内核关闭超出参数值的部分TCP连接
  • 根据实际情况适当调高net.ipv4.tcp_max_tw_buckets参数,同时从业务层面去改进TCP连接。
  • 解决方案


统计TCP连接数 netstat -atnp |grep tcp |wc -l ,如果确认连接使用很高,容易超出限制

vim /etc/sysctl.conf, 增加net.ipv4.tcp_max_tw_buckets参数值的大小

执行sysctl -p命令,使配置立刻生效

2)生产环境Linux服务问题二

  • 现象
  • 业务突然访问不了,诊断出是网络方向的问题
  • Linux实例中FIN_WAIT2状态的TCP链接过多
  • 原因分析
  • 在HTTP服务中,Server由于某种原因会主动关闭连接,作为主动关闭连接的Server就会进入FIN_WAIT2状态。
  • 如果Client不关闭,FIN_WAIT2状态将保持到系统重启,越来越多的FIN_WAIT2状态会致使内核Crash。
  • 建议调小net.ipv4.tcp_fin_timeout参数的值,加快系统关闭处于FIN_WAIT2状态的TCP连接

TCP连接处于FIN_WAIT2状态,下一步会进入TIME_WAIT状态

解决方案

统计 TCP处于连接的数量 netstat -atn|grep FIN_WAIT2|wc -l

执行vim /etc/sysctl.conf命令,调整 net.ipv4.tcp_fin_timeout = 30

阿里云ECS默认是60秒,查看 sysctl -a | grep net.ipv4.tcp_fin_timeout

执行sysctl -p命令,使配置立刻生效

(3)生产环境Linux服务问题三

  • 现象
  • 业务突然访问不了,诊断出是网络方向的问题
  • Linux实例中出现大量CLOSE_WAIT状态的TCP连接

原因分析

根据机器的业务量判断CLOSE_WAIT数量是否超出了正常的范围

TCP连接断开时需要进行四次挥手,TCP连接的两端都可以发起关闭连接的请求

如果对端发起了关闭连接,但本地没有关闭连接,那么该连接就会处于CLOSE_WAIT状态

虽然该连接已经处于半开状态,但是已经无法和对端通信,需要及时的释放该连接

  • 建议从业务层面及时判断某个连接是否已经被对端关闭,即在程序逻辑中对连接及时关闭,并进行检查
  • 解决方案
  • 编程语言中对应的读、写函数一般包含了检测CLOSE_WAIT状态的TCP连接功能,

查看处于CLOSE_WAIT状态的连接数 netstat -atnp|grep CLOSE_WAIT|wc -l

比如是java业务,检查相关IO操作是否有正常关闭

通过read方法来判断I/O ,当read方法返回-1时,则表示已经到达末尾

通过close方法关闭该连接

(4)生产环境Linux服务器问题四

  • 现象
  • 业务突然访问不了,诊断出是网络方向的问题
  • 存在大量处于TIME_WAIT状态的连接
  • 原因分析
  • 主动发起关闭的一端,在发送最后一个ACK之后会进入time_wait的状态
  • 该发送方会保持2MSL时间之后才会回到初始状态,MSL值是数据包在网络中的最大生存时间
  • 处于这个状态的TCP连接在2MSL等待期间,定义这个连接的四元组 客户端IP和端口,服务端IP和端口号 不能被使用
  • 解决方案
  • 查看处于TIME_WAIT状态的连接数 netstat -atnp|grep TIME_WAIT|wc -l
  • 执行vim /etc/sysctl.conf命令,调整参数
#开启SYN的cookies,当出现SYN等待队列溢出时,启用cookies进行处理
net.ipv4.tcp_syncookies = 1 
#允许将TIME-WAIT的socket重新用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1 
#开启TCP连接中TIME-WAIT的sockets快速回收功能
net.ipv4.tcp_tw_recycle = 1
#如果socket由服务端要求关闭,则该参数决定了保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_fin_timeout = 30
  • 执行sysctl -p命令,使配置立刻生效
    启用cookies进行处理
    net.ipv4.tcp_syncookies = 1

#允许将TIME-WAIT的socket重新用于新的TCP连接

net.ipv4.tcp_tw_reuse = 1

#开启TCP连接中TIME-WAIT的sockets快速回收功能

net.ipv4.tcp_tw_recycle = 1

#如果socket由服务端要求关闭,则该参数决定了保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_fin_timeout = 30

* 执行`sysctl -p`命令,使配置立刻生效
* 除了的减少TIME_WAIT状态的连接,也可以通过扩大端口范围和对TIME_WAIT的bucket进行扩容等手段优化系统性能



相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
163 7
|
3天前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
18 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
25天前
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
53 11
|
24天前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
52 3
|
1月前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
87 3
|
1月前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
5天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
42 17
|
16天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
17天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
39 10
|
19天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
46 10
下一篇
DataWorks