Slide 1

Slide 1 text

A Shallow Dive into the World of TCP 渡部⿓⼀ Road to SRE NEXT@仙台

Slide 2

Slide 2 text

⼊⾨TCP

Slide 3

Slide 3 text

● RFC9293 Transmission Control Protocol ○ 2022年に40年越しに改定された ● IPネットワーク上のコネクション型‧⾼信頼性‧ストリーム指向 ● 3ウェイハンドシェイクで接続を確⽴し、信頼できる通信を保証 ● 順序制御と再送制御でパケットロスや順序の乱れを回避 ● 使わない⽇はないプロトコル TCP

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

完全に理解した

Slide 6

Slide 6 text

TCPクイズ1

Slide 7

Slide 7 text

● NGINXで処理が詰まってしまってしまった ● アプリケーションコンテナの処理時間はどうなる? 1. ⻑くなる 2. 変わらない

Slide 8

Slide 8 text

答え: どちらの可能性もある

Slide 9

Slide 9 text

● Nginxもアプリケーションもソケットバッファを持っている可能性がある ● ソケットバッファとはソケット通信において送受信されるデータを⼀時 的に保存するメモリ領域 ● ソケットバッファに書き込んだ時点で処理は終了となって処理時間が計算 される(ソケットバッファ>0) 解説

Slide 10

Slide 10 text

● ALBとかダウンストリームで全体の処理時間は伸びてるのにアプリケー ションの処理時間だけ短いみたいなケースはこう⾔うことが起きている 可能性がある ○ Ingress Nginxとかで⼤量のルールがあったり ● バッファーサイズとかは⼤量トラフィックを捌く必要がないならば⼤体 はデフォルトで事⾜りるがいざという時のチューニングポイントになる ● 処理時間がどこからどこまでかを正確に把握することは⽇々の運⽤でも ⼤事 ポイント

Slide 11

Slide 11 text

TCPクイズ2

Slide 12

Slide 12 text

● OSはどちらもLinux、TCPクライアント/サーバで通信 ● あるタイミングでサーバ側がソケットをclose ● その後にクライアントがサーバに対してデータ送信 ● クライアント側のプログラムはどうなる? 1. 成功する 2. 失敗する

Slide 13

Slide 13 text

答え: どちらの可能性もある https://github.com/ryuichi1208/tcp-syn-flood/tree/master/srv

Slide 14

Slide 14 text

● TCPは4 way-handshakeで通信を終了 ● FINパケットが来ても対向がソケットを読み取りしてる可能性がある ● closeしている可能性もあり、FINパケットを受け取ったOS側で通信相⼿がどちら の状態なのか判断できない ● アプリからのwriteはsocket bufferに乗るとその時点ではエラーにならず次回の write/readでエラーになる 解説

Slide 15

Slide 15 text

まとめ

Slide 16

Slide 16 text

● TCPに詳しくなることで⽇々の運⽤に活かせることはたくさんある ● アプリケーションから何が起きてるかわからないトラブルとか ● 信頼性を向上させるノウハウはたくさんあるのでこういったレイヤーか ら学んでみるのも良い まとめ

Slide 17

Slide 17 text

参考資料

Slide 18

Slide 18 text

● [書籍] UNIXネットワークプログラミング Vol.1 第2版 ● [書籍] TCP/IPソケットプログラミング (C⾔語編) ● 未知の領域でのSYNパケット処理 ○ https://blog.cloudflare.com/ja-jp/syn-packet-handling-in-the-wild/ ● Socket migration for SO_REUSEPORT (Part 1) ○ https://kuniyu.jp/ja/blog/6/ ● tcpの仕様上、接続先がコネクションをcloseしているかはパケットを⼀度は実際に送る までわからないよという話 ○ https://qiita.com/behiron/items/3719430e12cb770980f3 参考資料