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