能ping通但是网络不通,是它们在搞鬼( 四 )


TCP和Ping走的网络路径一样吗
现在我们回到文章开头的问题 。
对于同样的发送端和接收端 , TCP和Ping走的网络路径一样吗?
不一定一样 , 因为五元组里的信息里有一项是通信协议 。ping用的是ICMP协议 , 跟TCP协议不同 , 并且ping不需要用到端口 , 所以五元组不同 , 生成的哈希键不同 , 通过ECMP选择到的路径也可能不同 。

能ping通但是网络不通,是它们在搞鬼

文章插图
 
TCP和ping的五元组差异
同样都用TCP协议 , 数据包走的网络路径一样吗
还是同样的发送端和接收端 , 同样是TCP协议 , 不同TCP连接走的网络路径是一样的吗?
跟上面的问题一样 , 其实还是五元组的问题 , 同样都是TCP协议 , 对于同样的发送端和接收端 , 他们的IP和接收端的端口肯定是一样的 , 但发送方的端口是可以随时变化的 , 因此通过ECMP走的路径也可能不同 。
能ping通但是网络不通,是它们在搞鬼

文章插图
 
不同TCP连接的五元组差异
但问题又来了 。
我知道这个有什么用呢?我做业务开发 , 又没有设置网络路由的权限 。
利用这个知识点排查问题
对于业务开发 , 这绝对不是个没用的知识点 。
如果某天 , 你发现 , 你能ping通目的机器 , 但用TCP去连 , 却偶尔连不上目的机器 。而且两端机器都挺空闲 , 没什么性能上的瓶颈 。实在走投无路了 。
你就可以想想 , 会不会是网络中用到了ECMP , 其中一条链路有问题导致的 。
能ping通但是网络不通,是它们在搞鬼

文章插图
 
ping能成功但部分TCP连接失败
排查方法也很简单 。
你是知道本机的IP以及目的机器的IP和端口号的 , 也知道自己用的是TCP连接 。
只要你在报错的时候打印下错误信息 , 你就知道了发送端的端口号了 。
这样五元组是啥你就知道了 。
下一步就是指定发送端的端口号重新发起TCP请求 , 同样的五元组 , 走同样的路径 , 按理说如果链路有问题 , 就肯定会复现 。
如果不想改自己的代码 , 你可以用nc命令指定客户端端口看下能不能正常建立TCP连接 。
nc -p 6666 baidu.com 80
-p 6666是指定发出请求的客户端端口是6666 , 后面跟着的是连接的域名和80端口 。
能ping通但是网络不通,是它们在搞鬼

文章插图
 
通过nc成功建立tcp连接
假设用了6666端口的五元组去连接总是失败 , 改用6667或其他端口却能成功 , 你可以带着这个信息去找找负责网络的同事 。
总结