一、web及網絡基礎
1、HTTP的歷史
1.1、HTTP的概念:
HTTP(Hyper Text Transfer Protocol,超文本傳輸協議)是一種通信協議,它允許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。
它是一個應用層協議,承載於TCP之上。由請求和響應構成,是一個標准的客戶端服務器模型
1.2、HTTP的發展歷史:
作為Web文檔傳輸協議的HTTP,它的版本更新十分緩慢,目前只更新了三個版本:
HTTP/0.9: 1990年,並未建立標准
HTTP/1.0: 1996年5月,
HTTP/1.1: 1997年1月,目前主流的HTTP版本
1.2、HTTP在Web應用中的重要性:
HTTP協議是整個Web基礎,許多應用都離不開對HTTP協議的認識:
WebService = HTTP + XML
Reset = HTTP + JSON
各種API的實現:HTTP + XML/JSON
采集、小偷站
QQ、迅雷等桌面應用軟件
2、網絡基礎TCP/IP協議
2.1、協議的概念:
協議是指計算機通信網絡中,兩台計算機進行通信,所必須遵循的規定或規則。
計算機網絡中有各種各樣的協議,比如TCP協議、IP協議、HTTP協議、FTP協議等等,像這樣把與互聯網相關聯的協議集合起來,就成為TCP/IP協議族。

2.2、TCP/IP的分層管理
應用層:負責處理特定的應用程序,如FTP、DNS、HTTP等。
傳輸層:對上層應用層提供處於網絡連接中兩台計算機之間的數據連接。該層有兩種協議:TCP和UDP。
網絡層:處理網絡上流動的數據報。該層協議有:IP、ICMP、IGMP。
數據鏈路層:處理連接網絡的硬件部分。包括操作系統、硬件設備驅動、網卡、光纖等。
2.3、TCP/IP通信傳輸流程

3、IP、TCP、DNS與HTTP的密切關系
3.1、IP協議的概念與作用
IP(Internet Protocol),網際協議,位於網絡層
把各種數據包傳送給對方。最重要的兩個條件是IP地址和MAC地址(MAC地址基本不會改變,但可以通過軟件改變)
ARP地址解析協議:根據IP地址查出MAC地址
3.2、TCP協議的概念與作用
TCP(Transmission Control Protocol),傳輸控制協議,位於傳輸層。
提供可靠的字節流服務,通過三次握手策略
3.3、TCP協議的三次握手過程

3.4、DNS的概念與作用
DNS(Domain Name System),域名解析系統,位於應用層。
提供域名到IP地址之間的解析服務
3.5、HTTP與TCP、IP和DNS的關系
HTTP生成請求報文需要通過DNS解析出IP找到服務器,通過TCP傳輸請求。
4、URI和URL的概念
4.1、URI的概念:
URI(Uniform Resource Identifier),統一資源標識符,是一個用於標識某一互聯網資源名稱的字符串。
4.2、URL的概念:
URL(Uniform Resource Location),統一資源定位符,它描述一台特定服務器上某特定資源的特定位置。
4.3、URI與URL的關系:
URI用字符串標識某一互聯網資源,而URL代表資源的地址,由此可見,URL是URI的子集。
URI由兩個主要的子集URL和URN構成
4.4、URI的格式,由9部分構成
http:協議方案名,獲取資源是要指定協議類型
user:pass:登錄信息(認證),指定用戶名和密碼,可選。
www.example.com:服務器地址
80:端口號,可選
/home/index.html:文件路徑
age=11:參數組件,為應用程序提供訪問資源所需的附加信息
查詢字符串:針對已指定的文件路徑內的資源,可以使用查詢字符串穿入任意參數,可選(分頁case)
mask:片段標識符,通常可標記出已獲取資源中的子資源(文檔內的某一個位置),可選
二、細說HTTP的報文格式和工作流程
1、HTTP請求報文和響應報文的格式
1.1、HTTP事務和報文流的概念
HTTP事務 = 請求命令 + 響應結果

1.2、請求報文的格式(抓包工具,fiddler)
請求行: 請求方式(大寫) 請求URL 版本
請求首部: 名: 值
空行:
報文主體:
請求首部也叫消息頭,其中字段名不區分大小寫,習慣駝峰式,字段可按任意順序排列,有些可接受多個值選項,有些字段可出現多次
1.2.1、請求方式:GET、POST、HEAD、OPTIONS、DELETE、PUT
默認發GET請求,如在瀏覽器直接輸入地址訪問,點超鏈接訪問都是get,用戶如想把請求方式改為post,可通過更改表單的提交方式實現。POST與GET方式的區別:傳遞參數的方式;傳遞數據量大小
1.2.2、常用請求頭:
Accept: 瀏覽器可接受的MIME類型 */* (大類型)/(小類型)
Accept-Charset:告訴服務器,瀏覽器支持哪種字符集
Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip
Accept-Language:瀏覽器所希望的語言種類
Host:初始URL中的主機和端口
Referer:包含一個URL,用戶從該URL代表的頁面發出訪問當前請求的頁面
Content-Type:內容類型
If-Modified-Since:值為一個GMT標准時間,如果在該時間到目前,請求文件沒有更改,則服務器告訴瀏覽器可以直接從緩存中讀取文件
User-Agent:用戶的瀏覽器類型,操作系統等信息
Content-Length:表示請求消息正文的長度
Connection:如果值為Keep-Alive,表示需要持久連接,HTTP 1.1默認進行持久連接
Cookie:這是最重要的請求頭信息之一,但是由於該技術存在安全隱患等原因,該功能被Session取代
Date:值為GMT時間,表示請求時間
1.3、響應報文的格式
響應行: 協議版本 狀態碼 原因短語
響應首部:
空行:
報文主體:
1.3.1、狀態碼:用於表示服務器對請求的各種不同處理結果和狀態,它是一個三位的十進制數。響應狀態碼分為5類:

1.3.2、常用狀態碼:
200:正常
301:永久重定向
302/307:臨時重定向
304:未修改,可以使用緩存,無需再次修改
404:資源找不到
500:服務器內部錯誤
關於更多狀態碼,請參考博客:http響應狀態碼大全
1.3.3、常用響應頭:
Location:http://cn.bing.com/ 指示新的資源位置
Server:apache tomcat 指示服務器的類型
Content-Encoding: gzip 服務器發送數據采用的編碼類型
Content-Length:80 告訴瀏覽器正文的長度
Content-Language:zh-cn 服務器發送的文本的語言
Content-Type:text/html;charset=GB2312 服務器發送內容的MIME類型
Last-Modified:GMT時間 文件最后修改的時間
Refresh:1;url=http://www.baidu.com 指示客戶端刷新頻率,單位是秒
Content-Disposition:attachment;filename=aaa.zip 指示客戶端下載文件
Set-Cookie:SS=Q0=5Lb_nQ;path=/search 服務器發送的Cookie
Expires: GMT時間 表示過期時間,其值為0或-1表示禁止緩存
Cache-Control:no-cache(1.1) 表示進制緩存
Connection:close/Keep-Alive
Date: GMT時間
2、HTTP的工作流程
2.1、整個流程步驟

2.2、域名解析過程

2.3、三次握手過程
2.4、發起HTTP請求
2.5、響應HTTP請求並得到HTML代碼
2.6、瀏覽器解析HTML代碼
2.7、瀏覽器對頁面進行渲染呈現給用戶
3、HTTP1.0與HTTP1.1的區別
3.1、HTTP1.0的基本運行方式:
一個事務分為四個過程:建立連接、瀏覽器發出請求信息、服務器發出響應信息、關閉連接。每次連接只處理一個請求和響應。對每一個文件的訪問,瀏覽器與服務器都要建立一次單獨的連接
3.2、HTTP1.1的特點
在一個TCP連接上可以傳送鎖哥HTTP請求和響應
多個請求和響應過程可以重疊
增加了更多的請求頭和響應頭,比如Host、If-Unmodified-Since請求頭等
4、使用Telnet連接的實例
Telnet協議是TCP/IP協議族中的一員,是Internet遠程登錄服務的標准協議和主要方式。為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端電腦上使用telnet程序,用它連接到服務器
三、Java中的HTTP通信
1、使用HTTP的Get方式讀取網絡數據
class ReadByGet extends Thread{ @Override public void run(){ URL url = new URL("網址");//如果有參數,在網址中攜帶參數 URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; StringBuilder builder = new StringBuilder(); while((line=br.readLine())!=null){ builder.append(line); } br.close(); isr.cloae(); is.close(); System.out.println(builder.toString); } } public static void main(String[] args){ new ReadByGet().start(); }
2、使用HTTP的Post方式與網絡交互通信
Class ReadByPost extends Thread{ @override public void run(){ URL url = new URL("網址"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.addRequestProperty("encoding","UTF-8"); conn.setDoInput(true); Conn.setDoOutput(true); conn.setRequestMethod("POST"); OutputStream os = conn.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); bw.write("向服務器傳遞的參數"); bw.flush(); InputStream is = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; StringBuilder builder = new StringBuilder(); while((line = br.readLine())!=null){ builder.append(line); } //關閉資源 System.out.println(builder.toString); } } public static void main(){ new ReadByPost().start(); }
3、使用HttpClient進行Get方式通信
apache有一個HttpClient包
-
class Get extends Thread{ HttpClient client = HttpClients.createDefault(); @Override public void run(){ HttpGet get = new HttpGet("http://www.baidu.com"); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity,"UTF-8"); System.out.println(result); } } public static void main(String[] args){ new Get().start(); }
4、使用HttpClient進行Post方式通信
class Post extends Thread{ HttpClient cilent = HttpClients.CreateDefault(); @Override public void run(){ HttpPost post = new HttpPost("網址"); //設置要傳的參數 List<BasicNameValuePair> parameters = new ArratList(); parameters.add(new BasicNameValuePair("key","value")); post.setEntity(new UrlEncodeFormEntity(parameters,"UTF-8")); HttpResponse response = client.execute(post); HttpEntity entity = response.getEntity(); String result = EntityUtils.roString(entity,"UTF-8"); System.out.println(result); } } main(){ new Post().start(); }