ソケット、TCP、UDP、HTTP基本通信原理とOCバージョンDemo

15422 ワード

非常に分かりやすい例です.
  • TCPとUDPは伝送方式です.例えば航空便、フェリー、陸運
  • です.
  • HTTP、XMPPはデータ転送フォーマットプロトコルです.送りものです.
  • socketは、トランスポート層とアプリケーション層の前の抽象的なオブジェクトとして理解され、TCP/IPの世継ぎ方式のパッケージを通じて、パッケージ化された方法を呼び出して通信を実現することができますが、両方のIP、ポート、プロトコル–を知っておく必要があります.
    何がソケットですか
    TCP、UDP、HTTPの底の通信は全部socketソケットを通じてネットワークの上で異なっているコンピュータを実現するので、通信もできて、それならネットのソケット(socket)を使わなければなりません.socketとは、異なるコンピュータ間で通信するという抽象的なものです.彼はTCP/IPプロトコルにおいて、アプリケーション層とトランスポート層との間で働いている抽象的なSocket,TCP,UDP,HTTP基本通信原理和OC版本Demo_第1张图片をまとめた.1.SocketはTCP/IPプロトコル族に対するパッケージであり、アプリケーション層とTCP/IPプロトコル族と通信する中間ソフトウェア抽象層である.デザインモードの観点から見れば、Socketは実は1つの外観モードで、複雑なTCP/IPプロトコル族をソケットインターフェースの後ろに隠しています.ユーザーにとって、簡単なインターフェースのセットは全部です.指定されたプロトコルに合うように、Socketにデータを組織させます.2.ソケットはまた、ネットワーク間の異なるコンピュータ上のプロセス通信の一つの方法と考えられ、3つのタプル(ipアドレス(ホスト)、プロトコル(転送方式)、ポート(ホスト上のプロセスフラグ)を利用して、ネットワーク内のプロセスを一意に識別することができ、ネットワーク内のプロセス通信は、このフラグを利用して他のプロセスと対話することができる.3.socketは異なるコンピュータ間の通信、つまりネットワーク通信を保証しています.ウェブサイトでは、通信モデルはクライアントサーバ間の通信である.両方の端末が一つのsocketオブジェクトを作成して、socketオブジェクトを通じてデータを転送します.通常、サーバは無線ループにあり、クライアントの接続を待つ.
    簡単な理解:ソケットは英語で「穴」または「ソケット」を意味し、ソケットは通常「ソケット」とも呼ばれる.IPアドレスとポートを記述するために使用される.通信チェーンのハンドルであり、異なる仮想マシンまたは異なるコンピュータ間の通信を実現するために使用できる.インターネット上のホストコンピュータでは一般的に複数のサービスソフトを実行しており、同時にいくつかのサービスを提供しています.各サービスは一つのソケットを開き、一つのポートに結び付けられます.異なるポートは異なるサービスに対応します.ソケットは英語の原意のように、多孔性のコンセントのようです.一台の本体はまるで各種のコンセントを満たす部屋のようです.各コンセントには番号があります.あるコンセントは220ボルトの交流を提供します.あるものは110ボルトの交流を提供します.あるものはケーブルテレビ番組を提供します.お客様のソフトウェアはプラグを異なる番号のコンセントに差し込むと、異なるサービスネットワーク上の二つのプログラムが一つの双方向の通信接続によってデータの交換が可能になります.この接続の端は一つのsocketアプリケーションといいます.通常はソケットを通じてネットワークに要求または応答します.
    デモデモ
    Socket,TCP,UDP,HTTP基本通信原理和OC版本Demo_第2张图片
    TCPとは
    TCP(TCP制御プロトコル、HTTPのインタラクション方式はTCPインタラクション方式であり、接続に向けた信頼できるバイトフローサービス)は、一つのTCP接続において、二人だけで通信する必要がある.ブロードキャストとマルチキャストはTCPには使用できません.
  • は接続を確立し、データ伝送路
  • を形成する.
  • リンクで大データ転送を行い、データは制限されない
  • 3回の握手でリンクが完了した信頼できるプロトコルです.
  • は接続を確立しなければならなくて、効率は少し低いです.
    三回握手(Three-way Handschake)とは、TCP接続を確立する際に、クライアントとサーバが全部で3つのカバンを送る必要があるということです.三回の握手の目的は、サーバ指定ポートを接続し、TCP接続を確立し、双方のシリアル番号と確認番号を同期させ、TCPウィンドウサイズ情報を交換することです.socketプログラミングにおいて、クライアントがconnect()を実行する場合.握手を三回触発します.Socket,TCP,UDP,HTTP基本通信原理和OC版本Demo_第3张图片
    *      (SYN=1, seq=x):
    
                TCP   SYN     1  ,                ,       X,         (Sequence Number)   。
    
             ,      `SYN_SEND`   。
    
    *      (SYN=1, ACK=1, seq=y, ACKnum=x+1):
    
                (ACK)  。  SYN      ACK      1。         ISN    ,   Seq   ,       (Acknowledgement Number)       ISN  1, X+1。 
             ,       `SYN_RCVD`   。
    
    *      (ACK=1,ACKnum=y+1)
    
                  (ACK),SYN     0,ACK     1,         ACK      +1,            ,        ISN +1
    
             ,      `ESTABLISHED`   ,            ,    `ESTABLISHED`   ,TCP     。
    UDPとは何ですか
    UDP(ユーザデータグラムプロトコル、接続なし、信頼できないネットワークプロトコル、マルチキャスト、ブロードキャスト、例えば授業同期生放送)
  • は、データとソース(私のコンピュータIP)と目的(他のコンピュータのIP)をパケットにパッケージ化し、接続を確立する必要がない
  • データの大きさは64 k以内に制限されています.なぜ小さいのですか?例えば20分の大きさで一回送信したら、エラーが発生しました.この20分は全部見えなくなりました.もし一秒に一回発行したら、次の秒で接続できます.サイズは制限があります.
  • は接続する必要がないので、信頼できないプロトコルです.
  • は接続を確立する必要がなく、速度が速いSocket,TCP,UDP,HTTP基本通信原理和OC版本Demo_第4张图片
  • .
    1.UDPプロトコルのサーバーエンドフロー
    UDPプロトコルのサーバ端プログラム設計の流れは、ソケット確立、ソケットとアドレス構造を結びつける、データを送受信する、ソケットを閉じるなどのプロセスに分けられ、それぞれ関数socket()、bind()、sendto()、recvfrom()、close()に対応します.
    ソケットプロセスを確立するには、このプロセスはTCPプロトコルと同じ意味ですが、確立されたソケットタイプはデータグラムソケットです.アドレス構造とソケットファイル記述子を結合する過程では、TCPプロトコルのバインディングプロセスとは異なるアドレス構造の種類がある.バインディング動作が成功すると、確立されたソケットからrecvfrom()関数を呼び出してデータを受信したり、sendto()関数を呼び出して、確立されたソケットにネットワークデータを送信したりすることができます.関連する処理が終了すると、クローズド関数を呼び出してソケットを閉じる必要があります.
    2.UDPプロトコルのクライアントフロー
    UDPプロトコルのサーバ端プログラム設計の流れは、ソケットの確立、送受信、ソケットのクローズなどのプロセスに分けられ、それぞれ関数socket()、sendto()、recvfrom()、close()に対応します.
    ソケットプロセスを確立するには、このプロセスはTCPプロトコルと同じ意味ですが、確立されたソケットタイプはデータグラムソケットです.ソケットを確立すると、関数sendto()を呼び出して、確立されたソケットにデータを送るか、またはrecvfrom()関数を呼び出して、確立されたソケットからネットワークデータを受け取ることができます.関連する処理が終了すると、クローズド関数を呼び出してソケットを閉じる必要があります.
    3.UDPプロトコルサーバとクライアントの相互作用
    UDPプロトコルでは、サーバとクライアントの相互作用がデータの送受信過程に存在します.ネットワークデータの送受信を行う場合、サーバとクライアントのデータは対応します.クライアントがデータを送信する動作は、サーバにとってデータを受信する動作です.クライアントがデータを受信する動作は、サーバにとってデータを送信する動作である.
    UDPプロトコルサーバとクライアントとの相互作用は、TCPプロトコルとの相互比較で、両者間の接続が不足しています.これはUDPプロトコルの特徴によって決められたもので、UDPプロトコルは流量制御が必要ではなく、データの信頼性を保証しないので、サーバとクライアントとの間で接続を確立するプロセスが必要ではない.
    HTTPとは
  • HTTP最下層は、ソケットを介してリンク通信パイプラインを確立し、データ転送を実現する
  • である.
  • HTTPは、TCP転送プロトコルのうちの一つの方法であり、彼は信頼できる、安全なプロトコルであり、XMPPと同様に、定義されたデータフォーマット転送プロトコル
  • である.
  • HTTPはTCP/IPプロトコル上に構築され、デフォルトポート番号は80
  • である.
  • HTTPは、無接続状態のHTTP超詳細分解転送ゲート
  • である.
    簡単なTCPサービスとクライアントの相互作用の原理を書きます.
    Socket,TCP,UDP,HTTP基本通信原理和OC版本Demo_第5张图片1.->CocoaAsyncSocket(7.5.1)を使用して、一つの種類のパッケージ方法で、runloopループを開始します.
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            NSLog(@"Hello, World!");
    
            MKJSocketService *socketService = [[MKJSocketService alloc] init];
            [socketService connected];
            [[NSRunLoop mainRunLoop] run];   
        }
        return 0;
    }
    2.サービス端末なので、サービス端末のsocketと可変配列保存接続のクライアントsocketが必要です.
    @interface MKJSocketService () <GCDAsyncSocketDelegate>
    
    @property (nonatomic,strong) GCDAsyncSocket *serviceSocket; //    socket
    @property (nonatomic,strong) NSMutableArray *connectionClientSockets; //      socket
    
    @end
    
    @implementation MKJSocketService
    
    - (NSMutableArray *)connectionClientSockets
    {
        if (_connectionClientSockets == nil) {
            _connectionClientSockets = [[NSMutableArray alloc] init];
        }
        return _connectionClientSockets;
    }
    
    - (instancetype)init
    {
        if (self = [super init]) {
    
            /**   :      socket,   socket(),bind(),lisence(),accept(),        ,           socket    */
            self.serviceSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_global_queue(0, 0)];
        }
        return self;
    }
    注意:ここのサービス端末socketは傍受部分まで完成しただけで終わって、後続のすべての操作、readまたはwriteまたはその他はクライアントのSocketの呼び出しです.
    3.接続の方法を呼び出し、接続できるクライアントを傍受する
    - (void)connected
    {
        NSError *error = nil;
        //           ,0-1024    
        [self.serviceSocket acceptOnPort:3666 error:&error];
        if (error) {
            NSLog(@"3666       。。。。。");
        }
        else
        {
            NSLog(@"    ,     ");
        }
    }
    //                Mac      telnet IP port         ,              
    - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
    {
        NSLog(@"   %@",sock);
        NSLog(@"   %@ IP:%@,%d     ",newSocket,newSocket.connectedHost,newSocket.connectedPort);
        // 1.          ,      
        [self.connectionClientSockets addObject:newSocket];
    
        // 2.             sock      
        [newSocket readDataWithTimeout:-1 tag:0];
    
        // 3.write                           
        NSMutableString *options = [NSMutableString string];
        [options appendString:@"                   
    "
    ]; [options appendString:@"[0]
    "
    ]; [options appendString:@"[1]
    "
    ]; [options appendString:@"[2]
    "
    ]; [options appendString:@"[3]special services
    "
    ]; [options appendString:@"[4]
    "
    ]; // [newSocket writeData:[options dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; }
    注意:[newSocket readDataWithTimeout:-1 tag:0];调节者はサーバーのsocketではありません.サービス端末のsocketは傍受部までしか担当していません.その後は必要ありません.ここの呼出者は接続されたクライアントです.また、データを受け取るたびに、またはデータを送るたびに呼び出して、次の受信データができます.
    4.クライアントからメッセージを受信し、クライアントの要求が切断されたらどうやって操作しますか?
    /**          ,   write         ,       socket          socket                    ,           ,     ,      write         */
    - (void)socket:(GCDAsyncSocket *)clientSock didReadData:(NSData *)data withTag:(long)tag
    {
        NSString *receiveStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        switch ([receiveStr integerValue]) {
            case 0:
                [self writeDataWithSocket:clientSock message:@"  188,   
    "
    ]; break; case 1: [self writeDataWithSocket:clientSock message:@" 288,
    "
    ]; break; case 2: [self writeDataWithSocket:clientSock message:@" ,
    "
    ]; break; case 3: [self writeDataWithSocket:clientSock message:@" , ,
    "
    ]; break; case 4: [self exitSocket:clientSock]; break; default: [self writeDataWithSocket:clientSock message:@"
    "
    ]; break; } [clientSock readDataWithTimeout:-1 tag:0]; } /** */ - (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err { NSLog(@" "); } /** */ - (void)writeDataWithSocket:(GCDAsyncSocket *)socket message:(NSString *)msg { [socket writeData:[msg dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:0]; } /** , Connection closed by foreign host. , , socket @param socket socket */ - (void)exitSocket:(GCDAsyncSocket *)socket { [self writeDataWithSocket:socket message:@"
    "
    ]; [self.connectionClientSockets removeObject:socket]; NSLog(@"currentSocket:%ld",self.connectionClientSockets.count); }
    5.一つの提案のチャットカスタマーサービスの機能が終了しました.Demoを開けて、実行して、端末を開けてtelnet IPアドレスポート番号を入力して確認したらリンクが成功しました.簡単なインタラクションができます.
    Demoトランスポートゲート