スポンサーリンク

このドキュメントの内容は、以下の通りです。

Accept Filterとは


Accept Filterとは、カーネル内でネットワークのリクエストをバッファリングすることにより、OSとアプリケーションのスイッチングを減らしたり、アプリケーションがデータ待ちで止まってしまうことを避けたりすることができます。
http://kaworu.jpn.org/freebsd/Accept_Filter

Linuxには、Accept FilterでいうAccept httpがありませんが、accept data という意味で TCP_DEFER_ACCEPT が利用できます。

3-way handshake


HTTPの通信がはじまるまでの 3-way handshake (3ウェイハンドシェイク)のざっくりした流れは、以下の通りです。
クライアント サーバ
3way handshake, connect -- SYN -->
3way handshake <- SYN/ACK --
3way handshake -- ACK --> accept
HTTPリクエスト, write -- Data --> read

TCP_DEFER_ACCEPTとは


Linux の TCP_DEFER_ACCEPT は、3 way handshake の後にクライアントがデータを送信することがわかっている場合に利用します。
クライアントがACKをデータと一緒に送信したほうが効率がよいからです。

HTTPリクエストに必要なデータサイズは、小さいため、1パケットに収まります。
HTTP通信では、HTTPリクエストがサーバに到達するまでに、最低でも4パケットが必要になります。
3-way handshake (3ウェイハンドシェイク)とHTTPのデータのパケットが必要です。

この TCP_DEFER_ACCEPT は、 Linux の Accept Filter の accept data で利用されています。
ACK が返ってこなければ、acceptも返せないということなんでしょう。
acceptシステムコールの呼び出しは、データが到着するまで返るまで遅延させられます。

リスニングソケットの場合

クライアント サーバ(リスニングソケット)
3way handshake, connect -- SYN -->
3way handshake ... SYN/ACKを返さない
3way handshake -- ACK -->
HTTPリクエスト, write -- Data --> accept,read
HTTPリクエスト, read <-- Data+ACK -- write

必ずしもデータが到達するわけではない


TCP_DEFER_ACCEPTは、acceptが返るのを遅延させますが、指定した秒数が過ぎるまで遅延されます。
「指定した秒数」が経過すると、データが到達していない場合でも accept の呼び出しが返ります。
そのため、acceptが返ったからといって、必ずしもデータが到達しているわけではない、ということになります。

TCP_DEFER_ACCEPT を使用する


C言語レベルで、TCP_DEFER_ACCEPTを有効にする場合、setsockopt()で、TCP_DEFER_ACCEPTを有効にします。

コーディングレベルでの利用例


httpd/httpd-2.2.20/srclib/apr/network_io/unix/sockopt.c

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー