再送処理

ソケットのwrite_queueに繋がれいるパケットのうち、先頭からsend_headメンバが指すパケットの前のパケットまでは、実際に送信を行ったがまだACKを受け取っていないパケットである。一定時間ACKが戻って来ない場合、これらパケットは再送処理に送られる。

再送タイマの起動要求(tcp_reset_xmit_timer(TIME_RETRANS)関数)は、最初にパケットを送出(tcp_send_skb関数)するときに行われている。一定時間経過すると、再送タイマ(tcp_retransmit_timer関数)が起動される。

再送タイマ(tcp_retransmit_timer関数)は、遅延ACKタイマを停止(tcp_clear_xmit_timer(TIME_DACK)関数)し、再送処理(tcp_retransmit_skb関数)を開始する。また、再び再送タイマの起動要求(tcp_reset_xmit_timer(TIME_RETRANS)関数)を行っておく。(遅延ACK処理に関しては受信処理のところで説明する)

再送処理(tcp_retransmit_skb関数)では、まず可能であればパケットの結合を試みる(tcp_retrans_try_collapse関数)。小さなパケットを一つにまとめることにより送信効率を上げるのが目的である。その後、パケットの複製を作り(skb_copy関数、skb_clone関数)、パケットの送信(tcp_transmit_skb関数)を行う。

再送を行ったパケットは、tcp_send_skb関数で送り出されたパケットと同じく、ソケットのwrite_queueに繋がれたまま、ACKパケットが戻って来るのを待つ。もし一定時間内にACKパケットが戻って来ない場合、再度再送処理で処理される。


(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1