0%

使用TCPdump调试traefik网络连接异常

被这个问题困扰了好一段时间, 期间拉取了traefik代码到本地编译(remark: 官网提供的文件做了优化编译,去掉了调试信息, 无法打断点), 并打断点调试。

完成traefik部署后, 检查日志发现traefik 在不断报错, 错误信息:Error while Peeking first byte: read tcp 172.16.2.102:80->100.xxx.xxx.xxx:xxxxx: read: connection reset by peer.

百度下错误信息 read: connection reset by peer

1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。

2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。

简单的说就是在连接断开后的读和写操作引起的。

read: connection reset by peer (连接被对端重置) 错误分析:

远程服务器已向您发送了一个RST数据包,该数据包指示立即断开连接,而不是通常的握手。这绕过了正常的半关闭状态转换(即4次握手)。

带着问题排查异常: 100.120.151.13是哪里的IP? 为什么要不断连接到traefik 80端口?

到百度查询IP: 100.120.151.130 , 发现这是个局域网保留地址!

搜索维基百科的Reserved IP Address词条才发现原来教科书上介绍的只是部分保留地址,整个保留地址家族的成员还是比较多的.

100.64打头的IP地址对应地址块为100.64.0.0/10,地址范围为100.64.0.0~100.127.255.255`,共包含有4,194,304个IP地址。

这个保留地址也是用于内网,但是这个内网不是一般内网而是Carrier-grade NAT,这个英文对应的翻译是“运营商级NAT”。

100.64.0.0/10运营商级(Carrier-grade)NAT保留IP地址

在记忆当中内网保留地址只有 10.xxx, 172.xxx, 192.xxx。 在IPv4地址协议中预留了3个IP地址段,作为私有地址,供组织机构内部使用。

这三个地址段分别位于A、B、C三类地址内:

问题: 难道错误信息中的 IP 100.120.151.130 是阿里云在用? 为什么阿里云要不断发起连接到traefik端口上?

到服务器中抓包查看 100.64.0.0/10 网段内的ip在做什么。

错误信息:Error while Peeking first byte: read tcp 172.16.2.102:80->100.xxx.xxx.xxx:xxxxx: read: connection reset by peer.

TCP建立连接要发起三次握手, 经过4次握手关闭连接。

查看100.64.0.0/10网段IP的TCP连接所传输的内容。 tcpdump -i any -AnnvvSs 0 “net 100.64.0.0/10 && port 80”, 看到本机ip在上报机器的资源使用情况到100.100.21.100, 包括CPU, 磁盘, TCP连接数等等。

确定 100.64.0.0/10 网段是阿里云内部用于做监控. 排查云监控中的站点健康检查和 SLB的健康检查。

将SLB的端口检查方式由TCP 改为 HTTP

再次查看错误日志, 已经不报错了。 重新抓包查看连接情况。

查看tcpdump官方文档。

PUSH标志

要了解PSH标志的功能,我们首先需要了解TCP如何缓冲数据。TCP在OSI模型的第四层运行;它向上层提供了一个简单的套接字,可以对其进行读写,从而掩盖了基于分组的通信的复杂性。

为了允许应用程序随时读取和写入此套接字,在TCP连接的两端都在两个方向上实现了缓冲区。

下图显示了发送方在发送之前如何缓冲数据,接收方在接收时如何缓冲数据。

当发送超过一个最大段大小(MSS)的数据时(例如,传输一个大文件),缓冲区使数据传输更加有效。

但是,在处理要求尽快传输数据的实时应用程序时,大型缓冲区弊大于利。

考虑一下Telnet会话会发生什么情况,例如,如果TCP等待直到有足够的数据来填充一个数据包,然后再发送一个数据包,那么:第一个数据包发送到远程设备之前,您必须输入超过一千个字符。这就不太有用了。

这就是PSH标志的用处。 传出TCP数据包中的PSH标志将设置为1(打开)。收到设置了PSH标志的数据包后,连接的另一端立即将分段转发给应用程序, 而不必等待其他数据进入缓冲区

总而言之,TCP的推送功能可以完成两件事:

  • 发送应用程序通知TCP应该立即发送数据。
  • TCP报头中的PSH标志通知接收主机应立即将数据推送到接收应用程序。