聊聊 IP packet 的 TTL 与 tcp segment 的 MSL

简介: 聊聊 IP packet 的 TTL 与 tcp segment 的 MSL

1 前言 - 网络知识的重要性

近几年在排查解决应用系统在客户现场遇到的复杂问题时,越来越觉得除了扎实的LINUX操作系统知识,对TCP/IP网络知识的深入理解也是至关重要的。

有鉴于此,后续笔者会陆续分享一些网络基础知识和故障排查案例,有兴趣的可以深入交流下。

本文介绍下 IP packet 的 TTL 与TCP segment 的 MSL,两者都跟数据包在网络上的生存时间有关。

2 IP packet 的 TTL

IP 数据报头部中有个 TTL 字段,TTL 是 time to live 的缩写,即生存时间,不过其单位不是秒或分钟等具体时间,而是代表一个 IP数据报可以经过的最大路由数,IP数据报每经过一个路由器,它的值就减1,当此值为0时该数据报就会被丢弃,同时发送ICMP报文通知源主机。 TTL的初始值是由发送该数据报的源主机设置的,不同操作系统 TTL 的初始值可能不同,比如 Windows 的TTL的初始值是128,而Linux的TTL初始值大多是64。

有没有办法查看 TTL 呢?可以通过tcpdump或wireshark等抓包工具查看某个具体数据报的TTL:

image.png

事实上有经验的同学,可以根据数据包的TTL,推测这批数据包的捕获点是客户端服务端还是中间端。(后续有机会再总结下)。

3 TCP segment 的 MSL

MSL 是 Maximum Segment Lifetime 的英文缩写,可译为“报文最大生存时间/最长报文段寿命”,它是任何 TCP segment在网络上存在的最长时间,超过这个时间该报文就会被丢弃,也就是说任何 TCP Segment在网络上的存活时间都不会超过MSL.

RFC793定义了MSL为2分钟,但这完全是从工程上来考虑,对于现在的网络,MSL=2 分钟可能太长了一些,因此不同的TCP实现可以根据具体情况配置使用更小的MSL。

那么如何查看MSL的值呢?在LINUX中事实上并没有直接配置 MSL而是配置了 tcp_fin_timeout,由于 tcp_fin_timeout=2MSL,所以我们可以查看tcp_fin_timeout并据此推断MSL:

### 查看 tcp_fin_timeout
sysctl net.ipv4.tcp_fin_timeout 
cat /proc/sys/net/ipv4/tcp_keepalive_time 
### 修改 tcp_fin_timeout
sysctl -w net.ipv4.tcp_fin_timeout=30  
或编辑 /etc/sysctl.conf


image.png

如上图可见,LINUX中默认 net.ipv4.tcp_fin_timeout 的值是60s,所以MSL默认是30s.

事实上,通过命令 ss -no state time-wait 就能看到处于 time-wait状态的tcp连接,并能看到其剩余的超时时间:

image.png


所以概括起来,IP 的 TTL 与 TCP 的 MSL,两者都跟数据包在网络上的传输与生存时间有关,两者不能直接在数值上对比大小,但在效果上MSL要大于TTL。

4 TCP 四次挥手的状态转移与 MSL

下面我们来看几张TCP四次挥手释放连接的图示:

image.png

image.png


image.png

从上图可以看到,在TCP连接释放的过程中,从 TIME_WAIT状态到CLOSED 状态有一个超时设置,这个超时设置是2MSL(RFC793定义MSL为2分钟)。

那么为什么在 TIME_WAIT 后必须等待2MSL时间呢?主要原因有两点:

  • 为了保证客户端(我们记为A端)发送的最后一个ACK报文段能够到达服务器端:这个ACK报文段在网络传输过程中有可能丢失,从而使处在LASK—ACK状态的服务端(我们记为B端)收不到对已发送的FIN报文段的回包,此时B会超时重传这个FIN报文段,而A就能在2MSL时间内收到这个重传的FIN报文段,接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在TIME_WAIT状态不等待一段时间,而是在发送完ACK确认后立即释放连接,那么就无法收到B重传的FIN报文段,因而也不会再发送一次确认报文段,这样,B就无法正常进入CLOSED状态。
  • 假如A发送的第一个请求连接报文段丢失而未收到确认,A就会重传一次连接请求,后来B收到了确认,建立了连接,数据传输完毕后,就释放了连接。这种情况下A共发送了两个连接请求报文段,其中第一个丢失,第二个到达了B。假如现在A发送的第一个连接请求报文段没有丢失,而是在某些网络节点长时间滞留了,以至于延误到连接释放后的某个时间才到达B,这本来是已失效的报文段,但B并不知道,就会又建立一次连接。而等待的这2MSL就是为了解决这个问题的,A在发送完最后一个确认报后再经过时间2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

由于从 TIME_WAIT状态到 CLOSED 状态有一个2MSL的超时等待时间,该时间内如果有其它新建的连接尝试使用同样的端口,就会报端口不可用的错误,比如笔者在折腾 apache kyuubi时就遇到了如下错误:

image.png


5 网络相关资料推荐

为了深入了解网络知识并掌握网络故障的排查,笔者阅读了大量资料,一些比较推荐的资料如下:

  • 《TCP_IP 详解卷1:协议》,经典无需多言,笔者收藏了英文第二版的原版,时不时翻出来阅读下;
  • 《TCP_IP 详解卷2:实现》,经典无需多言,推荐英文原版;
  • 《图解TCP IP(第5版)》,(日)竹下隆史老师所著,也很不错;
  • 《Wireshark网络分析的艺术》,林沛满老师的书籍,以现实故障案例讲知识,诙谐易懂;
  • 《Wireshark网络分析就这么简单》,林沛满老师的书籍,以现实故障案例讲知识,诙谐易懂;
  • 《Network Analysis using Wireshark2 CookBook》,讲解网鲨工具的使用,推荐;
  • 历年 SharkFest 的精彩分享,可以在油管上看,笔者重点看了近三年的视频。
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
边缘计算 网络协议 网络架构
DoIP看这篇就够了,吐血整理
DoIP看这篇就够了,吐血整理
DoIP看这篇就够了,吐血整理
|
机器学习/深度学习 人工智能 监控
如何利用AI实现银行存量客户的营销?
金融行业是当今大数据、人工智能应用最广、最深的领域之一。随着数据仓库和数据科学的发展,以银行为代表的金融行业企业拥有了海量数据,应运而生了金融领域的大数据分析、智能营销等大数据和人工智能的应用。其中针对存量客户的智能营销成为银行业的一项重要策略。
|
并行计算 JavaScript 前端开发
worker_threads 多线程
worker_threads 多线程
403 4
|
算法
Leetcode第46题(全排列)
这篇文章介绍了LeetCode第46题“全排列”的解题方法,使用深度优先搜索(DFS)和回溯算法来生成给定数组的所有可能排列。
211 0
Leetcode第46题(全排列)
|
监控 网络协议 应用服务中间件
动图图解!收到RST,就一定会断开TCP连接吗?
动图图解!收到RST,就一定会断开TCP连接吗?
998 0
|
编解码 缓存 安全
18.3 SELinux 的3种工作模式
通过对 SELinux 的介绍,初学者可以这样认为,在传统 Linux 系统使用访问控制方式的基础上,附加使用 SELinux 可增强系统安全。 那么,SELinux 是如何运行的呢?
687 0
18.3 SELinux 的3种工作模式
|
存储 Unix Linux
操作系统和内核有什么区别?
操作系统和内核有什么区别?
2224 0
操作系统和内核有什么区别?
|
自然语言处理 数据可视化 机器人
使用ChatGPT生成思维导图
使用ChatGPT生成思维导图
694 0
|
存储 网络协议 网络安全
【网络安全 | 网络协议】结合Wireshark讲解IP协议
【网络安全 | 网络协议】结合Wireshark讲解IP协议
314 0
|
网络协议 安全 Linux
TCP 三次握手与四次挥手深入探究(大图解)
TCP 三次握手与四次挥手深入探究(大图解)
950 1

热门文章

最新文章