iOS面试笔试题Java基础Android收藏文章

https 与 http、TCP/IP、Socket网络通信

2017-03-02  本文已影响251人  闲庭

一、https 与 http

  1. HTTPS
    HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
    https:URL 表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
    HTTPS使用端口443,而不是像HTTP那样适用端口80来和TCP/IP 进行通信。SSL使用40位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。
    主要作用分为两种:
  1. HTTP
    超文本协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。Http定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎么把文档传给浏览器。Http是万维网可靠的交换文件(包括文本、图像、声音、以及视频等)的基础。
    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。
    HTTP协议的主要特点:
  1. HTTPS 和 HTTP 的区别
    超文本传输协议HTTP协议被用于在Web浏览器和服务器之间传递信息。

HTTPS和HTTP的区别:

二、TCP/IP、Socket网络通信

  1. 网络间的进程通信与Socket
    TCP/IP协议族中网络层的IP地址可以唯一标识网络中的主机,而传输层的协议+端口可以唯一标识主机中的应用程序(进程)。这样利用这三元组就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。
    Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。就目前而言,几乎所有的应用程序都是采用Socket来实现网络进程之间的通信。
    Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
  2. TCP、UDP
    TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,需要连接时间,以便在TCP协议的基础上进行通信。
    优缺点和应用场景:
    (1)可靠稳定,传递数据前,会有三次握手建立连接,面向有连接。
    (2)传递数据时,有确认、窗口(流量控制)、重传、拥塞控制。确认机制保证接收端每收到一个正确包都会回应给发送端,超时或者数据包不完整的话发送端会重传。
    缺点:
    (1)整体来说传输慢,效率低,占用系统资源高。
    (2)传递数据前,建立连接需要耗时,传递数据时,确认、重传、拥塞等会消耗大量时间以及CPU和内存等硬件资源。
    (3)因为有确认机制、三次握手等机制,容易被人利用,实现DOS 、DDOS攻击。
    当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,因此无需建立发送方和接收方的连接,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性、次序性都是不能被保证的。而且被传输数据报必须限定在64k以内。

  1. Socket通信

  2. 利用Socket建立连接的过程
    套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
    (1)服务器监听:服务器端套接字处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
    (2)客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
    (3)连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

  3. Socket的Java实现
    服务端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(30000);
        while (true){
            Socket s = ss.accept();
            PrintStream ps = new PrintStream(s.getOutputStream());
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            BufferedReader bf;
            String line = null;
            String client = null;
            while ((line = br.readLine())!=null){
                System.out.println(line);
                bf = new BufferedReader(new InputStreamReader(System.in));
                client = bf.readLine();
                    if (line.equals("liujc")){
                        ps.println(client+"CXH端午节快乐");
                    }else {
                        ps.println(client);
                    }
            }
            ps.close();
            s.close();
        }
    }
}

客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class Client {
    public static void main(String[] args) throws IOException {
        System.out.println("Hello World!");
        Socket socket = new Socket("127.0.0.1",30000);
        PrintStream ps = new PrintStream(socket.getOutputStream());
        String context = null;
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//        context = bf.readLine();
        while ((context = bf.readLine()) != null){
            ps.println(context);
            String line = br.readLine();
            System.out.println("来自服务器的数据:"+line);
        }
        br.close();
        socket.close();
    }
}

效果图如下:
客户端:


客户端.png

服务端:

服务端.png
上一篇 下一篇

猜你喜欢

热点阅读