MSSとはMaxium Segment Sizeの略で、分割・再構成なしに送受信できるデータの最大長を指します。通常はローカルリンクのネットワーク仕様から参照されますが(例えばIEEE802.3有線ネットワークの最大データ長(MTU)は1500バイト、IPおよびTCPヘッダーサイズを引くとMSS=1420バイト)、接続相手のMSSまではわからないので、SYNおよびSYNACKにはローカルリンクのMTUをTCP MSS option(RFC879)として付加する実装が一般的です。
受信側は受信データを引き取るたびにWIN値を増やし、必要に応じて送信側にACKとして返送します。これを「Window Update」と呼びます。送信側がWIN=0で停止していた場合は、Window Updateによって通信が再開します。
WIN=0で停止したコネクションのWindow Updateパケットが通信路上で失すると「互いが互いを待っている」デッドロック状態に陥ることがある注4)ため、WIN=0で停止したコネクションの送信側は一定時間(数十秒~数分)ごとにLEN=0のパケットを送ってACK返送を促す実装が推奨されます。この動作のことを「Window Probe」と呼びます。
TCPのWINヘッダーは16bit幅で、かつては最大65535バイトでした。LSI集積度が上がってメモリー容量が増大するとより大きなウィンドウサイズの実装が求められるようになり、RFC1323で「Window scaling option」が追加されます。これはWIN値への倍数を8bitのシフト値として追加したもので、理屈上は65535x2^255という無茶苦茶な値(3.8x10^81)まで拡張できますが、仕様上は最大14(WIN1あたり16Kバイト、最大ウィンドウサイズ65535x2^14=1Gバイト)までに制限されています。
通信経路上でパケットが消失した場合、受信側は「最後に受理したSEQ+LEN」をACKとして返送し、送信側はこれをもってパケット消失と再送の必要性を知ることができます。しかしウィンドウサイズが大きくパケット消失が多発する場合、ウィンドウ内に「虫食い」的にパケット消失が発生し、このとき単純な「最後のSEQ+LEN」方式では効率的な再送ができません。これは特に無線ネットワークにおいて顕著で、後にRFC3517で選択的ACK(Selective ACKまたはSACK)という拡張仕様が定義されました。SACKはビットマップによってデータの受信状態を示すもので、これによってパケット消失多発時の通信効率は向上しますが、実装はそれなりに複雑なものになります。IoTのように通信データ量が少なくかつ実装リソースの最小化が要求される場合、WINサイズを小さめ(数キロバイト)としてSACKは実装せず古典的なSEQ/ACK実装にとどめるほうが有利かも知れません。