一、web及網(wǎng)絡(luò)基礎(chǔ)
1、HTTP的歷史
1.1、HTTP的概念:
HTTP(Hyper Text Transfer Protocol,超文本傳輸協(xié)議)是一種通信協(xié)議,它允許將超文本標記語言(HTML)文檔從Web服務(wù)器傳送到客戶端的瀏覽器。
它是一個應(yīng)用層協(xié)議,承載于TCP之上。由請求和響應(yīng)構(gòu)成,是一個標準的客戶端服務(wù)器模型
1.2、HTTP的發(fā)展歷史:
作為Web文檔傳輸協(xié)議的HTTP,它的版本更新十分緩慢,目前只更新了三個版本:
HTTP/0.9: 1990年,并未建立標準
HTTP/1.0: 1996年5月,
HTTP/1.1: 1997年1月,目前主流的HTTP版本
1.2、HTTP在Web應(yīng)用中的重要性:
HTTP協(xié)議是整個Web基礎(chǔ),許多應(yīng)用都離不開對HTTP協(xié)議的認識:
WebService = HTTP + XML
Reset = HTTP + JSON
各種API的實現(xiàn):HTTP + XML/JSON
采集、小偷站
QQ、迅雷等桌面應(yīng)用軟件
2、網(wǎng)絡(luò)基礎(chǔ)TCP/IP協(xié)議
2.1、協(xié)議的概念:
協(xié)議是指計算機通信網(wǎng)絡(luò)中,兩臺計算機進行通信,所必須遵循的規(guī)定或規(guī)則。
計算機網(wǎng)絡(luò)中有各種各樣的協(xié)議,比如TCP協(xié)議、IP協(xié)議、HTTP協(xié)議、FTP協(xié)議等等,像這樣把與互聯(lián)網(wǎng)相關(guān)聯(lián)的協(xié)議集合起來,就成為TCP/IP協(xié)議族。
2.2、TCP/IP的分層管理
應(yīng)用層:負責處理特定的應(yīng)用程序,如FTP、DNS、HTTP等。
傳輸層:對上層應(yīng)用層提供處于網(wǎng)絡(luò)連接中兩臺計算機之間的數(shù)據(jù)連接。該層有兩種協(xié)議:TCP和UDP。
網(wǎng)絡(luò)層:處理網(wǎng)絡(luò)上流動的數(shù)據(jù)報。該層協(xié)議有:IP、ICMP、IGMP。
數(shù)據(jù)鏈路層:處理連接網(wǎng)絡(luò)的硬件部分。包括操作系統(tǒng)、硬件設(shè)備驅(qū)動、網(wǎng)卡、光纖等。
2.3、TCP/IP通信傳輸流程
3、IP、TCP、DNS與HTTP的密切關(guān)系
3.1、IP協(xié)議的概念與作用
IP(Internet Protocol),網(wǎng)際協(xié)議,位于網(wǎng)絡(luò)層
把各種數(shù)據(jù)包傳送給對方。最重要的兩個條件是IP地址和MAC地址(MAC地址基本不會改變,但可以通過軟件改變)
ARP地址解析協(xié)議:根據(jù)IP地址查出MAC地址
3.2、TCP協(xié)議的概念與作用
TCP(Transmission Control Protocol),傳輸控制協(xié)議,位于傳輸層。
提供可靠的字節(jié)流服務(wù),通過三次握手策略
3.3、TCP協(xié)議的三次握手過程
3.4、DNS的概念與作用
DNS(Domain Name System),域名解析系統(tǒng),位于應(yīng)用層。
提供域名到IP地址之間的解析服務(wù)
3.5、HTTP與TCP、IP和DNS的關(guān)系
HTTP生成請求報文需要通過DNS解析出IP找到服務(wù)器,通過TCP傳輸請求。
4、URI和URL的概念
4.1、URI的概念:
URI(Uniform Resource Identifier),統(tǒng)一資源標識符,是一個用于標識某一互聯(lián)網(wǎng)資源名稱的字符串。
4.2、URL的概念:
URL(Uniform Resource Location),統(tǒng)一資源定位符,它描述一臺特定服務(wù)器上某特定資源的特定位置。
4.3、URI與URL的關(guān)系:
URI用字符串標識某一互聯(lián)網(wǎng)資源,而URL代表資源的地址,由此可見,URL是URI的子集。
URI由兩個主要的子集URL和URN構(gòu)成
4.4、URI的格式,由9部分構(gòu)成
http:協(xié)議方案名,獲取資源是要指定協(xié)議類型
user:pass:登錄信息(認證),指定用戶名和密碼,可選。
www.example.com:服務(wù)器地址
80:端口號,可選
/home/index.html:文件路徑
age=11:參數(shù)組件,為應(yīng)用程序提供訪問資源所需的附加信息
查詢字符串:針對已指定的文件路徑內(nèi)的資源,可以使用查詢字符串穿入任意參數(shù),可選(分頁case)
mask:片段標識符,通??蓸擞洺鲆勋@取資源中的子資源(文檔內(nèi)的某一個位置),可選
二、細說HTTP的報文格式和工作流程
1、HTTP請求報文和響應(yīng)報文的格式
1.1、HTTP事務(wù)和報文流的概念
HTTP事務(wù) = 請求命令 + 響應(yīng)結(jié)果
1.2、請求報文的格式(抓包工具,fiddler)
請求行: 請求方式(大寫) 請求URL 版本
請求首部: 名: 值
空行:
報文主體:
請求首部也叫消息頭,其中字段名不區(qū)分大小寫,習慣駝峰式,字段可按任意順序排列,有些可接受多個值選項,有些字段可出現(xiàn)多次
1.2.1、請求方式:GET、POST、HEAD、OPTIONS、DELETE、PUT
默認發(fā)GET請求,如在瀏覽器直接輸入地址訪問,點超鏈接訪問都是get,用戶如想把請求方式改為post,可通過更改表單的提交方式實現(xiàn)。POST與GET方式的區(qū)別:傳遞參數(shù)的方式;傳遞數(shù)據(jù)量大小
1.2.2、常用請求頭:
Accept: 瀏覽器可接受的MIME類型 */* (大類型)/(小類型)
Accept-Charset:告訴服務(wù)器,瀏覽器支持哪種字符集
Accept-Encoding:瀏覽器能夠進行解碼的數(shù)據(jù)編碼方式,比如gzip
Accept-Language:瀏覽器所希望的語言種類
Host:初始URL中的主機和端口
Referer:包含一個URL,用戶從該URL代表的頁面發(fā)出訪問當前請求的頁面
Content-Type:內(nèi)容類型
If-Modified-Since:值為一個GMT標準時間,如果在該時間到目前,請求文件沒有更改,則服務(wù)器告訴瀏覽器可以直接從緩存中讀取文件
User-Agent:用戶的瀏覽器類型,操作系統(tǒng)等信息
Content-Length:表示請求消息正文的長度
Connection:如果值為Keep-Alive,表示需要持久連接,HTTP 1.1默認進行持久連接
Cookie:這是最重要的請求頭信息之一,但是由于該技術(shù)存在安全隱患等原因,該功能被Session取代
Date:值為GMT時間,表示請求時間
1.3、響應(yīng)報文的格式
響應(yīng)行: 協(xié)議版本 狀態(tài)碼 原因短語
響應(yīng)首部:
空行:
報文主體:
1.3.1、狀態(tài)碼:用于表示服務(wù)器對請求的各種不同處理結(jié)果和狀態(tài),它是一個三位的十進制數(shù)。響應(yīng)狀態(tài)碼分為5類:
1.3.2、常用狀態(tài)碼:
200:正常
301:永久重定向
302/307:臨時重定向
304:未修改,可以使用緩存,無需再次修改
404:資源找不到
500:服務(wù)器內(nèi)部錯誤
1.3.3、常用響應(yīng)頭:
Server:apache tomcat 指示服務(wù)器的類型
Content-Encoding: gzip 服務(wù)器發(fā)送數(shù)據(jù)采用的編碼類型
Content-Length:80 告訴瀏覽器正文的長度
Content-Language:zh-cn 服務(wù)器發(fā)送的文本的語言
Content-Type:text/html;charset=GB2312 服務(wù)器發(fā)送內(nèi)容的MIME類型
Last-Modified:GMT時間 文件最后修改的時間
Content-Disposition:attachment;filename=aaa.zip 指示客戶端下載文件
Set-Cookie:SS=Q0=5Lb_nQ;path=/search 服務(wù)器發(fā)送的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、發(fā)起HTTP請求
2.5、響應(yīng)HTTP請求并得到HTML代碼
2.6、瀏覽器解析HTML代碼
2.7、瀏覽器對頁面進行渲染呈現(xiàn)給用戶
3、HTTP1.0與HTTP1.1的區(qū)別
3.1、HTTP1.0的基本運行方式:
一個事務(wù)分為四個過程:建立連接、瀏覽器發(fā)出請求信息、服務(wù)器發(fā)出響應(yīng)信息、關(guān)閉連接。每次連接只處理一個請求和響應(yīng)。對每一個文件的訪問,瀏覽器與服務(wù)器都要建立一次單獨的連接
3.2、HTTP1.1的特點
在一個TCP連接上可以傳送鎖哥HTTP請求和響應(yīng)
多個請求和響應(yīng)過程可以重疊
增加了更多的請求頭和響應(yīng)頭,比如Host、If-Unmodified-Since請求頭等
4、使用Telnet連接的實例
Telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Internet遠程登錄服務(wù)的標準協(xié)議和主要方式。為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端電腦上使用telnet程序,用它連接到服務(wù)器
三、Java中的HTTP通信
1、使用HTTP的Get方式讀取網(wǎng)絡(luò)數(shù)據(jù)
class ReadByGet extends Thread{ @Override public void run(){ URL url = new URL("網(wǎng)址");//如果有參數(shù),在網(wǎng)址中攜帶參數(shù) 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方式與網(wǎng)絡(luò)交互通信
Class ReadByPost extends Thread{ @override public void run(){ URL url = new URL("網(wǎng)址"); 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("向服務(wù)器傳遞的參數(shù)"); 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); } //關(guān)閉資源 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("網(wǎng)址"); //設(shè)置要傳的參數(shù) 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();}