特にEC2から接続の場合によく起こるということだったので試してみると10回中3回ほどの発生率。
htmlのデータが途中まで届く。
サーバ側、クライアント側の両方でtcpdumpを見てみると、再送パケットがクライアントに届かなくなっていた。
クライアントは途中のパケットがいつまでも来ないのでタイムアウトする。
これがEC2特有の現象でないことを確認するため、サーバからのレスポンスの中から特定のパケットを落としてみて
問題が再現するかどうかを試してみることにした。
その方法がこちら。
iptables -N LOGDROP
iptables -A LOGDROP -j LOG
iptables -A LOGDROP -j DROP
iptables -A INPUT --source ${webserver_ip} -p tcp --sport 80 -m state --state ESTABLISHED -m limit --limit 1/s --limit-burst ${n-1} -j ACCEPT
iptables -A INPUT --source ${webserver_ip} -p tcp --sport 80 -m state --state ESTABLISHED -m limit --limit 1/s --limit-burst ${j} -j LOGDROP
iptables -A INPUT --source ${webserver_ip} -p tcp --sport 80 -j ACCEPT
n番目までのパケットを通過させて、その後、j個のパケットをログにとってからdropする。その後のパケットも通過。これをクライアント側で実行する。
※もしサーバ上でこれを実行すると大変なことになるのでやってはいけない。
これにより、再送パケットのみ届かない件は別の環境からの接続でも発生することが確認できた。
残念なことに実際の問題はまだ調査中。
通常であればこのフィルタがあっても再送パケットが届くので問題なく通信できる。
滅多にないと思うがTCPでのパケット再送を任意に発生させる必要があったら試してみて欲しい。
0 件のコメント:
コメントを投稿