1. 在瀏覽器中輸入url地址 ->> 顯示主頁的過程,整個過程會使用哪些協(xié)議
總體來說分為以下幾個過程:
- DNS解析
- TCP連接
- 發(fā)送HTTP請求
- 服務(wù)器處理請求并返回HTTP報文
- 瀏覽器解析渲染頁面
- 連接結(jié)束
在瀏覽器中輸入網(wǎng)址之后執(zhí)行會發(fā)生什么响驴?
- DNS解析,找到對應(yīng)ip地址
- 客戶端發(fā)起http/https請求,然后交給傳輸層
- 傳輸層將請求分成報文段撕蔼,添加目標(biāo)源和端口豁鲤,并隨機(jī)用一個本地接口封裝進(jìn)報頭,然后交給網(wǎng)絡(luò)層鲸沮。
- 網(wǎng)絡(luò)層加上雙方的ip地址信息琳骡,并負(fù)責(zé)路由分發(fā)。
- 鏈路層中讼溺,包通過鏈路層發(fā)送到路由器楣号,通過鄰居協(xié)議查找給定IP地址的MAC地址,然后發(fā)送ARP請求查找目的地址肾胯,如果得到回應(yīng)后就可以使用ARP的請求應(yīng)答交換的IP數(shù)據(jù)包進(jìn)行傳輸了竖席,然后發(fā)送IP數(shù)據(jù)包到達(dá)服務(wù)器的地址耘纱。
各種協(xié)議與HTTP協(xié)議之間的關(guān)系一般面試官會通過這樣的問題來考察你對計算機(jī)網(wǎng)絡(luò)知識體系的理解敬肚。
圖片來源:《圖解HTTP》
2.TCP/IP協(xié)議層
1.1 應(yīng)用層
應(yīng)用層(application-layer)的任務(wù)是通過應(yīng)用進(jìn)程間的交互來完成特定網(wǎng)絡(luò)應(yīng)用。應(yīng)用層協(xié)議定義的是應(yīng)用進(jìn)程(進(jìn)程:主機(jī)中正在運(yùn)行的程序)間的通信和交互的規(guī)則束析。對于不同的網(wǎng)絡(luò)應(yīng)用需要不同的應(yīng)用層協(xié)議艳馒。在互聯(lián)網(wǎng)中應(yīng)用層協(xié)議很多,如域名系統(tǒng)DNS,支持萬維網(wǎng)應(yīng)用的 HTTP協(xié)議弄慰,支持電子郵件的 SMTP協(xié)議等等第美。我們把應(yīng)用層交互的數(shù)據(jù)單元稱為報文。
域名系統(tǒng)
域名系統(tǒng)(Domain Name System縮寫 DNS陆爽,Domain Name被譯為域名)是因特網(wǎng)的一項核心服務(wù)什往,它作為可以將域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能夠使人更方便的訪問互聯(lián)網(wǎng)慌闭,而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串别威。(百度百科)例如:一個公司的 Web 網(wǎng)站可看作是它在網(wǎng)上的門戶,而域名就相當(dāng)于其門牌地址驴剔,通常域名都使用該公司的名稱或簡稱省古。例如上面提到的微軟公司的域名,類似的還有:IBM 公司的域名是 www.ibm.com丧失、Oracle 公司的域名是 www.oracle.com豺妓、Cisco公司的域名是 www.cisco.com 等。
HTTP協(xié)議
超文本傳輸協(xié)議(HTTP布讹,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議琳拭。所有的 WWW(萬維網(wǎng)) 文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計 HTTP 最初的目的是為了提供一種發(fā)布和接收 HTML 頁面的方法炒事。(百度百科)1.2 運(yùn)輸層
運(yùn)輸層(transport layer)的主要任務(wù)就是負(fù)責(zé)向兩臺主機(jī)進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù)臀栈。應(yīng)用進(jìn)程利用該服務(wù)傳送應(yīng)用層報文∧尤椋“通用的”是指并不針對某一個特定的網(wǎng)絡(luò)應(yīng)用权薯,而是多種應(yīng)用可以使用同一個運(yùn)輸層服務(wù)。由于一臺主機(jī)可同時運(yùn)行多個線程睡扬,因此運(yùn)輸層有復(fù)用和分用的功能盟蚣。所謂復(fù)用就是指多個應(yīng)用層進(jìn)程可同時使用下面運(yùn)輸層的服務(wù),分用和復(fù)用相反卖怜,是運(yùn)輸層把收到的信息分別交付上面應(yīng)用層中的相應(yīng)進(jìn)程屎开。
運(yùn)輸層
主要使用以下兩種協(xié)議:
- 傳輸控制協(xié)議 TCP(Transmission Control Protocol)--提供面向連接的,可靠的數(shù)據(jù)傳輸服務(wù)马靠。
- 用戶數(shù)據(jù)協(xié)議 UDP(User Datagram Protocol)--提供無連接的奄抽,盡最大努力的數(shù)據(jù)傳輸服務(wù)(不保證數(shù)據(jù)傳輸?shù)目煽啃裕?/li>
1.3 網(wǎng)絡(luò)層
在 計算機(jī)網(wǎng)絡(luò)中進(jìn)行通信的兩個計算機(jī)之間可能會經(jīng)過很多個數(shù)據(jù)鏈路,也可能還要經(jīng)過很多通信子網(wǎng)甩鳄。網(wǎng)絡(luò)層的任務(wù)就是選擇合適的網(wǎng)間路由和交換結(jié)點逞度, 確保數(shù)據(jù)及時傳送。 在發(fā)送數(shù)據(jù)時妙啃,網(wǎng)絡(luò)層把運(yùn)輸層產(chǎn)生的報文段或用戶數(shù)據(jù)報封裝成分組和包進(jìn)行傳送档泽。在 TCP/IP 體系結(jié)構(gòu)中俊戳,由于網(wǎng)絡(luò)層使用 IP 協(xié)議,因此分組也叫 IP 數(shù)據(jù)報 馆匿,簡稱 數(shù)據(jù)報抑胎。
這里要注意:不要把運(yùn)輸層的“用戶數(shù)據(jù)報 UDP ”和網(wǎng)絡(luò)層的“ IP 數(shù)據(jù)報”弄混。另外渐北,無論是哪一層的數(shù)據(jù)單元阿逃,都可籠統(tǒng)地用“分組”來表示。
這里強(qiáng)調(diào)指出赃蛛,網(wǎng)絡(luò)層中的“網(wǎng)絡(luò)”二字已經(jīng)不是我們通常談到的具體網(wǎng)絡(luò)盆昙,而是指計算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)模型中第三層的名稱.
互聯(lián)網(wǎng)是由大量的異構(gòu)(heterogeneous)網(wǎng)絡(luò)通過路由器(router)相互連接起來的『嘎玻互聯(lián)網(wǎng)使用的網(wǎng)絡(luò)層協(xié)議是無連接的網(wǎng)際協(xié)議(Intert Protocol)和許多路由選擇協(xié)議淡喜,因此互聯(lián)網(wǎng)的網(wǎng)絡(luò)層也叫做網(wǎng)際層或IP層。
1.4 數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層(data link layer)通常簡稱為鏈路層诵闭。兩臺主機(jī)之間的數(shù)據(jù)傳輸炼团,總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協(xié)議疏尿。 在兩個相鄰節(jié)點之間傳送數(shù)據(jù)時瘟芝,數(shù)據(jù)鏈路層將網(wǎng)絡(luò)層交下來的 IP 數(shù)據(jù)報組裝程幀,在兩個相鄰節(jié)點間的鏈路上傳送幀褥琐。每一幀包括數(shù)據(jù)和必要的控制信息(如同步信息锌俱,地址信息,差錯控制等)敌呈。
在接收數(shù)據(jù)時贸宏,控制信息使接收端能夠知道一個幀從哪個比特開始和到哪個比特結(jié)束。這樣磕洪,數(shù)據(jù)鏈路層在收到一個幀后吭练,就可從中提出數(shù)據(jù)部分,上交給網(wǎng)絡(luò)層析显。 控制信息還使接收端能夠檢測到所收到的幀中有誤差錯鲫咽。如果發(fā)現(xiàn)差錯,數(shù)據(jù)鏈路層就簡單地丟棄這個出了差錯的幀谷异,以避免繼續(xù)在網(wǎng)絡(luò)中傳送下去白白浪費(fèi)網(wǎng)絡(luò)資源分尸。如果需要改正數(shù)據(jù)在鏈路層傳輸時出現(xiàn)差錯(這就是說,數(shù)據(jù)鏈路層不僅要檢錯歹嘹,而且還要糾錯)箩绍,那么就要采用可靠性傳輸協(xié)議來糾正出現(xiàn)的差錯。這種方法會使鏈路層的協(xié)議復(fù)雜些荞下。
1.5 物理層
在物理層上所傳送的數(shù)據(jù)單位是比特伶选。 物理層(physical layer)的作用是實現(xiàn)相鄰計算機(jī)節(jié)點之間比特流的透明傳送,盡可能屏蔽掉具體傳輸介質(zhì)和物理設(shè)備的差異尖昏。 使其上面的數(shù)據(jù)鏈路層不必考慮網(wǎng)絡(luò)的具體傳輸介質(zhì)是什么仰税。“透明傳送比特流”表示經(jīng)實際電路傳送后的比特流沒有發(fā)生變化抽诉,對傳送的比特流來說陨簇,這個電路好像是看不見的。
在互聯(lián)網(wǎng)使用的各種協(xié)中最重要和最著名的就是 TCP/IP 兩個協(xié)議〖L剩現(xiàn)在人們經(jīng)常提到的TCP/IP并不一定單指TCP和IP這兩個具體的協(xié)議河绽,而往往表示互聯(lián)網(wǎng)所使用的整個TCP/IP協(xié)議族。
1). 物理層
參考模型的最低層唉窃,也是OSI模型的第一層耙饰,實現(xiàn)了相鄰計算機(jī)節(jié)點之間比特流的透明傳送,并盡可能地屏蔽掉具體傳輸介質(zhì)和物理設(shè)備的差異纹份,使其上層(數(shù)據(jù)鏈路層)不必關(guān)心網(wǎng)絡(luò)的具體傳輸介質(zhì)苟跪。
2). 數(shù)據(jù)鏈路層(data link layer)
接收來自物理層的位流形式的數(shù)據(jù),并封裝成幀蔓涧,傳送到上一層件已;同樣,也將來自上層的數(shù)據(jù)幀元暴,拆裝為位流形式的數(shù)據(jù)轉(zhuǎn)發(fā)到物理層篷扩。這一層在物理層提供的比特流的基礎(chǔ)上,通過差錯控制茉盏、流量控制方法鉴未,使有差錯的物理線路變?yōu)闊o差錯的數(shù)據(jù)鏈路,即提供可靠的通過物理介質(zhì)傳輸數(shù)據(jù)的方法鸠姨。
3). 網(wǎng)絡(luò)層
將網(wǎng)絡(luò)地址翻譯成對應(yīng)的物理地址歼狼,并通過路由選擇算法為分組通過通信子網(wǎng)選擇最適當(dāng)?shù)穆窂健?/p>
4). 傳輸層(transport layer)
在源端與目的端之間提供可靠的透明數(shù)據(jù)傳輸,使上層服務(wù)用戶不必關(guān)系通信子網(wǎng)的實現(xiàn)細(xì)節(jié)享怀。在協(xié)議棧中羽峰,傳輸層位于網(wǎng)絡(luò)層之上,傳輸層協(xié)議為不同主機(jī)上運(yùn)行的進(jìn)程提供邏輯通信添瓷,而網(wǎng)絡(luò)層協(xié)議為不同主機(jī)提供邏輯通信梅屉,如下圖所示。
實際上鳞贷,網(wǎng)絡(luò)層可以看作是傳輸層的一部分坯汤,其為傳輸層提供服務(wù)。但對于終端系統(tǒng)而言搀愧,網(wǎng)絡(luò)層對它們而言是透明的惰聂,它們知道傳輸層的存在疆偿,也就是說,在邏輯上它們認(rèn)為是傳輸層為它們提供了端對端的通信搓幌,這也是分層思想的妙處杆故。
5). 會話層(Session Layer)
會話層是OSI模型的第五層,是用戶應(yīng)用程序和網(wǎng)絡(luò)之間的接口溉愁,負(fù)責(zé)在網(wǎng)絡(luò)中的兩節(jié)點之間建立处铛、維持和終止通信。
6). 表示層(Presentation Layer):數(shù)據(jù)的編碼拐揭,壓縮和解壓縮撤蟆,數(shù)據(jù)的加密和解
表示層是OSI模型的第六層,它對來自應(yīng)用層的命令和數(shù)據(jù)進(jìn)行解釋堂污,以確保一個系統(tǒng)的應(yīng)用層所發(fā)送的信息可以被另一個系統(tǒng)的應(yīng)用層讀取家肯。
7). 應(yīng)用層(Application layer):為用戶的應(yīng)用進(jìn)程提供網(wǎng)絡(luò)通信服務(wù)
3. TCP對應(yīng)的應(yīng)用層協(xié)議
FTP:定義了文件傳輸協(xié)議,使用21端口盟猖。常說某某計算機(jī)開了FTP服務(wù)便是啟動了文件傳輸服務(wù)息楔。下載文件,上傳主頁扒披,都要用到FTP服務(wù)值依。
Telnet:它是一種用于遠(yuǎn)程登陸的端口,用戶可以以自己的身份遠(yuǎn)程連接到計算機(jī)上碟案,通過這種端口可以提供一種基于DOS模式下的通信服務(wù)愿险。如以前的BBS是-純字符界面的,支持BBS的服務(wù)器將23端口打開价说,對外提供服務(wù)辆亏。
SMTP:定義了簡單郵件傳送協(xié)議,現(xiàn)在很多郵件服務(wù)器都用的是這個協(xié)議鳖目,用于發(fā)送郵件扮叨。如常見的免費(fèi)郵件服務(wù)中用的就是這個郵件服務(wù)端口,所以在電子郵件設(shè)置-中沉炻酰看到有這么SMTP端口設(shè)置這個欄彻磁,服務(wù)器開放的是25號端口。
POP3:它是和SMTP對應(yīng)狸捅,POP3用于接收郵件衷蜓。通常情況下,POP3協(xié)議所用的是110端口尘喝。也是說磁浇,只要你有相應(yīng)的使用POP3協(xié)議的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陸進(jìn)郵箱界面朽褪,直接用郵件程序就可以收到郵件(如是163郵箱就沒有必要先進(jìn)入網(wǎng)易網(wǎng)站置吓,再進(jìn)入自己的郵-箱來收信)无虚。
HTTP:從Web服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。
4. UDP對應(yīng)的應(yīng)用層協(xié)議
DNS:用于域名解析服務(wù)衍锚,將域名地址轉(zhuǎn)換為IP地址友题。DNS用的是53號端口。
SNMP:簡單網(wǎng)絡(luò)管理協(xié)議构拳,使用161號端口,是用來管理網(wǎng)絡(luò)設(shè)備的梁棠。由于網(wǎng)絡(luò)設(shè)備很多置森,無連接的服務(wù)就體現(xiàn)出其優(yōu)勢。
TFTP(Trival File Transfer Protocal):簡單文件傳輸協(xié)議符糊,該協(xié)議在熟知端口69上使用UDP服務(wù)凫海。
5. TCP/UDP
TCP/UDP都是是傳輸層協(xié)議,但是兩者具有不同的特性男娄,同時也具有不同的應(yīng)用場景
什么時候應(yīng)該使用TCP
當(dāng)對網(wǎng)絡(luò)通訊質(zhì)量有要求的時候行贪,比如:整個數(shù)據(jù)要準(zhǔn)確無誤的傳遞給對方,這往往用于一些要求可靠的應(yīng)用模闲,比如HTTP建瘫、HTTPS、FTP等傳輸文件的協(xié)議尸折,POP啰脚、SMTP等郵件傳輸?shù)膮f(xié)議。
什么時候應(yīng)該使用UDP
當(dāng)對網(wǎng)絡(luò)通訊質(zhì)量要求不高的時候实夹,要求網(wǎng)絡(luò)通訊速度能盡量的快橄浓,這時就可以使用UDP。
8..三次握手亮航,四次揮手
9. 為什么要三次握手
三次握手的目的是建立可靠的通信信道荸实,說到通訊,簡單來說就是數(shù)據(jù)的發(fā)送與接收缴淋,而三次握手最主要的目的就是雙方確認(rèn)自己與對方的發(fā)送與接收是正常的准给。
第一次握手:Client 什么都不能確認(rèn);Server 確認(rèn)了對方發(fā)送正常重抖,自己接收正常圆存。
第二次握手:Client 確認(rèn)了:自己發(fā)送、接收正常仇哆,對方發(fā)送沦辙、接收正常;Server 確認(rèn)了:自己接收正常讹剔,對方發(fā)送正常
第三次握手:Client 確認(rèn)了:自己發(fā)送油讯、接收正常详民,對方發(fā)送、接收正常陌兑;Server 確認(rèn)了:自己發(fā)送沈跨、接收正常,對方發(fā)送接收正常
所以三次握手就能確認(rèn)雙發(fā)收發(fā)功能都正常兔综,缺一不可饿凛。
10.為什么要四次揮手
任何一方都可以在數(shù)據(jù)傳送結(jié)束后發(fā)出連接釋放的通知,待對方確認(rèn)后進(jìn)入半關(guān)閉狀態(tài)软驰。當(dāng)另一方也沒有數(shù)據(jù)再發(fā)送的時候涧窒,則發(fā)出連接釋放通知,對方確認(rèn)后就完全關(guān)閉了TCP連接锭亏。
舉個例子:A 和 B 打電話纠吴,通話即將結(jié)束后,A 說“我沒啥要說的了”慧瘤,B回答“我知道了”戴已,但是 B 可能還會有要說的話,A 不能要求 B 跟著自己的節(jié)奏結(jié)束通話锅减,于是 B 可能又巴拉巴拉說了一通糖儡,最后 B 說“我說完了”,A 回答“知道了”怔匣,這樣通話才算結(jié)束休玩。
11.對于可靠性,TCP通過以下方式進(jìn)行保證:
- 數(shù)據(jù)包校驗:目的是檢測數(shù)據(jù)在傳輸過程中的任何變化劫狠,若校驗出包有錯拴疤,則丟棄報文段并且不給出響應(yīng),這時TCP發(fā)送數(shù)據(jù)端超時后會重發(fā)數(shù)據(jù)独泞;
- 對失序數(shù)據(jù)包重排序:既然TCP報文段作為IP數(shù)據(jù)報來傳輸呐矾,而IP數(shù)據(jù)報的到達(dá)可能會失序,因此TCP報文段的到達(dá)也可能會失序懦砂。TCP將對失序數(shù)據(jù)進(jìn)行重新排序蜒犯,然后才交給應(yīng)用層;
- 丟棄重復(fù)數(shù)據(jù):對于重復(fù)數(shù)據(jù)荞膘,能夠丟棄重復(fù)數(shù)據(jù)罚随;
- 應(yīng)答機(jī)制:當(dāng)TCP收到發(fā)自TCP連接另一端的數(shù)據(jù),它將發(fā)送一個確認(rèn)羽资。這個確認(rèn)不是立即發(fā)送淘菩,通常將推遲幾分之一秒;
- 超時重發(fā):當(dāng)TCP發(fā)出一個段后,它啟動一個定時器潮改,等待目的端確認(rèn)收到這個報文段狭郑。如果不能及時收到一個確認(rèn),將重發(fā)這個報文段汇在;
- 流量控制:TCP連接的每一方都有固定大小的緩沖空間翰萨。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù),這可以防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出糕殉,這就是流量控制亩鬼。TCP使用的流量控制協(xié)議是可變大小的滑動窗口協(xié)議。
12.超時重發(fā)
當(dāng)發(fā)送者向接收者發(fā)包后阿蝶,如果過了一段時間(超時時間)依然沒有收到消息雳锋,就當(dāng)做本次包丟失,需要重新補(bǔ)發(fā)赡磅。
并且如果一次性發(fā)了三個包魄缚,只要最后一個包確認(rèn)收到之后就默認(rèn)前面兩個也收到了宝与。
13. 滑動窗口
假設(shè)一次性發(fā)送包的大小為3焚廊,那么每次可以發(fā)3個包,而且可以邊發(fā)邊接收习劫,這樣就會增強(qiáng)效率咆瘟。這里的 3 就是滑動窗口的大小,這樣的發(fā)送方式也叫滑動窗口協(xié)議诽里。
14.默認(rèn)端口號
1.HTTP協(xié)議代理服務(wù)器常用端口號:80/8080/3128/8081/9098
2.SOCKS代理協(xié)議服務(wù)器常用端口號:1080
3.FTP(文件傳輸)協(xié)議代理服務(wù)器常用端口號:21
4.Telnet(遠(yuǎn)程登錄)協(xié)議代理服務(wù)器常用端口號:23
HTTP服務(wù)器袒餐,默認(rèn)端口號為80/tcp(木馬Executor開放此端口)
HTTPS(securely transferring web pages)服務(wù)器,默認(rèn)端口號為443/tcp 443/udp
IP地址與MAC地址的區(qū)別
IP地址是指互聯(lián)網(wǎng)協(xié)議地址(Internet Protocol Address)IP Address的縮寫谤狡。IP地址是IP協(xié)議提供的一種統(tǒng)一的地址格式灸眼,它為互聯(lián)網(wǎng)上的每一個網(wǎng)絡(luò)和每一臺主機(jī)分配一個邏輯地址,以此來屏蔽物理地址的差異墓懂。
MAC 地址又稱為物理地址焰宣、硬件地址,用來定義網(wǎng)絡(luò)設(shè)備的位置捕仔。網(wǎng)卡的物理地址通常是由網(wǎng)卡生產(chǎn)廠家寫入網(wǎng)卡的匕积,具有全球唯一性。MAC地址用于在網(wǎng)絡(luò)中唯一標(biāo)示一個網(wǎng)卡榜跌,一臺電腦會有一或多個網(wǎng)卡闪唆,每個網(wǎng)卡都需要有一個唯一的MAC地址。
15.HTTP請求/響應(yīng)報文結(jié)構(gòu)
請求
HTTP請求報文
一個HTTP請求報文由四個部分組成:請求行钓葫、請求頭部悄蕾、空行、請求數(shù)據(jù)础浮。
1.請求行
請求行由請求方法字段笼吟、URL字段和HTTP協(xié)議版本字段3個字段組成库物,它們用空格分隔。比如 GET /data/info.html HTTP/1.1
方法字段就是HTTP使用的請求方法贷帮,比如常見的GET/POST
其中HTTP協(xié)議版本有兩種:HTTP1.0/HTTP1.1 可以這樣區(qū)別:
HTTP1.0對于每個連接都只能傳送一個請求和響應(yīng)戚揭,請求就會關(guān)閉,HTTP1.0沒有Host字段;而HTTP1.1在同一個連接中可以傳送多個請求和響應(yīng)撵枢,多個請求可以重疊和同時進(jìn)行民晒,HTTP1.1必須有Host字段。
2.請求頭部
HTTP客戶程序(例如瀏覽器)锄禽,向服務(wù)器發(fā)送請求的時候必須指明請求類型(一般是GET或者 POST)潜必。如有必要,客戶程序還可以選擇發(fā)送其他的請求頭沃但。大多數(shù)請求頭并不是必需的磁滚,但Content-Length除外。對于POST請求來說 Content-Length必須出現(xiàn)宵晚。
常見的請求頭字段含義:
Accept: 瀏覽器可接受的MIME類型垂攘。
Accept-Charset:瀏覽器可接受的字符集。
Accept-Encoding:瀏覽器能夠進(jìn)行解碼的數(shù)據(jù)編碼方式淤刃,比如gzip晒他。Servlet能夠向支持gzip的瀏覽器返回經(jīng)gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間逸贾。
Accept-Language:瀏覽器所希望的語言種類陨仅,當(dāng)服務(wù)器能夠提供一種以上的語言版本時要用到。
Authorization:授權(quán)信息铝侵,通常出現(xiàn)在對服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中灼伤。
Content-Length:表示請求消息正文的長度肺孵。
Host: 客戶機(jī)通過這個頭告訴服務(wù)器珊佣,想訪問的主機(jī)名飞几。Host頭域指定請求資源的Intenet主機(jī)和端口號次氨,必須表示請求url的原始服務(wù)器或網(wǎng)關(guān)的位置败富。HTTP/1.1請求必須包含主機(jī)頭域汁掠,否則系統(tǒng)會以400狀態(tài)碼返回妨蛹。
If-Modified-Since:客戶機(jī)通過這個頭告訴服務(wù)器灸蟆,資源的緩存時間隆敢。只有當(dāng)所請求的內(nèi)容在指定的時間后又經(jīng)過修改才返回它发皿,否則返回304“Not Modified”應(yīng)答。
Referer:客戶機(jī)通過這個頭告訴服務(wù)器拂蝎,它是從哪個資源來訪問服務(wù)器的(防盜鏈)穴墅。包含一個URL,用戶從該URL代表的頁面出發(fā)訪問當(dāng)前請求的頁面。
User-Agent:User-Agent頭域的內(nèi)容包含發(fā)出請求的用戶信息玄货。瀏覽器類型皇钞,如果Servlet返回的內(nèi)容與瀏覽器類型有關(guān)則該值非常有用。
Cookie:客戶機(jī)通過這個頭可以向服務(wù)器帶數(shù)據(jù)松捉,這是最重要的請求頭信息之一夹界。
Pragma:指定“no-cache”值表示服務(wù)器必須返回一個刷新后的文檔,即使它是代理服務(wù)器而且已經(jīng)有了頁面的本地拷貝隘世。
From:請求發(fā)送者的email地址可柿,由一些特殊的Web客戶程序使用,瀏覽器不會用到它丙者。
Connection:處理完這次請求后是否斷開連接還是繼續(xù)保持連接复斥。如果Servlet看到這里的值為“Keep- Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認(rèn)進(jìn)行持久連接)械媒,它就可以利用持久連接的優(yōu)點目锭,當(dāng)頁面包含多個元素時(例如Applet,圖片)纷捞,顯著地減少下載所需要的時間痢虹。要實現(xiàn)這一點,Servlet需要在應(yīng)答中發(fā)送一個Content-Length頭兰绣,最簡單的實現(xiàn)方法是:先把內(nèi)容寫入 ByteArrayOutputStream世分,然后在正式寫出內(nèi)容之前計算它的大小编振。
Range:Range頭域可以請求實體的一個或者多個子范圍缀辩。例如,
表示頭500個字節(jié):bytes=0-499
表示第二個500字節(jié):bytes=500-999
表示最后500個字節(jié):bytes=-500
表示500字節(jié)以后的范圍:bytes=500-
第一個和最后一個字節(jié):bytes=0-0,-1
同時指定幾個范圍:bytes=500-600,601-999
但是服務(wù)器可以忽略此請求頭踪央,如果無條件GET包含Range請求頭臀玄,響應(yīng)會以狀態(tài)碼206(PartialContent)返回而不是以200 (OK)。
UA-Pixels畅蹂,UA-Color健无,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發(fā)送的非標(biāo)準(zhǔn)的請求頭液斜,表示屏幕大小累贤、顏色深度、操作系統(tǒng)和CPU類型少漆。
3.空行
它的作用是通過一個空行臼膏,告訴服務(wù)器請求頭部到此為止。
4.請求數(shù)據(jù)
若方法字段是GET示损,則此項為空渗磅,沒有數(shù)據(jù)
若方法字段是POST,則通常來說此處放置的就是要提交的數(shù)據(jù)
比如要使用POST方法提交一個表單,其中有user字段中數(shù)據(jù)為“admin”, password字段為123456,那么這里的請求數(shù)據(jù)就是 user=admin&password=123456始鱼,使用&來連接各個字段仔掸。
響應(yīng)
上面是POST方法,它的請求行URL段中一般是沒有參數(shù)的医清,參數(shù)放在了報文體中起暮。而GET方法的參數(shù)直接置于請求行URL中,報文體則為空会烙。
HTTP響應(yīng)報文
同樣的鞋怀,HTTP響應(yīng)報文也由三部分組成:響應(yīng)行、響應(yīng)頭持搜、響應(yīng)體
1.響應(yīng)行
響應(yīng)行一般由協(xié)議版本密似、狀態(tài)碼及其描述組成 比如 HTTP/1.1 200 OK
其中協(xié)議版本HTTP/1.1或者HTTP/1.0,200就是它的狀態(tài)碼葫盼,OK則為它的描述残腌。
//常見狀態(tài)碼:
100~199:表示成功接收請求,要求客戶端繼續(xù)提交下一次請求才能完成整個處理過程贫导。
200~299:表示成功接收請求并已完成整個處理過程抛猫。常用200
300~399:為完成請求,客戶需進(jìn)一步細(xì)化請求孩灯。例如:請求的資源已經(jīng)移動一個新地址闺金、常用302(意味著你請求我,我讓你去找別人),307和304(我不給你這個資源峰档,自己拿緩存)
400~499:客戶端的請求有錯誤败匹,常用404(意味著你請求的資源在web服務(wù)器中沒有)403(服務(wù)器拒絕訪問,權(quán)限不夠)
500~599:服務(wù)器端出現(xiàn)錯誤讥巡,常用500
更詳細(xì)的狀態(tài)碼信息
2.響應(yīng)頭
響應(yīng)頭用于描述服務(wù)器的基本信息掀亩,以及數(shù)據(jù)的描述,服務(wù)器通過這些數(shù)據(jù)的描述信息欢顷,可以通知客戶端如何處理等一會兒它回送的數(shù)據(jù)槽棍。
設(shè)置HTTP響應(yīng)頭往往和狀態(tài)碼結(jié)合起來。例如抬驴,有好幾個表示“文檔位置已經(jīng)改變”的狀態(tài)代碼都伴隨著一個Location頭炼七,而401(Unauthorized)狀態(tài)代碼則必須伴隨一個WWW-Authenticate頭。然而布持,即使在沒有設(shè)置特殊含義的狀態(tài)代碼時豌拙,指定應(yīng)答頭也是很有用的。應(yīng)答頭可以用來完成:設(shè)置Cookie鳖链,指定修改日期姆蘸,指示瀏覽器按照指定的間隔刷新頁面墩莫,聲明文檔的長度以便利用持久HTTP連接,……等等許多其他任務(wù)逞敷。
常見的響應(yīng)頭字段含義:
Allow:服務(wù)器支持哪些請求方法(如GET狂秦、POST等)。
Content-Encoding:文檔的編碼(Encode)方法推捐。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型裂问。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。Java的GZIPOutputStream可以很方便地進(jìn)行g(shù)zip壓縮牛柒,但只有Unix上的Netscape和Windows上的IE4堪簿、IE5才支持它。因此皮壁,Servlet應(yīng)該通過查看Accept-Encoding頭(即request.getHeader(“Accept- Encoding”))檢查瀏覽器是否支持gzip椭更,為支持gzip的瀏覽器返回經(jīng)gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面蛾魄。
Content-Length:表示內(nèi)容長度虑瀑。只有當(dāng)瀏覽器使用持久HTTP連接時才需要這個數(shù)據(jù)。如果你想要利用持久連接的優(yōu)勢滴须,可以把輸出文檔寫入 ByteArrayOutputStram舌狗,完成后查看其大小,然后把該值放入Content-Length頭扔水,最后通過byteArrayStream.writeTo(response.getOutputStream()發(fā)送內(nèi)容痛侍。
Content- Type:表示后面的文檔屬于什么MIME類型。Servlet默認(rèn)為text/plain魔市,但通常需要顯式地指定為text/html主届。由于經(jīng)常要設(shè)置 Content-Type,因此HttpServletResponse提供了一個專用的方法setContentType嘹狞。
Date:當(dāng)前的GMT時間岂膳,例如誓竿,Date:Mon,31Dec200104:25:57GMT磅网。Date描述的時間表示世界標(biāo)準(zhǔn)時,換算成本地時間筷屡,需要知道用戶所在的時區(qū)涧偷。你可以用setDateHeader來設(shè)置這個頭以避免轉(zhuǎn)換時間格式的麻煩。
Expires:告訴瀏覽器把回送的資源緩存多長時間毙死,-1或0則是不緩存燎潮。
Last-Modified:文檔的最后改動時間《筇龋客戶可以通過If-Modified-Since請求頭提供一個日期确封,該請求將被視為一個條件GET除呵,只有改動時間遲于指定時間的文檔才會返回,否則返回一個304(Not Modified)狀態(tài)爪喘。Last-Modified也可用setDateHeader方法來設(shè)置颜曾。
Location:這個頭配合302狀態(tài)碼使用,用于重定向接收者到一個新URI地址秉剑。表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n泛豪。Location通常不是直接設(shè)置的,而是通過HttpServletResponse的sendRedirect方法侦鹏,該方法同時設(shè)置狀態(tài)代碼為302诡曙。
Refresh:告訴瀏覽器隔多久刷新一次,以秒計略水。
Server:服務(wù)器通過這個頭告訴瀏覽器服務(wù)器的類型价卤。Server響應(yīng)頭包含處理請求的原始服務(wù)器的軟件信息。此域能包含多個產(chǎn)品標(biāo)識和注釋渊涝,產(chǎn)品標(biāo)識一般按照重要性排序荠雕。Servlet一般不設(shè)置這個值,而是由Web服務(wù)器自己設(shè)置驶赏。
Set-Cookie:設(shè)置和頁面關(guān)聯(lián)的Cookie炸卑。Servlet不應(yīng)使用response.setHeader(“Set-Cookie”, …),而是應(yīng)使用HttpServletResponse提供的專用方法addCookie煤傍。
Transfer-Encoding:告訴瀏覽器數(shù)據(jù)的傳送格式盖文。
WWW-Authenticate:客戶應(yīng)該在Authorization頭中提供什么類型的授權(quán)信息?在包含401(Unauthorized)狀態(tài)行的應(yīng)答中這個頭是必需的。例如蚯姆,response.setHeader(“WWW-Authenticate”, “BASIC realm=\”executives\”“)五续。注意Servlet一般不進(jìn)行這方面的處理,而是讓W(xué)eb服務(wù)器的專門機(jī)制來控制受密碼保護(hù)頁面的訪問龄恋。
注:設(shè)置應(yīng)答頭最常用的方法是HttpServletResponse的setHeader疙驾,該方法有兩個參數(shù),分別表示應(yīng)答頭的名字和值郭毕。和設(shè)置狀態(tài)代碼相似它碎,設(shè)置應(yīng)答頭應(yīng)該在發(fā)送任何文檔內(nèi)容之前進(jìn)行。
setDateHeader方法和setIntHeadr方法專門用來設(shè)置包含日期和整數(shù)值的應(yīng)答頭显押,前者避免了把Java時間轉(zhuǎn)換為GMT時間字符串的麻煩扳肛,后者則避免了把整數(shù)轉(zhuǎn)換為字符串的麻煩。
HttpServletResponse還提供了許多設(shè)置
setContentType:設(shè)置Content-Type頭乘碑。大多數(shù)Servlet都要用到這個方法挖息。
setContentLength:設(shè)置Content-Length頭。對于支持持久HTTP連接的瀏覽器來說兽肤,這個函數(shù)是很有用的套腹。
addCookie:設(shè)置一個Cookie(Servlet API中沒有setCookie方法绪抛,因為應(yīng)答往往包含多個Set-Cookie頭)。
3.響應(yīng)體
響應(yīng)體就是響應(yīng)的消息體电禀,如果是純數(shù)據(jù)就是返回純數(shù)據(jù)睦疫,如果請求的是HTML頁面,那么返回的就是HTML代碼鞭呕,如果是JS就是JS代碼蛤育,如此之類
16. Http和Https的區(qū)別
Http協(xié)議運(yùn)行在TCP之上,明文傳輸葫松,客戶端與服務(wù)器端都無法驗證對方的身份瓦糕;Https是身披SSL(Secure Socket Layer)外殼的Http,運(yùn)行于SSL上腋么,SSL運(yùn)行于TCP之上咕娄,是添加了加密和認(rèn)證機(jī)制的HTTP。二者之間存在如下不同:
端口不同:Http與Http使用不同的連接方式珊擂,用的端口也不一樣圣勒,前者是80,后者是443摧扇;
資源消耗:和HTTP通信相比圣贸,Https通信會由于加減密處理消耗更多的CPU和內(nèi)存資源;
開銷:Https通信需要證書扛稽,而證書一般需要向認(rèn)證機(jī)構(gòu)購買吁峻;
Https的加密機(jī)制是一種共享密鑰加密和公開密鑰加密并用的混合加密機(jī)制。
- 端口 :
HTTP的URL由“http://”起始且默認(rèn)使用端口80在张,而HTTPS的URL由“https://”起始且默認(rèn)使用端口443用含。 - 安全性和資源消耗:
HTTP協(xié)議運(yùn)行在TCP之上,所有傳輸?shù)膬?nèi)容都是明文帮匾,客戶端和服務(wù)器端都無法驗證對方的身份啄骇。HTTPS是運(yùn)行在SSL/TLS之上的HTTP協(xié)議,SSL/TLS 運(yùn)行在TCP之上瘟斜。所有傳輸?shù)膬?nèi)容都經(jīng)過加密缸夹,加密采用對稱加密,但對稱加密的密鑰用服務(wù)器方的證書進(jìn)行了非對稱加密哼转。所以說明未,HTTP 安全性沒有 HTTPS高,但是 HTTPS 比HTTP耗費(fèi)更多服務(wù)器資源壹蔓。
- 對稱加密:密鑰只有一個,加密解密為同一個密碼猫态,且加解密速度快佣蓉,典型的對稱加密算法有DES披摄、AES等;
- 非對稱加密:密鑰成對出現(xiàn)(且根據(jù)公鑰無法推知私鑰勇凭,根據(jù)私鑰也無法推知公鑰)疚膊,加密解密使用不同密鑰(公鑰加密需要私鑰解密,私鑰加密需要公鑰解密)虾标,相對對稱加密速度較慢寓盗,典型的非對稱加密算法有RSA、DSA等璧函。
https的底層原理
17. 對稱加密與非對稱加密
對稱密鑰加密是指加密和解密使用同一個密鑰的方式傀蚌,這種方式存在的最大問題就是密鑰發(fā)送問題,即如何安全地將密鑰發(fā)給對方蘸吓;而非對稱加密是指使用一對非對稱密鑰善炫,即公鑰和私鑰,公鑰可以隨意發(fā)布库继,但私鑰只有自己知道箩艺。發(fā)送密文的一方使用對方的公鑰進(jìn)行加密處理,對方接收到加密信息后宪萄,使用自己的私鑰進(jìn)行解密艺谆。
由于非對稱加密的方式不需要發(fā)送用來解密的私鑰,所以可以保證安全性拜英;但是和對稱加密比起來擂涛,它非常的慢,所以我們還是要用對稱加密來傳送消息聊记,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發(fā)送出去撒妈。
18. Get與POST的區(qū)別
GET與POST是我們常用的兩種HTTP Method,二者之間的區(qū)別主要包括如下五個方面:
(1). 從功能上講排监,GET一般用來從服務(wù)器上獲取資源狰右,POST一般用來更新服務(wù)器上的資源;
(2). 從REST服務(wù)角度上說舆床,GET是冪等的棋蚌,即讀取同一個資源,總是得到相同的數(shù)據(jù)挨队,而POST不是冪等的谷暮,因為每次請求對資源的改變并不是相同的;進(jìn)一步地盛垦,GET不會改變服務(wù)器上的資源湿弦,而POST會對服務(wù)器資源進(jìn)行改變;
(3). 從請求參數(shù)形式上看腾夯,GET請求的數(shù)據(jù)會附在URL之后颊埃,即將請求數(shù)據(jù)放置在HTTP報文的 請求頭 中蔬充,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連班利。特別地饥漫,如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送罗标;否則庸队,會將其編碼為 application/x-www-form-urlencoded MIME 字符串(如果是空格,轉(zhuǎn)換為+闯割,如果是中文/其他字符彻消,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD纽谒,其中%XX中的XX為該符號以16進(jìn)制表示的ASCII)证膨;而POST請求會把提交的數(shù)據(jù)則放置在是HTTP請求報文的 請求體 中。
(4). 就安全性而言鼓黔,POST的安全性要比GET的安全性高央勒,因為GET請求提交的數(shù)據(jù)將明文出現(xiàn)在URL上,而且POST請求參數(shù)則被包裝到請求體中澳化,相對更安全崔步。
(5). 從請求的大小看,GET請求的長度受限于瀏覽器或服務(wù)器對URL長度的限制缎谷,允許發(fā)送的數(shù)據(jù)量比較小井濒,而POST請求則是沒有大小限制的。
HTTP協(xié)議的響應(yīng)報文由狀態(tài)行列林、響應(yīng)頭部和響應(yīng)包體組成瑞你,其響應(yīng)狀態(tài)碼總體描述如下:
1xx:指示信息--表示請求已接收,繼續(xù)處理希痴。
2xx:成功--表示請求已被成功接收者甲、理解、接受砌创。
3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作虏缸。
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現(xiàn)。
5xx:服務(wù)器端錯誤--服務(wù)器未能實現(xiàn)合法的請求嫩实。常見狀態(tài)代碼刽辙、狀態(tài)描述的詳細(xì)說明如下。
200 OK:客戶端請求成功甲献。
206 partial content服務(wù)器已經(jīng)正確處理部分GET請求宰缤,實現(xiàn)斷點續(xù)傳或同時分片下載,該請求必須包含Range請求頭來指示客戶端期望得到的范圍
300 multiple choices(可選重定向):被請求的資源有一系列可供選擇的反饋信息,由瀏覽器/用戶自行選擇其中一個撵溃。
301 moved permanently(永久重定向):該資源已被永久移動到新位置疚鲤,將來任何對該資源的訪問都要使用本響應(yīng)返回的若干個URI之一锥累。
302 move temporarily(臨時重定向):請求的資源現(xiàn)在臨時從不同的URI中獲得缘挑,
304:not modified :如果客戶端發(fā)送一個待條件的GET請求并且該請求以經(jīng)被允許,而文檔內(nèi)容未被改變桶略,則返回304,該響應(yīng)不包含包體(即可直接使用緩存)语淘。
403 Forbidden:服務(wù)器收到請求,但是拒絕提供服務(wù)际歼。t Found:請求資源不存在惶翻,舉個例子:輸入了錯誤的URL。
HTTP長連接,短連接
在HTTP/1.0中默認(rèn)使用短連接鹅心。也就是說吕粗,客戶端和服務(wù)器每進(jìn)行一次HTTP操作,就建立一次連接旭愧,任務(wù)結(jié)束就中斷連接颅筋。當(dāng)客戶端瀏覽器訪問的某個HTML或其他類型的Web頁中包含有其他的Web資源(如JavaScript文件、圖像文件输枯、CSS文件等)议泵,每遇到這樣一個Web資源,瀏覽器就會重新建立一個HTTP會話桃熄。而從HTTP/1.1起先口,默認(rèn)使用長連接,用以保持連接特性瞳收。使用長連接的HTTP協(xié)議碉京,會在響應(yīng)頭加入這行代碼:Connection:keep-alive在使用長連接的情況下,當(dāng)一個網(wǎng)頁打開完成后螟深,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉谐宙,客戶端再次訪問這個服務(wù)器時,會繼續(xù)使用這一條已經(jīng)建立的連接血崭。Keep-Alive不會永久保持連接卧惜,它有一個保持時間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個時間夹纫。實現(xiàn)長連接需要客戶端和服務(wù)端都支持長連接咽瓷。HTTP協(xié)議的長連接和短連接,實質(zhì)上是TCP協(xié)議的長連接和短連接舰讹。