JavaWeb通信方式の発展過程とTCPバーIPプロトコルを知りたいですか?


本文の作者:楽バイト-坑王老薛
この問題は、私たちが技術を勉強している開発者にとって、多くの技術があり、現在では複雑で機能が強いと思っているかもしれませんが、実はこれらの技術はすべて先人が最も基礎的な機能からゆっくりと努力して積み重ねてこそ達成されたもので、私たちは多くの巨人の肩に立って前進しています.今日は、サーバがどのように徐々に発展してきたのかを見てみましょう.
つうしんモード
  • 簡易通信
  • 異なる要求
  • 複雑な要求
  • 実例実操
    たんいつつうしん
    Socketプログラミングが私たちに与えた最大の感じを振り返ると、複数のコンピュータ間でデータの伝送を行うことができます.これがネットワークプログラミングの始まりと基礎であり、クライアントとサービス端末間の通信を理解することで、Webの発展過程をより直感的に理解することができます.
    Client
    /**
     *    :        ,        
     * @author     
     *
     */
    public class Client {
    
        public static void main(String[] args) throws UnknownHostException, IOException {
            //              +  
            Socket client = new Socket("localhost", 8888);
            //          
            //      
            OutputStream os = client.getOutputStream();
            //          
            BufferedWriter br = new BufferedWriter(new OutputStreamWriter(os));
            //     ,    
            String msg = "Hello, I am Client, I need some resources";
            br.write(msg);
            br.close();
        }
    
    }

    Server
    /**
     *    ,               
     * @author     
     *
     */
    public class Server {
    
        public static void main(String[] args) throws IOException{
            //      ,    ServerSocket(int port)
            ServerSocket socket = new ServerSocket(8888);
            //        
            Socket client = socket.accept();
            System.out.println("******************");
            //         
            InputStream is = client.getInputStream();
            //          
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String msg = "";
            while ((msg = br.readLine()) != null) {
                System.out.println(msg);
            }
            br.close();
        }
    
    }

    サービス側コンソール:
    上記の例から通信条件をまとめると、以下のようになる.
  • はサーバ側(server)を必要とする:要求を待つ必要があり、ipとport
  • を暴露する必要がある.
  • クライアント(client):サービス側のipとport
  • を認識する要求をアクティブに開始する必要がある.
  • 通信ルール(プロトコル):TCP/IPプロトコル
  • ipはコンピュータを位置決めするために使用される.ポート番号(ロケータ)は、プロセスの論理アドレス、異なるプロセスのフラグを識別するために使用されます.有効ポート:0~65535、そのうち0~1023はシステムによって使用または保持され、開発では1024以上のポートの使用を推奨する.
    異なるリクエスト
    Client
    /**
     *    :        ,       
     * @author     
     *
     */
    public class Client {
    
        public static void main(String[] args) throws IOException {
            //           SocketImpl         
            Socket socket = new Socket();
            //      IP      (IP    +    )。        (    +    ),     ,        
            SocketAddress address = new InetSocketAddress("localhost", 8898);
            //            ,        。          
            socket.connect(address, 1000);
            OutputStream os = socket.getOutputStream();
            os.write("time".getBytes());
            os.flush();
            socket.close();
        }
    
    }

    Server
    /**
     *     
     * public class ServerSocketextends Object:          。
     *                 。
     *             ,            。
     * 
     * @author     
     *
     */
    public class Server {
        public static void main(String[] args) throws IOException {
            //                 。
            ServerSocket server = new ServerSocket(8898);
    
            // Socket accept()              。
            Socket client = server.accept();
            System.out.println("     ");
    
            InputStream is = client.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            byte[] req = new byte[1024];
            //        
            int len = bis.read(req);
            String reqStr = new String(req, 0, len);
            System.out.println(reqStr);
            if (reqStr.equals("money")) {
                System.out.println("here's the money");
            } else if (reqStr.equals("time")) {
                System.out.println("you have so much time");
            }
            client.close();
            server.close();
        }
    }

    サービス側コンソール:
    複雑な要求
    Client
    /**
     *    
     * 
     * @author     
     *
     */
    public class Client {
    
        public static void main(String[] args) throws IOException {
            //           SocketImpl         
            Socket socket = new Socket();
            //      IP      (IP    +    )。        (    +    ),     ,        
            SocketAddress address = new InetSocketAddress("localhost", 8898);
            //            ,        。          
            socket.connect(address, 1000);
    
            OutputStream os = socket.getOutputStream();
            os.write("money".getBytes());
            os.flush();
            //     ,     
            InputStream is = socket.getInputStream();
            byte[] result = new byte[1024];
            int len = is.read(result);
            String resultStr = new String(result, 0, len);
            System.out.println(resultStr);
            socket.close();
        }
    
    }

    Server
    /**
     *    
     * @author     
     *
     */
    public class Server2 {
    
        public static void main(String[] args) throws IOException {
            //                 。
            ServerSocket server = new ServerSocket(8898);
    
            // Socket accept()              。
            Socket client = server.accept();
            System.out.println("     ");
            InputStream is = client.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            byte[] req = new byte[1024];
            //        
            int len = bis.read(req);
            String reqStr = new String(req, 0, len);
            System.out.println(reqStr);
            //             ,        
            MyRequest request = new MyRequest();
            MyResponse response = new MyResponse();
    
            OutputStream os = client.getOutputStream();
            if (reqStr.equals("money")) {
                //        ,       
                MyServlet s1 = new ServletMoney();
                s1.service(request, response);
                //   client   ,          
                os.write("here's the money".getBytes());
                os.flush();
            } else if (reqStr.equals("time")) {
                //        ,       
                MyServlet s2 = new ServletTime();
                s2.service(request, response);
                //   client   ,          
                os.write("you have somuch time".getBytes());
                os.flush();
            }
            client.close();
            server.close();
        }
    
    }
    
    /*
     *          ,                    ,  :    ,           
     */
    interface MyServlet {
        void service(MyRequest req, MyResponse resp);
    }
    
    class ServletMoney implements MyServlet {
        /*
         * @see com.mage.server.MyServlet#service(com.mage.server.MyRequest, com.mage.server.MyResponse)
         */
        @Override
        public void service(MyRequest req, MyResponse resp) {
            //          
        }
    }
    
    class ServletTime implements MyServlet {
        /*
         * @see com.mage.server.MyServlet#service(com.mage.server.MyRequest, com.mage.server.MyResponse)
         */
        @Override
        public void service(MyRequest req, MyResponse resp) {
            //          
        }
    }
    
    /*
     *               
     */
    class MyRequest {
    }
    
    class MyResponse {
    }

    サービス側コンソール:クライアントコンソール:
    お客様のニーズがますます複雑になるにつれて、必要な機能がますます多くなり、私たちのサーバー側が処理する必要がある要求がますます多くなり、異なる要求を区別する必要があります.また、異なる要求に従って要求データの抽出と資源の分配と演算、論理的な処理を行う必要があります.最後にクライアントに応答する必要があります.これにより、サーバー側のコードはますます複雑になります.実現はますます困難になる.
    従来の経験によれば、双方が通信を行うには一定のルールに従うだけで各部分のデータの意味を明確に知ることができ、ネットワークのより上位層のアプリケーションプロトコル(HTTPプロトコル)が現れ、サーバ側とクライアント側の通信を規定するルールが現れた.
    クライアントがサーバ側とサーバ側にクライアントに応答するように要求するのは、固定されたルールに従っているので、要求と応答データを受信する操作は固定され、特定のコードに渡されて実行され、サーバ側のコード量を減らすことができ、徐々に私たちが現在使用しているサーバに進化しました.
    拡張~TCP/IPプロトコルクラスタ
    コンセプト
    TCP/IPプロトコルクラスタ(Transmission Control Protocol/Internet Protocol、トランスポート制御プロトコル/インターネットプロトコル)とは、複数の異なるネットワーク間で情報伝送を実現できるプロトコルクラスタを指す.
    TCP/IPプロトコルは、TCPとIPの2つのプロトコルだけでなく、FTP、SMTP、TCP、UDP、IPなどのプロトコルからなるプロトコルクラスタを指し、TCP/IPプロトコルの中でTCPプロトコルとIPプロトコルが最も代表的であるため、TCP/IPプロトコルと呼ばれる.
    TCP/IP伝送プロトコルは、厳密には4層のアーキテクチャであり、アプリケーション層、伝送層、ネットワーク層、およびデータリンク層が含まれている.
    アプリケーション層
    アプリケーション・レイヤは、アプリケーション・プロセスに直接サービスを提供し、異なる種類のアプリケーションでは、アプリケーション・レイヤの異なるプロトコルが必要に応じて使用されます.例えば、メール転送アプリケーションはSMTPプロトコル、ウェブアプリケーションはHTTPプロトコル、ファイル転送アプリケーションはFTPプロトコル、リモートログインサービスアプリケーションはTELNETプロトコルなどを使用している.
    でんそう
    転送層は、ネットワーク接続中の2台のコンピュータ間のデータ転送を提供する上位アプリケーション層である.
    トランスポート層には2つの性質の異なるプロトコルがあります.
  • TCP(Transmission ControlProtocol、転送制御プロトコル)
  • UDP(User Data Protocol、ユーザーデータレポートプロトコル).

  • ネットワーク層
    ネットワーク層は、ネットワーク上を流れるパケットを処理するために使用される.パケットは、ネットワーク転送の最小データ単位です.この層は,どのような経路(いわゆる伝送路)で相手のコンピュータに到達し,パケットを相手に伝送するかを規定している.ネットワーク層は,ネットワーク接続の確立と終了,IPアドレスの探索などの機能を行うことができる.
    リンク層
    リンク層は、接続ネットワークのハードウェア部分を処理するために使用される.オペレーティングシステム、ハードウェアを制御するデバイスドライバ、NIC(Network Interface Card、ネットワークアダプタ、すなわちネットワークカード)、光ファイバなどの物理的に可視な部分(コネクタなどのすべての伝送媒体も含む).ハードウェア上のカテゴリは、リンク層の役割の範囲内です.
    トランスファ概略図
    以上の概念とTCP/IPの4つの層の紹介に基づいて,ネットワーク伝送におけるTCP/IPプロトコルがどのように一歩一歩データを伝送しているのかを見ることができる.