マスタリングTCP/IP: その他のトランスポートプロトコル
自分用の読書メモです。
6.5.1 UDP-Lite(Lightwight User Datagram Protocol)
- UDPの機能を拡張したトランスポートプロトコル
- UDPによる通信では、チェックサムエラーが発生すると、パケット全体が破棄される
- アプリによっては破棄せずに利用したいケースもある
- UDPでチェックサムを無効にすれば、データの一部にエラーが発生していてもパケットが破棄されずに済むが...
- UDPヘッダ中のポート番号や、IPヘッダ中のIPアドレスが壊れたパケットを受信してしまう可能性があるので、UDPパケットのチェックサムを無効にする事は推奨されていない
- これらの問題を解決するためにUDP-Liteが生まれた
- UDP-LiteはUDPとほぼ同等の機能を提供するが、チェックサムを計算する範囲をアプリケーションが決める事がで出来る
- エラーが発生していてはいけない部分のみチェックする事が可能になり、そうでない部分にエラーが発生したデータは利用する事が出来る
6.5.2 SCTP(Stream Control Transmission Protocol)
- SCTPは、TCPと同様にデータの到達性に関する信頼性を提供するトランスポートプロトコル
- SCTPによるネットワーキングの向上 https://www.ibm.com/developerworks/jp/linux/library/l-sctp/
メッセージ単位の送受信
- TCPは送信側のアプリケーションが決めたメッセージサイズが受信側のアプリケーションには伝わらないが、SCTPでは送信側のアプリケーションが決めたメッセージサイズが受信側のアプリケーションで分かる
マルチホーミングに対応
複数のストリームの通信
メッセージの生存時間を定義できる
生存時間を過ぎたメッセージの再送は行わない
SCTPではアプリケーションのメッセージを「チャンク」と呼んでおり、複数のチャンクをまとめて1つのパケットを作る
- 通信するアプリケーション間で小さなメッセージをたくさん送る時に向いている
- マルチホーミングに対応していて複数のIPアドレスを設定出来るという特徴がある
- マルチホーミングとは1つのホストが複数のネットワークインターフェースを備えていること
- TCPの場合はイーサネットで通信を開始した後で無線LANに切り替えると、コネクションが切れてしまうが、SCTPの場合には、複数のIPアドレスを管理しながら通信が出来るため、無線LANとイーサネットを切り替えても通信を維持する事が出来る
WebRTCによるビデオチャットサービスの開発 http://qiita.com/chiku_/items/ece8f14a6f6139f40d71
- WebRTCを支えるマイナーなプロトコルSRTP/DTLS/SCTPを分かった気になる http://www.slideshare.net/iwashi86/20140801-web-rtcmeetup3r3
DCCP (Datagram Congestion Control Protocol)
特徴
- UDPと同様にデータの到達制に関する信頼性はない
- コネクション志向で、コネクションの確立と切断処理がある。コネクションの確立と切断の処理には信頼性がある
- ネットワークの混雑に合わせたふくそう制御を行うことができる
- 「TCPライクなふくそう制御」と「TCPフレンドリーなふくそう制御」のどちらかの方法を選択できる
- ふくそう制御を行うため、パケットを受信した側は確認応答(ACK)を返す。この確認応答を使って再送をする事も可能
6.6 UDPヘッダのフォーマット
送信元ポート番号
- 16ビット長のフィールドで、送信元のポート番号を示す
- 送信元ポート番号はオプションで、指定しない事も可能
- これは返事を必要としない通信で利用する事ができる
宛先ポート番号
- 16ビット長のフィールドで、宛先のポート番号を示す
パケット長
- UDPヘッダの長さとデータの長さと和が格納される。単位はオクテット長。
チェックサム
- チェックサムはUDPのヘッダとデータの信頼性を提供
- 受信ホストがチェックサムを再計算し、マッチしなければデータを破棄する
- 2の補数 https://paiza.io/projects/Qr2NZM0y0ipUlPTXjiQbZA
- チェックサムを計算する時にはUDP擬似ヘッダをUDPデータグラムの前に付ける
- UDPヘッダにはIPアドレスが含まれていないため、UDP擬似ヘッダを作成する
- チェックサムを使用しないことも可能
- チェックサムフィールドに0を入れる
- こうするとチェックサムの計算処理が行われなくなるため軽くなるなるが、UDPヘッダのポート暗号やIPヘッダのIPアドレスの値が壊れると、ほかの通信に悪影響を及ぼす可能性があるため、現在のインターネットではチェックサムを利用することが推奨されている
TCPヘッダのフォーマット
送信元ポート番号
- 16ビット長フィールド
宛先ポート番号
- 16ビット長のフィールド
シーケンス番号
- 32ビット長のフィールド
- データを送信するたびに、送信したデータのオクテット数だけ値が加算される
- シーケンス番号は0や1からは始まらない
- コネクションを確立する時に乱数で初期値が決定される
- コネクション確立時のデータも1バイト分と数えて処理が行われる
確認応答番号
- 32ビット長のフィールド
- 次に受信すべきデータのシーケンス番号
- 確認応答番号から1を引いたシーケンス番号
データオフセット
- TCPヘアのサイズ
予約
- 将来の拡張のために用意されているフィールド
コントロールフラグ
- 8ビット長で、各ビットは左から CWR、ECE、URG、ACK、 PSH、RST、SYN、FIN と名付けられている
CWR (Congestion Window Reduced)
- CWRとECEはIPヘッダのENCフィールドとともに使われる。ふくそう制御に。
ECE(ECN-Echo)
- ECEフラグはECN-Echoを意味するフラグで、通信相手に、相手側からこちらに向かうネットワークがふくそうしていることを伝える
- 受けとったパケットのIPヘッダの中のECNビットが1のときにTCPヘッダのECEフラグを1にする
URG(Urgent Flag)
- このビットが「1」の場合は、緊急に処理すべきデータが含まれていることを意味する
ACK(Acknowledgement Flag)
- このビットが「1」の場合には、確認応答番号のフィールドが有効であることを意味する
- コネクション確立時のSYNセグメント以外は、必ず「1」になっていなければならない
PSH(Push Flag)
- このビットが「1」の場合は、受信したデータをすぐに上位のアプリケーションに渡さなければならない
- 「0」の場合には受信したデータをすぐにアプリケーションに渡さずに、バッファリングすることが許される
RST(Reset Flag)
- このビットが「1」の場合には、コネクションが強制的に切断される
SYN(Synchronize Flag)
- コネクションの確立に使われる
- ここに「1」が指定されている場合には、コネクションを確立したいという意思を表すとともに、シーケンス番号のフィールドに格納されている番号でシーケンス番号の初期化が行われる
FIN(Fin Flag)
- ここに「1」が指定された場合には、今後送信するデータが無い事を意味し、コネクションを切断したいという意思を示す事になる
ウィンドウサイズ
- 16ビット長
- TCPヘッダに含まれる確認応答番号で示した位置から、一度に受信可能なデータサイズ(オクテット)を通知するのに使う
- ここに示されているデータ量を超えて送信する事は許されない
- ウィンドウが0と通知された場合には、ウィンドウの最新情報を知るために「ウィンドウプローブ」を送信することが許されている。この場合には、 データは 1 オクテットでなければならない。
チェックサム
- TCPのチェックサムもUDPのチェックサムとほぼ同じ
- チェックサムの計算にTCP擬似ヘッダを使用する
- ただし、TCPの場合ではチェックサムをOFFにすることはできない
- 16 ビット単位で1の補数の和を求め、求まった和の 1 の補数をチェックサムフィールドに入れる
1の補数の和を求め、求まった和の1の補数を~の意味が理解出来なかった。
この疑問にストレートに答えてくれているブログ記事を見つけて喜びの舞ヾ(@^▽^@)ノ
だが全部理解するまでに挫折しそう...