zoukankan      html  css  js  c++  java
  • java networking

    fundamental networking in java:
    1.summary
    用java开发网络编程应用优势在于:
    1.跨平台型
    2.轻量级线程模型  网络编程跟多线程结合
    3.安全性 没有指针,垃圾回收机制;很好的异常处理机制,oom异常也能捕获;未捕获的运行时异常只影响所在的线程,不影响进程。
    4.可扩展性灵活性,以及良好丰富的类库。java的网络库更简单易用。
    
    2 IP:
    Socket:一台机器的通讯节点称为socket,在java中,socket是java.net包里面的Socket,ServerSocket,DataGramSocket,MultiSocket的实例。
    IP地址java中用java.net.InetAddress来表示。
    java network address class包括:
    InetAddress:ip地址或者域名,指向远程地址。如果域名解析不了,则出错。
               抽象类,有两个子类:Inet4Address和Inet6Address。这两个类智能通过InetAddress的静态方法获取,不能直接构造。包可见。
    InetSocketAddress extends SocketAddress:ip socket地址,用{ip,port}或者{hostname,port}表示。也能够单独用port构造,表示本机ip地址,所有本机网络地址。
    NetwordInterface:本机网络接口,由多个网络接口名称和对应的网络接口的ip地址列表构成。
    
    网络主机有两个特殊的网络地址:
    loopback:127.0.0.1  用来检测本机的host名称,或者检测本地ip地址是否可用
    wildcard:0.0.0.0 绑定了本机所有的ip地址
    
    IPV6支持IPV4,可以通过以下的环境变量对ipv4和ipv6进行设置
    java.net.preferlPv4Stack  false(default)/true  false:表示支持ipv4heipv6,true表示只支持ipv4,
    java.net.preferlPv6Address  false(default)/true  false,如果ipv6可用,则ipv4地址会覆盖掉ipv6地址,如果为true,则ipv6会覆盖ipv4地址,通讯地址使用ipv6.
    
    3.TCP: 可靠的,基于流的连接,双向的
     两种TCP socket:active和passive(listening)  
    serversocket:create a socket->binds to a port -> listen() -> loop accepte client connect -> read/write
    client socket:create a socket -> connect to a address -> read/write
    
    
    连接:三次握手:最多重试三次,第一次3-6s,后面double。
    关闭连接:四次握手
    
    server socket:
      如果port设置为0,不设置,则系统会自动分配一个端口。如果设置为1-1023端口,需要高级用户权限。
      backlog:请求队列最大长度,服务器端等待请求的最大队列数。默认50.
      localaddress:server监听的本机地址,默认是所有的。
        setReuseAddress(boolean on):如果停止服务之后,需要马上重启服务,那么之前的端口可能还占用导致启动不了。设置该参数表示该地址可以重用。
        setReceiveBufferSize (int size):设置接收缓冲区大小。必须在绑定端口之前设置。为了达到更大的吞吐量,可以设置得大一点(>64k)。但是跟sendBufferSize最好配合使用。
    client socket:
      如果port不设置,则默认跟连接的server一致。 
      setSendBufferSize(int size)必须在connect之前设置
    
       Socket IO:
    DataOutputStream DataInputStream  ObjectInputStream ObjectOutputStream
    
    可能导致死锁:下面两行代码顺序可能导致死锁,因为server和client的ObjectInputStream都尝试读取对方的object stream header的数据,这样导致server和client都在等待,处于死锁。获取ObjectOutputStream必须在获取ObjectInputStream之前。
    ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
    
    InputStream.available()获取当前socket buffer的大小。
    
    channel IO:
    
    output shutdown:半关闭 
    class Socket
    {
    void shutdownOutput() throws IOException;
    boolean isOutputShutdown();
    }
    特点:1.可读不可写;2.当socket关闭时,会close该连接。3.另一端read时会得到EOF异常
    在proxy中,copy input to output时需要close output,这样才能把代理端的EOF也复制。如果不需要read操作,可以关闭output,减少reply数据的计算和传输的资源。
    
    Socket.close()异步操作
    
    input shutdown:半关闭
    class Socket
    {
    void shutdownInput() throws IOException;
    boolean isInputShutdown();
    }
    特点:1直接丢弃数据,远程端无法感知本地已经关闭input。
    
    close a connected socket:
    class Socket
    {
    void close() throws IOException;
    boolean isClosed();
    }
    1.socket.close() 2 socket.getOutputStream().close(); 3 socket.getInputStream().close();
       
    close a server socket:
    class ServerSocket
    {
    void close() throws IOException;
    boolean isClosed();
    }
    
    socket factory:
    java 提供三种socket factory:
       java.net socket factory:SocketImplFactory  Socket类的public static synchronized void setSocketImplFactory(SocketImplFactory fac)只能在一个jvm中调用一次,需要RuntimePermission ‘setFactory’
       RMI socket factory:RMISocketFactory  RMIServerSocketFactory RMIClientSocketFactory
       ssl socket factory.
    
    socket:sendbuffer和receivebuffer的大小由tcp协议栈决定,不是由jvm。传统的tcp实现默认是2kb,但是现在更多的如28kb,32kb,64kb。
    
    1.以太网最好从4kb增大到16kb  >=3 * MSS sendbuffer>=receivebuffer
    2.如果应用读取数据很慢,那么receivebuffer要设置得大一点,避免阻塞sendbuffer。
    3.应用程序如果要发送也要接受大量数据,则需要增加这两个值。
    4.java中最好使用bufferoutputStream或者ByteBuffer,来写入足够数据的TCP块。
    
    //立刻发送urgentdata的数据,而write的数据要flush之后才发送。server和client都要同时开启。
       socket.setOOBInline(true);  
    socket.sendUrgentData(65); 
    
       public void setTrafficClass(int tc) 
       * <UL>
         * <LI><CODE>IPTOS_LOWCOST (0x02)</CODE></LI>
         * <LI><CODE>IPTOS_RELIABILITY (0x04)</CODE></LI>
         * <LI><CODE>IPTOS_THROUGHPUT (0x08)</CODE></LI>
         * <LI><CODE>IPTOS_LOWDELAY (0x10)</CODE></LI>
         * </UL>
    
    
           If the
         * application prefers short connection time over both low latency and high
         * bandwidth, for example, then it could invoke this method with the values
         * <tt>(1, 0, 0)</tt>.  If the application prefers high bandwidth above low
         * latency, and low latency above short connection time, then it could
         * invoke this method with the values <tt>(0, 1, 2)</tt>.
     public void setPerformancePreferences(int connectionTime,
                                              int latency,
                                              int bandwidth)
    
    scaable IO:
    
    channel create:
    FileChannel FileInputStream.getChannel();
    FileChannel FileOutputStream.getChannel();
    FileChannel RandomAccessFile.getChannel();
    
    SocketChannel channel = SocketChannel.open();
    Socket socket = channel.socket();
    
    ServerSocketChannel channel = ServerSocketChannel.open();
    ServerSocket serverSocket = channel.socket();
    
    DatagramChannel channel = DatagramChannel.open();
    DatagramSocket datagramSocket = channel.socket();
    
    //
    Pipe pipe = Pipe.open();
    Pipe.SinkChannel sinkChannel = pipe.sink();
    Pipe.SourceChannel sourceChannel = pipe.source();
    
    Stream和channel的转换:Channels.java
    //not buffered,not support mart/reset operation;thread safe;only be use in blocking mode;closing them cause the underlying channel to be closed;
    class Channels 
    {
    // convert streams to channels
    static ReadableByteChannel newChannel(InputStream is);
    static WritableByteChannel newChannel(OutputStream os);
    // convert channels to streams
    static InputStream
    newInputStream(ReadableByteChannel ch);
    static OutputStream
    newOutputStream(WritableByteChannel ch);
    }
    
    selector的select方法:如果返回0,则可能超时selector被异步唤醒;a register key被异步取消。 
    selectkey set只有在调用select(),select(long timeout)才被更新,处理完之后需要显示remove掉已经处理过得selectkey。
    selector.wakeup() will cause的next first block return immediately。wakeup():set a boolean status
    
    blocking TCP connect():connect() ilock
    noblocking TCP connect():cnnect() return true immediately,finishConnect() to check connect is ok.isConnectionPending() and finishConnect() only user in noblocking mode.
    
    socketChannel.close();1.cannel the selectkey associated with the channel;2 channel.close();must invoke selector.selectNow();
    1.only use OP_CONNECT on unconnect socket;it must be removed from keys as soon as channel is ready;2.only use OP_WRITE on connect socket;
    
    
    firewalls:1.transport firewalls;2application firewalls.
    HTTP proxy server:java 能够通过设置环境变量http.proxyHost和http.proxyPort通过代理服务器发送http请求。to get http tunnelling in rmi or httpConnect.
    Socket proxy:socksProxyHost and socksProxyPort to user a socket proxy 
    java.net.Proxy:
    
    secure socket
    handShake protocal:
    SSlSocket:1.firest create take more time;2use bufferOutputStream;3 not support OOBinline;4.SSlSocket.getInputStream().available() always return 0. 
              5.serveer/client must close at the same time,not support shutdownInput or shutDownoutput
    
    (a) To view all debugging messages:
    -Djavax.net.debug=all
    (b) To view the hexadecimal dumps of each handshake message: 
    -Djavax.net.debug=ssl:handshake:data
    (c) To view the hexadecimal dumps of each handshake message, an
    trust manager tracing (the commas are optional):
    -Djavax.net.debug=SSL:handshake:data:trustmanager
    
    SSL system properties:
    https.cipherSuites
    https.protocals
    https.proxyHost
    https.proxyPort
    java.net.protocal.handler.pkgs
    javax.net.debug
    javax.net.ssl.keyStore
    javax.net.ssl.keyStorePassword
    javax.net.ssl.keyStoreType
    javax.net.trustStore
    javax.net.trustStorePassword
    javax.net.trustStoreType
    
    scalable secure socket:
    javax.net.ssl.Sslengine
    
    unicast UDP:
    
    ipv4 65507byte
    udp:512byte a ip package size
    udp:没有建立连接和关闭连接的开销;服务器和客户端管理简单;
    a:trasaction is request-reply;b:payloads is small;c:servers are stateless;d:Trasactions can be repeated;
    receive, send is synchronized
    
    reliable UDP:(DNS)
      1.sequence number; 2 timeout and retransmits
    
    ACK and NACK based protocol
    
    scalable UDP:
    
    muliticast UDP:
    
    1. multicast address a dynamic group address
       resuce the load;receive the package almost at the same time;fesable;
       reliable;co-operation from routers;security;
    2. broadcast a static group address
    3. IPV6 anycast only receive by any one of the group members
    
    TTL based Scopes
    
    
    Address based Scopes
    
    Tree-based protocals
    NACK-based protocals
    ACL
    
    Reactor,Proactor,leader-follower server

  • 相关阅读:
    力扣(LeetCode) 14. 最长公共前缀
    力扣(LeetCode)965. 单值二叉树
    力扣(LeetCode)258. 各位相加
    力扣(LeetCode)389. 找不同
    PTA 阶乘之和取模
    A. Sea Battle
    PTA 二叉树路径
    PTA 重构二叉树
    PTA 笛卡尔树
    绿豆蛙的归宿
  • 原文地址:https://www.cnblogs.com/secbook/p/2655162.html
Copyright © 2011-2022 走看看