- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:LinuxのTCPIP)
LinuxのTCPIP実装についての疑問
このQ&Aのポイント
- LinuxのTCPIP実装について疑問があります。受信バッファにデータが残っている状態でSocketのCloseが行われるとRST送信となり、FIN送信にならないということが分かりました。また、送信バッファにデータが残っていた場合もRST送信されるため、送信バッファのデータは破棄されずに送信されないのか疑問です。
- 実際に試してみると、受信バッファと送信バッファのどちらにもデータが残っている場合にRST送信され、送信バッファのデータも送信されないことが分かりました。一方、受信バッファにデータが残っていない状態で送信後すぐにCloseしても、送信が完了してからFINが送信されるように見えます。
- 受信バッファの有無によってCloseの挙動が変化し、受信バッファにデータがある場合はRST送信され、データも破棄されます。一方、受信バッファにデータがない場合はFIN送信され、送信完了後にFINが送信されます。この違いはKernelの実装によるものであり、送信バッファにデータが残っている場合はRSTではなくFINが送信されない点が疑問です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
これを見たら解決? http://lxr.linux.no/#linux+v3.7.3/net/ipv4/tcp.c#L2046 IPv4だけでなく、IPv6でもこれを使ってcloseしているように見えます。 http://lxr.linux.no/#linux+v3.7.3/net/ipv6/tcp_ipv6.c#L2021 ざっと見た感じで間違っているかもしれませんが、RSTを投げるのは receive queue にデータがあるときのように見えますが。 参考までにこれもご覧ください。 http://lxr.linux.no/#linux+v3.7.3/include/net/sock.h#L205
お礼
ご回答ありがとうございます。 当方は、Kernelの知識が無いのですが、 コードを読む限り、ご教示頂きましたように 受信バッファにデータがある場合にRSTになるように見えました また、FINになる場合には、tcp_send_fin()でqueueの 最後にFINを入れているように見えるので、すでにsend()等で skbに入っているものは送信されるように見えたので 質問で書かせて頂いた受信バッファのある・なしでの Closeの挙動、かつ送信バッファにデータが存在する場合の 挙動もコード通りということですね