LoginSignup
1
0

More than 1 year has passed since last update.

LinuxでのTCP通信の処理(Listenまで)

Last updated at Posted at 2022-02-16

システムコールから辿る

image.png

sys_listen()

システムコールで呼ばれる大元の関数

  1. 引数から作成されたソケットを取得
  2. backlogの精査
  3. inet_listen()の呼び出し

sock->ops->listen()とは?

socket構造体にあるproto_ops構造体です。ソースコード

proto_ops構造体はinclude/linux/net.hで宣言されておりipv4でTCP通信の際の実装はnet/ipv4/af_inet.cで行っています。

TCP通信はinet_stream_opsになるので、inet_listen()が呼び出されています。

inet_listen()

  1. sockをロック
  2. sockの状態、Typeの精査(CloseとListen以外の状態をはじく、STREAMのみ通す)
  3. バックログの更新
  4. sockの状態がListen以外なら
    1. tcp_fastopenの設定(まだ分からない)
    2. inet_csk_listen_start()の呼び出し

上記の実装をする事でlisten状態でも、BackLogの更新が可能になる

inet_csk_listen_start()

  1. reqsk_queue_alloc()でバックログで指定された分だけSYNリクエストキューの割り当て
  2. ACK回りのメンバをリセット
  3. sockの状態を「TCP_LISTEN」に変更
  4. ポートを割り当てることが出来たら
    1. inet_spotにポートを登録
    2. dst_entryをリセット
    3. リスニングソケットハッシュへ登録
  5. ポートの割り当てができなかったら、
    1. sockの状態を「TCP_CLOSE」に変更
    2. 1番で割り当てた、queueを削除

参考文献

https://www.codetd.com/ja/article/11908254#3.2%20inet_csk_listen_start%28%29
https://elixir.bootlin.com/linux/latest/source/net/ipv4/af_inet.c#L192
https://elixir.bootlin.com/linux/latest/source/net/ipv4/inet_connection_sock.c#L1038
https://elixir.bootlin.com/linux/latest/source/net/socket.c#L1716
https://elixir.bootlin.com/linux/latest/source/include/linux/net.h#L114
https://elixir.bootlin.com/linux/latest/source/include/linux/net.h#L137
https://elixir.bootlin.com/linux/latest/source/net/ipv4/af_inet.c#L1020

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0