地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

Nginxのlingering_closeってなんだろうと思って調べた

nginx.org

別件でNginxのソースをgdbデバッグしながら見てたらlingering_closeがなんたらというパスを見つけたのでせっかくなので調べてみた。lingeringは余韻という意味でクライアント/サーバモデルのシステムがあったとしてサーバ側がアクティブクローズになるケースでサーバはwrite(2)した直後にclose(2)やshutdown(2)をするとwrite(2)のデータがクライアントに届いていないみたいなケースがある。これはwrite(2)はローカルのソケットバッファーにデータを書いたら処理が戻るために起こる。以下のようなサーバを書いてみる。

import socket
import struct

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 8080))
sock.listen(10)

while True:
    client,address = sock.accept()
    print("[*] Connected!! [ Source : {}]".format(address))
    data = client.recv(1024)
    print("[*] Received Data : {}".format(data))
    client.send(b"a"*1024)
    client.close()
    print("close!!")