作java web的,怎麼能不熟悉http。能夠說這是對web開發最重要的一條協議,面試的時候也不免會被問到這個問題,因此必須深入瞭解這個協議。html
首先咱們要知道什麼是協議,協議就是一系列的信息交換規則。只有徹底符合規則,兩個相互獨立的系統才能交互。顯然http也是這樣的。java
它中文叫作超文本傳輸協議,它是無狀態的協議,它是屬於七層結構裏的最上層--應用層的協議,它的默認端口是80,它的目前版本是HTTP/1.1,它是本質上也是基於文本流的(固然有時候也會有一些Media類型的)。web
URL是用來惟一肯定網上資源的,它的格式如上圖所示。面試
http中,分Client和Server,因此說HTTP是基於TCP的。通常來講是Client發起請求,Server相應。具體來講:通常是用於用戶給瀏覽器發請求,而後瀏覽器將請求組成一個符合http協議的報文發送給服務器,服務器根據http規則來解析出請求報文,而後再將返回信息一樣組織成http響應報文,發送給瀏覽器,最後瀏覽器呈現給用戶。chrome
上圖是chrome-F12下能夠看到的內容,先看request head,http的消息分爲消息頭,和消息體,通常消息體是空的。消息頭包含都是一些元數據(不是用戶相關的),好比編碼信息等,在REST風格下,請求頭比請求體重要。那麼能夠看到第一句就是"GET /yl0822/ HTTP/1.1",GET指的是請求方法:瀏覽器
① GET:這是最簡單的http請求方法,點擊鏈接的時候默認使用的就是GET,它就是讓Server把請求的資源給客戶端,而且不作任何修改,也就是說是隻讀的,因此對於資源操做來講,它是安全的。並且GET有很明顯的一點就是query String會顯示在url裏面,這是很是不安全的,因此安全性要求不高的能夠用GET。tomcat
② POST:用於你想要在服務器處理請求,它將請求數據寫在消息體裏面,因此是比較安全的。安全
③ DELETE、PUT:不作介紹,能夠用POST代替,因此歷來沒用過。服務器
/yl0822/是路由,指向請求目標,HTTP/1.1是協議版本。網絡
Host是主機地址,其實是IP地址,爲方便記憶才用cnblogs、baidu、google啥的,沒寫端口是由於默認就是80。其餘鍵值對都是客戶端對請求的約束。
再看response,和請求不同,對響應來講響應體是很是重要的,由於它就是你看到的網頁,響應頭中有兩個要注意的,其一就是stateCode,各類狀態碼錶明着什麼意思,網上有不少了,這裏就不贅述了。另一個就是Content-Type,表示請求的返回類型,通常的有"text/html"、"text/plain"、"image/gif"、"image/jpeg"、"video/mpeg"等等。
標準的Http請求和響應中間都是隔着一行空行的,叫Blank Line。以這個來識別head和body。
說的很簡單,實現起來其實也簡單,下面實現一個簡單的Http服務器。
1 import java.io.BufferedReader; 2 import java.io.InputStreamReader; 3 import java.io.PrintWriter; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 7 public final class SimpleServer { 8 public static void main(String[] args) throws Exception{ 9 //a port is needed 10 int port = 80; 11 //Establish the listen socket 12 ServerSocket serverSocket = new ServerSocket(port); 13 //Process HTTP Service requests in an infinite loop 14 System.out.println("waiting for connect..."); 15 while (true){ 16 //listen for a tcp connection request 17 Socket socket = serverSocket.accept(); 18 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 19 PrintWriter out = new PrintWriter(socket.getOutputStream()); 20 /** 21 * 讀取請求head信息, 22 * */ 23 String str = "."; 24 while (!str.equals("")){ 25 str = in.readLine(); 26 System.out.println(str); 27 } 28 29 //返回請求響應 30 String response = "<html><head>" + 31 "<title>Simpl Web Page</title></head>\n" + 32 "<h1>Congratulations!!!</h1>\n" + 33 "<h3>This page was returned by " + "localhost" + "</h3>\n" + 34 "<p>This is the first page hosted by your web server.\n</p>" + 35 "Visit <A HREF=\"http://www.techwiki.ordak.org\"> http://www.techwiki.ordak.org</A> for more sample codes.\n" + 36 "</html>\n"; 37 out.println("HTTP/1.1 200 OK"); 38 out.println("Content-Type: text/html"); 39 out.println("Server: SimpleServer"); 40 out.println("Content-length: "+response.length()); 41 //this blank line signals the end of the headers 42 out.println(""); 43 out.println(response); 44 out.flush(); 45 socket.close(); 46 } 47 } 48 }
而後在瀏覽器輸入localhost便可看到響應了。若是有時間的話,你們能夠看下tomcat或jetty的源碼,裏面對http協議的解析作的很是到位,也給了許多接口來獲取和修改http的設置。
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。
https和http的區別
https:URL代表它使用了HTTP,但HTTPS存在不一樣於HTTP的默認端口及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司進行,提供了身份驗證與加密通信方法,如今它被普遍用於萬維網上安全敏感的通信,例如網銀支付方面。
1、https協議須要到ca申請證書,通常免費證書不多,須要交費。https 能夠是按單個域名購買費用,若是全站都作https費用會比較高。
2、http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議。
3、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
4、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
5、https是在外網傳輸節點上進行加密已防止信息被第三方竊聽或篡改。HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。