BSDソケットわけわかめ
私はネットワーク系プログラミング入門中素人なのでBSDソケットについて悩むことがちょくちょくある.listen(2)
とか shutdown(2)
とかどうでもいいからSYNとかFINを思い通りに送受信させて欲しい気がする... 思い通りにとまで行かなくとも,せめてTCPのフラグとソケットAPIとの対応くらいきっちり書いてくれないものか.秋頃にこの辺*1を読みながら勉強していた:
- http://www.ne.jp/asahi/hishidama/home/tech/socket/tcp.html TCPメモ(Hishidama's TCP Memo)
「listen(2)
してるソケットに connect(2)
するとその時点で3-way handshakeが成立するのであって accept(2)
は関係ない」とか知らんし.仕様のどこに説明書いてあるの? (まぁそれを知ってることが必須かどうかはともかく...)
- id:happs:20110823:1314114356 ソケットインターフェースと3-way handshake - niwaka diary
それと初心者ホイホイの「send(2)
した分のデータをバッファリングせず即座に単独のパケットにして送ってほしいときに TCP_NODELAY
が役立ちそうなんだが効いてるように見えない」の道も通った(これは需要あるよね.)Naglingが切られたからと言って send(2)
ごとにパケットが飛ぶとは誰も言ってない気がする辺りがポイントだ.
結局のところTCPスタック実装を読解せねばどうしようもないな.現代のLinuxとどの程度共通か知らんがStevens本 第2巻*2を頑張って読みます.後はRAWソケットか... (RAWソケットで完璧汎用を目指すとTCPスタック読解を超える労力が要る訳だが,そこは自分専用で手抜きを効かせるということで.)Stevens本以外にもLinuxだと色々ネット上に参考になる情報はある.
- http://wiki.ipxwarzone.com/index.php5?title=Linux_packet_mmap Linux packet mmap - IwzWiki
- http://stackoverflow.com/questions/2687772/ networking - data path (travel) of tcp data from "write" syscall downto I/O registers programming - Stack Overflow