タグ

networkとtcpに関するmoritataのブックマーク (9)

  • When TCP sockets refuse to die

    While working on our Spectrum server, we noticed something weird: the TCP sockets which we thought should have been closed were lingering around. We realized we don't really understand when TCP sockets are supposed to time out! In our code, we wanted to make sure we don't hold connections to dead hosts. In our early code we naively thought enabling TCP keepalives would be enough... but it isn't. I

    When TCP sockets refuse to die
  • TCPとタイムアウトと私 - Cybozu Inside Out | サイボウズエンジニアのブログ

    部長や副部長もプログラミングを(たまに)することで有名なサイボウズの運用部長、山泰宇です。 有名じゃないかもしれませんが、ブログに書いたので有名になるということでご了承ください。 今回は、先日発生した yrmcds に起因する障害の原因と対策を解説します。 yrmcds というのは、サイボウズが開発している memcached 互換のキーバリューストレージです。 問題の理解のため、まず TCP 通信で、通信先の相手の障害にどう対応するか解説します。 データの送信中に相手が落ちるケース このケースはさらに二つに分かれます。 相手の OS は生きているが、通信しているプログラムが落ちるケース 相手の OS ごと(あるいはネットワークごと)落ちるケース 1 と 2 の違いは、前者の場合 RST パケットが返ってくるのに対して、後者ではなにも返ってこない点です。後者の場合、ack されない

    TCPとタイムアウトと私 - Cybozu Inside Out | サイボウズエンジニアのブログ
  • TCP/IP エラー処理 connect 編

    connect(2) のエラー TCP において connect(2) 呼出し時に発生する可能性のあるエラーは以下の通りです。 タイムアウト RST 受信 EHOSTUNREACH また ENETUNREACH シグナル受信 その他 まず、connect(2) 時の正常な流れをしっかり覚えておいてください。 (connect(2) を呼んで) SYN を送る SYN+ACK が返ってくる (ここで connect(2) から戻る) ACK を送る タイムアウト もし仮に、SYN を送ったものの、相手側から SYN+ACK が返ってこない場合は、 (ローカルの TCP スタックが) しつこく SYN を再送します。何度 SYN を送っても SYN+ACK が返ってこない場合はあきらめてタイムアウトします。 「SYN+ACK が返ってこない」というのは、例えば以下のようなケースが考えられます。

  • Programming UNIX Sockets in C - Frequently Asked Questions: クライアントとサーバ(TCP/SOCK_STREAM)両方に関する質問

    Previous Next Table of Contents 2. クライアントとサーバ(TCP/SOCK_STREAM)両方に関する質問 2.1 相手側のソケットが閉じられたことをどうやって知ることができますか? Andrew Gierth 氏 ( andrew@erlenstar.demon.co.uk) より: 私の知る限り… 相手側が (SO_LINGER を使ったややこしいことをしないで) close() するか終了したとすると、こちらの read() の呼び 出しは 0 を返すはずです。同じ場合で、write() 呼び出しで何が 起こるかは、もうちょっとわかりづらいです。直後の呼び出し時ではな く、その次の呼び出し時にEPIPE が返るでしょう。 もし相手が再起動するか l_onoff = 1, l_linger = 0 を設定して から閉じたとすると、read() からは(

  • ソケット通信メモ(Hishidama's TCP/UDP Socket Memo)

    TCPソケット サーバータイプとクライアントタイプの両方のアプリケーションを作らないといけないなら、サーバータイプから作るべきだろう。 (クライアントタイプだけ先に作っても動かせないから。まぁサーバータイプだけ動かしても、待ってるだけであまり意味無いけど(苦笑)) でも仕組みはクライアントタイプの方が簡単。 TCPを使う場合は、通信の最初にコネクションの確立を行う必要がある。 サーバーでlisten・accept、クライアントでconnectが成功すればコネクションが確立したことになる。 どのポート番号を使うかについては、サーバー側はアプリケーションの作成者が決める必要がある。[/2007-06-16] クライアント側のポート番号は、ソケットライブラリがそのマシンで使っていない番号を自動的に割り振ってくれるので、気にしなくてよい。 IANAの基準では、1~1023は「よく知られたポート(w

  • TCPメモ(Hishidama's TCP Memo)

    片方が他方に対して何らかの電文を送ると、相手は受け取ったという印にACKを返す。 ACKが来なければ相手が受け取っていないということなので、その場合はある程度待ってから再送する。 ACKは他の電文と一緒に送ってもよい。 コネクションは、【相手先IPアドレス・相手先ポート・自分のポート】の組で一意に表される。 コネクションは現在どういう状態にあるかを示すステータスを持っており、イベントに応じて遷移していく。netstatコマンドで表示されるのは、これ。 TCP/IPとソケットの関係 ソケット関数を呼び出すと、ソケットライブラリ(プロトコルスタック?OS?)がTCP/IPの規約に従って通信を行う。 listen(受付開始) サーバー側で接続の受付待ちを開始する。 コネクション(通信相手はいないので、相手先IPアドレス・ポートは無し、自分のポート番号だけ有り)はLISTEN状態になる。 conn

  • 第15回 信頼性のある通信を実現するTCPプロトコル(2)

    TCPヘッダの構造 TCPでは信頼性の高い通信を実現するために、受信確認やスライディング・ウィンドウ制御、そしてさまざまな付加機能などを用意している。そのためUDPよりも複雑なヘッダ情報を持っている。「チェックサム」はIPヘッダなどと同様に、1の補数で計算する。 連載第7回「データグラム通信を実現するUDPプロトコル―2.UDPパケットの構造」で示したUDPパケットの構造と比べると、非常に複雑になっている。UDPでは、通信に先立ってコネクションを確立する必要のないデータグラム型通信モデルを使用しているため、送信される各UDPパケットは完全に独立していた。そのため、UDPパケットごとにあて先のポート番号(送信元を区別するための送信元ポート番号)さえあれば、相手にパケットを届けることができる。 だがTCPでは、通信に先立ってコネクションを開設し、さらに通信中にも、前回解説したシーケンス番号に基

    第15回 信頼性のある通信を実現するTCPプロトコル(2)
  • Transmission Control Protocol - Wikipedia

    ⋮ ⋮ 56 448 Source port (16 bits) Identifies the sending port.[10] Destination port (16 bits) Identifies the receiving port.[10] Sequence number (32 bits) Has a dual role: If the SYN flag is set (1), then this is the initial sequence number. The sequence number of the actual first data byte and the acknowledged number in the corresponding ACK are then this sequence number plus 1. If the SYN flag is

    Transmission Control Protocol - Wikipedia
  • Linux の TCP/IP チューニング・パラメータ

    TCP のチューニング・パラメータ 接続確立関係のチューニング・パラメータ TCP のチューニング・パラメータ TCP のチューニング・パラメータは、以下のコマンドで取得できます。 なお、以下は Linux のものです。 >cat /proc/sys/net/ipv4/tcp_retrans_collapse 1 >cat /proc/sys/net/ipv4/tcp_keepalive_probes 9 >cat /proc/sys/net/ipv4/tcp_keepalive_time 10800 >cat /proc/sys/net/ipv4/tcp_syn_retries 10 >cat /proc/sys/net/ipv4/tcp_sack 1 >cat /proc/sys/net/ipv4/tcp_timestamps 1 >cat /proc/sys/net/ipv4/tcp

  • 1