2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TCPのストリーム通信・起動順序・接続の一意性

Posted at

#目次
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
2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?