发生网络异常有可能是您使用的OSS域名不合适,但多数网络异常都是客户端网络不稳定导致的,本文将针对不同情况给出网络异常的解决办法。
背景信息
如果您请求OSS时收到了OSS的响应,即使这个响应的HttpCode不是200,也说明您当前的网络跟OSS服务之间是连通的。这类问题您只需获取OSS响应中的Request ID,打开OSS自助诊断工具进行问题诊断检测即可。关于如何获取Request ID,请参见获取Request ID。
本文所示的网络异常是指您的请求没有到达OSS的服务器之前就发生了中断,您可以通过获取Request ID来判断您的请求有没有到达OSS,请求没有到达OSS时Request ID为空。
Connection refused
问题原因
您的客户端和OSS不在同一地域的阿里云内网中。只有在与OSS同地域的阿里云产品中才可以通过内网Endpoint访问OSS,比如您有一个cn-hangzhou的OSS Bucket,则可以在一台cn-hangzhou的ECS上通过oss-cn-hangzhou-internal.aliyuncs.com域名访问OSS。关于域名的更多信息,请参见访问域名和数据中心。
客户端跟OSS虽然在同一个地域,但是客户端可能有一些特殊限制,比如端口未开放等。
解决方案
检查您的域名中是否带internal,改用不带internal的公网Endpoint发起请求。如果公网Endpoint可以正常请求,说明您当前的客户端不适合使用内网Endpoint。
建议在出现问题的客户端通过ping命令访问OSS的公网Endpoint地址,比如:
ping oss-cn-hangzhou.aliyuncs.com
,如果无法ping通请使用telnet命令测试80/443端口是否正常。
ConnectionTimeOut
问题原因
您所在的网络环境可能处在运营商网络边缘节点,向运营商网络请求成功率比较低。
上传大文件超时。
配置的超时时间过短。
解决方案
开通CDN加速,利用CDN边缘加速节点,减少手机或PC网络对运营商网络的依赖。
采用分片断点上传,每个分片的大小不超过1 MB。更多信息,请参见分片上传、Java断点续传上传和Python断点续传上传。
增大超时时间,并开启失败重传机制。更多SDK示例代码,请参见简介。
关于网络超时处理的更多信息,请参见网络超时处理。
Socket timeout or Socket closed
问题原因
连接OSS超时。
解决方案
增大超时时间。例如,Java SDK可以通过ClientConfiguration.setSocketTimeout设置Socket层传输数据的超时时间。更多SDK示例代码,请参见简介。
Connection reset
问题原因
客户端网络异常。
代码中配置的Endpoint不准确。
因攻击或者发布违法内容的原因导致Bucket被切入沙箱。
OSS域名被运营商劫持。
解决方案
排查客户端网络是否正常
在出现报错的设备上通过ping命令访问所在地域的OSS访问域名,或者打开阿里昆仑诊断工具查看您的网络是否有异常。当网络异常时请排查解决。
排查代码配置
在客户端网络正常的前提下,通过ping命令访问代码中使用的OSS域名,确保域名拼写正常。关于域名的更多信息,请参见访问域名和数据中心。
说明代码中的Endpoint必须要带HTTP或HTTPS协议头,比如:https://oss-cn-hangzhou.aliyuncs.com。
更多SDK示例代码,请参见简介。
确认Bucket是否进入沙箱
进入沙箱的表现为部分请求可以正常响应,但服务质量将被降级。更多信息,请参见OSS沙箱。
抓包排查
如果经过上述排查后仍未解决您的问题,请使用Wireshark工具抓包后联系OSS技术支持进行排查。