一、https 與 http
-
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數字認證,如果需要的話用戶可以確認發送者是誰。
主要作用分為兩種:
- 一種是建立一個信息安全通道,來保證數據傳輸的安全。
- 另一種就是確認網站的真實性,凡是使用https的網站,都可以通過點擊瀏覽器地址欄的鎖頭標志來查看網站認證之后的真實信息。也可以通過CA 機構頒發的安全簽章來查詢。
-
HTTP
超文本協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。Http定義了瀏覽器(即萬維網客戶進程)怎樣向萬維網服務器請求萬維網文檔,以及服務器怎么把文檔傳給瀏覽器。Http是萬維網可靠的交換文件(包括文本、圖像、聲音、以及視頻等)的基礎。
HTTP是一個屬于應用層的面向對象的協議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴展。
HTTP協議的主要特點:
- 支持C/S(客戶/服務器)模式。
- 簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST,每種方法規定了客戶與服務器聯系的類型不同。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
- 靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
- 無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
- 無狀態:HTTP協議是無狀態協議,無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
-
HTTPS 和 HTTP 的區別
超文本傳輸協議HTTP協議被用于在Web瀏覽器和服務器之間傳遞信息。
- HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。
- 為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,并為瀏覽器和服務器之間的通信加密。
HTTPS和HTTP的區別:
- https 用的 443 端口, http 用的 80 端口
- 采用 https 的服務器必須從CA(Certificate Authority)申請一個用于證明服務器用途類型的證書。
- http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
- http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
二、TCP/IP、Socket網絡通信
-
網絡間的進程通信與Socket
TCP/IP協議族中網絡層的IP地址可以唯一標識網絡中的主機,而傳輸層的協議+端口可以唯一標識主機中的應用程序(進程)。這樣利用這三元組就可以標識網絡的進程了,網絡中的進程通信就可以利用這個標志與其它進程進行交互。
Socket通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,并綁定到一個端口上,不同的端口對應于不同的服務。就目前而言,幾乎所有的應用程序都是采用Socket來實現網絡進程之間的通信。
Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。在Java環境下,Socket編程主要是指基于TCP/IP協議的網絡編程。 -
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以內。
Socket通信
利用Socket建立連接的過程
套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認。
(1)服務器監聽:服務器端套接字處于等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。
(2)客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。
(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