#目次
1.目的
2.用語
3.ストリーム通信
4.サーバとクライアントの起動順序
5.接続の一意性
#1. 目的
実務でTCP通信によるデータの送受信を扱ったとき、理解したところや誤解があったところを備忘録として残します。
#2. 用語
3ウェイハンドシェイク
TCP通信は、通信相手の応答があって初めて通信を開始する。
このため、データ転送を行う前に接続の確立をする。
この接続の確立を、3ウェイハンドシェイクという。
SYN
SYNパケットはクライアントからサーバへ接続を開始したいときに最初に送るパケット。
ACK
IPネットワークで標準的に用いられるTCP(Transmission Control Protocol)で伝送制御に用いられるパケットの種類の一つで、相手に何らかの応答をするときに送られるパケット。
シーケンス番号
TCPで送信されるパケットにつけられる通し番号。
ソケット通信
そのTCP/IPを プログラムから利用するには、プログラムの世界とTCP/IPの世界を結ぶ特別な 出入り口が必要となります。その出入り口となるのがソケット (Socket)であり、TCP/IPのプログラミング上の大きな特徴となっています。 このため、TCP/IP通信をソケット通信と呼ぶこともあります。
引用元: http://research.nii.ac.jp/~ichiro/syspro98/socket.html
#3. ストリーム通信
TCP通信はストリーム型であり、送信データと受信データが1対1ではない場合がある。
例えば送信データ1つに対し、受信データが1つ未満の場合がある。
どういうことか
//【例】データ情報
2021-04-30,hogehoge,Tokyo
上記のデータをまるまる送受信するのではなく、複数回に分けて送受信する場合があるということ。
受信側がどれだけの情報量を受付できるのか、状況によって異なる。
このため、送信側に対し、受信側は受付可能な情報のサイズをwindowフィールドにセットし、知らせる。
送信側はwindowフィールドにセットされた以上のデータ送信をしない。
受けての処理能力やバッファ用メモリ領域などの理由で、送信量を制限する必要もでてくる。 セグメント・ヘッダにあるWindowというフィールドはそのため(これをフロー、つまり流量制御という)に用意されている。基本的に受けてはこれからどれだけまでのデータが受付可能かをこのフィールドにセットすると、送信側はそれ以上のデータを相手がACKを返す前に送信することを控える。
引用元:https://www.cresc.co.jp/tech/network/NET_TUTORIAL/Section_46.htm
//受信データが1未満の場合。
2021-04-30,hogeho //1回目受信
ge,Tokyo //2回目受信
例えば送信データが2つの場合は、受信データが1つ以上2つ未満の場合もある。
//【例】データ情報
2021-04-30,hogehoge,Tokyo
2021-05-01,piyopiyo,Osaka
//受信データが1つ以上2つ未満
2021-04-30,hogehoge,Tokyo 2021-05-01,pi //1回目受信
yopiyo,Osaka //2回目受信
どのようにして、データの切れ目を判断するか。
複数回に分けて受信するなら、どこからどこまでが1つのデータなのかを判断できるように実装する必要がある。
メッセージの長さを取得し、その長さ分がきたら切データの切れ目と判断するなど。
- 特定の文字をデータの終わりにつけて判別できるようにする(CRLFなど)
- メッセージを固定長にする(固定長データが届いたらそれで完了という判断)
- パケット内のヘッダ(L7)にてデータのサイズを書き込んでしまう
- 送信側が書き込みをshutdownする→このとき受信側は今来ているものをrecvするだけでよい
- アプリケーションで制御する
#4. サーバとクライアントの起動順序
TCPクライアントの要求を受けるため、TCPサーバは受信待ち受けの状態でいる必要がある。
このため、TCPサーバはTCPクライアントよりも先に起動する。
(TCPクライアントからTCPサーバに接続要求をするときが、TCP通信起動シーケンスの最初と誤解していた。)
#5. 接続の一意性
- ポート番号1つにつき、TCPセッションは1つ。 ※ 「セッション」と「コネクション」は違うの?
- TCPというプロトコルに対して割り振られるIPとポートの組み合わせがある。
- プロトコルが違えば、IPとポートの組み合わせが同じものも使用できる。
このように、ひとつのサーバは複数のクライアントからのTCP接続を受け付けることができます。
TCPによる接続は、
- 相手のIPアドレス
- 自分のIPアドレス
- TCP宛先ポート番号
- TCP送信元ポート番号
を利用して一意性が保たれます。
TCPにポート番号の組があるのは、同一の機器同士が複数のTCP接続を同時に張れるようにするためです。
引用:TCP通信の基礎 P34