第一篇:http頭文件分析心得體會
http頭文件分析心得體會
一、http簡介
HTTP即超文本傳輸協(xié)議(Hypertext transfer protocol)。是一種詳細(xì)規(guī)定了瀏覽器和萬維網(wǎng)(“,結(jié)果稱為 HA2。
3、對HA1、服務(wù)器密碼隨機(jī)數(shù)(nonce)、請求計數(shù)(nc)、客戶端密碼隨機(jī)數(shù)(cnonce)、保護(hù)質(zhì)量(qop)以及 HA2 的合并值計算 MD5 哈希值。結(jié)果即為客戶端提供的
response 值。
因為服務(wù)器擁有與客戶端同樣的信息,因此服務(wù)器可以進(jìn)行同樣的計算,以驗證客戶端提交的 response 值的正確性。在上面給出的例子中,結(jié)果是如下計算的。
(MD5()表示用于計算MD5哈希值的函數(shù);“”表示接下一行;引號并不參與計算)
HA1 = MD5(”Mufasa:testrealm@host.com:Circle Of Life“)
= 939e7578ed9e3c518a452acee763bce9 HA2 = MD5(”GET:/dir/index.html“)
= 39aff3a2bab6126f332b942af96d3366 Response = MD5(”939e7578ed9e3c518a452acee763bce9:
dcd98b7102dd2f0e8b11d0f600bfb0c093: 00000001:0a4f113b:auth: 39aff3a2bab6126f332b942af96d3366“)= 6629fae49393a05397450978507c4ef1 此時客戶端可以提交一個新的請求,重復(fù)使用服務(wù)器密碼隨機(jī)數(shù)(nonce)(服務(wù) 器僅在每次“401”響應(yīng)后發(fā)行新的nonce),但是提供新的客戶端密碼隨機(jī)數(shù)(cnonce)。在后續(xù)的請求中,十六進(jìn)制請求計數(shù)器(nc)必須比前 一次使用的時候要大,否則攻擊者可以簡單的使用同樣的認(rèn)證信息重放老的請求。由服務(wù)器來確保在每個發(fā)出的密碼隨機(jī)數(shù)nonce時,計數(shù)器是在增加的,并拒 絕掉任何錯誤的請求。顯然,改變HTTP方法和/或計數(shù)器數(shù)值都會導(dǎo)致不同的 response值。
服務(wù)器應(yīng)當(dāng)記住最近所生成的服務(wù)器密碼隨機(jī)數(shù)nonce的值。也可以在發(fā)行每一個密碼隨機(jī)數(shù)nonce后,記住過一段時間讓它們過期。如果客戶端使用了一個過期的值,服務(wù)器應(yīng)該響應(yīng)“401”狀態(tài)號,并且在認(rèn)證頭中添加stale=TRUE,表明客戶端應(yīng)當(dāng)使用新提供的服務(wù)器密碼隨機(jī)數(shù)nonce重發(fā)請求,而不必提示用戶其它用戶名和口令。
服務(wù)器不需要保存任何過期的密碼隨機(jī)數(shù),它可以簡單的認(rèn)為所有不認(rèn)識的數(shù)值都是過期的。服務(wù)器也可以只允許每一個服務(wù)器密碼隨機(jī)數(shù)nonce使用一次,當(dāng)然,這樣就會迫使客戶端在發(fā)送每個請求的時候重復(fù)認(rèn)證過程。需要注意的是,在生成后立刻過期服務(wù)器密碼隨機(jī)數(shù)nonce是不行的,因為客戶端將沒有任何機(jī)會來使用這個nonce。
語法:
challenge
= ”Digest“ digest-challenge
digest-challenge = 1#(realm | [ domain ] | nonce |
[ opaque ] |[ stale ] | [ algorithm ] |
[ qop-options ] | [auth-param])
domain
= ”domain“ ”=“ <”> URI(1*SP URI)<“>
URI
= absoluteURI | abs_path
nonce
= ”nonce“ ”=“ nonce-value
nonce-value
= quoted-string
opaque
= ”opaque“ ”=“ quoted-string
stale
= ”stale“ ”=“(”true“ | ”false“)
algorithm
= ”algorithm“ ”=“(”MD5“ | ”MD5-sess“ |
token)
qop-options
= ”qop“ ”=“ <”> 1#qop-value <“>
qop-value
= ”auth“ | ”auth-int“ | token
realm:讓客戶知道使用哪個用戶名和密碼的字符串。不同的領(lǐng)域可能密碼不一樣。至少告訴用戶是什么主機(jī)做認(rèn)證,他可能會提示用哪個用戶名登錄,類似一個Email。
domain:一個URI列表,指示要保護(hù)的域??赡苁且粋€列表。提示用戶這些URI采用一樣的認(rèn)證。如果為空或忽略則為整個服務(wù)器。nonce:隨機(jī)字符串,每次401都不一樣。跟算法有關(guān)。算法類似Base64加密:time-stamp H(time-stamp ”:“ ETag ”:“ private-key)。time-stamp為服務(wù)器時鐘,ETag為請求的Etag頭。private-key為服務(wù)器知道的一個值。
opaque:服務(wù)器產(chǎn)生的由客戶下去請求時原樣返回。最好是Base64串或十六進(jìn)制字符串。
auth-param:為擴(kuò)展用的,現(xiàn)階段忽略。
其他域請參考RFC2617。
授權(quán)頭語法:
credentials
= ”Digest“ digest-response
digest-response = 1#(username | realm | nonce | digest-uri
| response | [ algorithm ] | [cnonce] |
[opaque] | [message-qop] |
[nonce-count] | [auth-param])
username
= ”username“ ”=“ username-value
username-value = quoted-string
digest-uri
= ”uri“ ”=“ digest-uri-value
digest-uri-value = request-uri;As specified by HTTP/1.1
message-qop
= ”qop“ ”=“ qop-value
cnonce
= ”cnonce“ ”=“ cnonce-value
cnonce-value
= nonce-value
nonce-count
= ”nc“ ”=“ nc-value
nc-value
= 8LHEX
response
= ”response“ ”=“ request-digest
request-digest = <”> 32LHEX <“>
LHEX
= ”0“ | ”1“ | ”2“ | ”3“ |
”4“ | ”5“ | ”6“ | ”7“ |
”8“ | ”9“ | ”a“ | ”b“ |
”c“ | ”d“ | ”e“ | ”f“
response:加密后的密碼
digest-uri:拷貝Request-Line,用于Proxy cnonce:如果qop設(shè)置,才設(shè)置,用于雙向認(rèn)證,防止攻擊。
nonce-count:如果服務(wù)器看到同樣的計數(shù),就是一次重放。
示例:
401響應(yīng):
HTTP/1.1 401 Unauthorized
004km.cnonce=”0a4f113b“,response=”6629fae49393a05397450978507c4ef1“,opaque=”5ccc069c403ebaf9f0171e9517f40e41"
一,用摘要保護(hù)密碼
摘要認(rèn)證的一個改進(jìn)之處是用摘要代替密碼的傳輸,遵循的基本原則是“絕對不通過網(wǎng)絡(luò)發(fā)送明文密碼”,而是發(fā)送一個密碼的摘要信息,并且這摘要信息是不可逆 的,即無法通
過摘要信息反推出密碼信息。而服務(wù)器本身是存儲這個密碼的(實際上,服務(wù)器只需知道密碼的摘要即可),而客戶端和服務(wù)器本身都知道這個密碼。這樣的話,服 務(wù)器可以讀取客戶端的摘要和本身知道的密碼進(jìn)行同樣計算得出的摘要進(jìn)行比較,若匹配,則驗證通過。
摘要是對信息主體的濃縮,摘要是一種單向函數(shù),主要用于將無限的輸入值轉(zhuǎn)為有限的濃縮輸出值,如MD5,則是將任意長度的字節(jié)系列轉(zhuǎn)換為一個128位的摘要。MD5輸出的128位的摘要通常會寫出32個十六進(jìn)制的字符,每個字符表示4個bit。
二,用隨機(jī)數(shù)防止重放攻擊
使用單向摘要就無需以明文形式發(fā)送密碼了,可以只發(fā)送密碼的摘要,并且可以確信,沒有哪個惡意用戶能輕易的從摘要中解碼出原始密碼。
但是,摘要被截獲也可能跟密碼一起好用,為了防止重放攻擊的發(fā)送,服務(wù)器可以向客戶端發(fā)送一個稱為隨機(jī)數(shù)nonce的特殊令牌,這個數(shù)會經(jīng)常發(fā)生變化(可 能是每毫秒,或者每次認(rèn)證都發(fā)生變化,具體由服務(wù)器控制),客戶端在計算摘要之前要先將這個隨機(jī)數(shù)附加到密碼上去。這樣,在密碼中加入隨機(jī)數(shù)就會使得摘要 隨著隨機(jī)數(shù)的每次變化而變化,記錄下的密碼摘要只對特定的隨機(jī)數(shù)有效,而沒有密碼的話,攻擊者就無法計算出正確的摘要,這樣就可以防止重放攻擊的發(fā)生。
摘要認(rèn)證要求使用隨機(jī)數(shù),隨機(jī)數(shù)是在004km.cnonce。如下例子:
GET/cgi-bin/checkout?a=b HTTP/1.1 Authorization: Digest username=”tenfyguo”
realm=”test realm”
nonce=” 66C4EF58DA7CB956BD04233FBB64E0A4” //服務(wù)器端的隨機(jī)數(shù)一起帶回
uri=”/cgi-bin/checkout?a=b” //必須跟請求行一致
qop=”auth” //保護(hù)質(zhì)量參數(shù)
nc=0000001
cnonce=”xxxxx234132543strwerr65sgdrftdfytryts” //客戶端隨機(jī)數(shù),用于對稱校驗
response=” ABC4EF58DA7CB956BD04345FBB64E0A4”//最終摘要
3,服務(wù)接受摘要,選擇算法以及掌握的數(shù)據(jù),重新計算新的摘要跟客戶端傳輸?shù)恼M(jìn)行比較,驗證是否匹配,若客戶端反過來用客戶端隨機(jī)數(shù)對服務(wù)器進(jìn)行質(zhì)詢,就 會創(chuàng)建客戶端摘要,服務(wù)可以預(yù)先將下一個隨機(jī)數(shù)計算出來,提前傳遞給客戶端,通過Authentication-Info發(fā)送下一個隨機(jī)數(shù)。如下例子:
HTTP/1.1 200 OK Authorization-Info:nextnonce=” 88C4EF58DA7CB956BD04233FBB64E0A4”
qop=”auth”
rspauth=”23543534DfasetwerwgDTerGDTERERRE”
cnonce=” xxxxx234132543strwerr65sgdrftdfytryts”
四,摘要的計算
在說明如何計算摘要之前,先說明參加摘要計算的信息塊。信息塊主要有兩種:
1,表示與安全相關(guān)的數(shù)據(jù)的A1。
A1中的數(shù)據(jù)時密碼和受保護(hù)信息的產(chǎn)物,它包括用戶名,密碼,保護(hù)域和隨機(jī)數(shù)等內(nèi)容,A1只涉及安全信息,與底層報文自身無關(guān)。
若算法是:MD5 則A1= 若算法是:MD5-sess 則A1=MD5( ): 2,表示與報文相關(guān)的數(shù)據(jù)的A2.A2表示是與報文自身相關(guān)的信息,比如URL,請求反復(fù)和報文實體的主體部分,A2加入摘要計算主要目的是有助于防止反復(fù),資源或者報文被篡改。 若qop未定義或者auth: A2= 下面定義摘要的計算規(guī)則: 若qop沒有定義: 摘要response=MD5(MD5(A1): 若qop為auth: 摘要response=MD5(MD5(A1): 若qop為auth-int: 摘要response= MD5(MD5(A1): 五,隨機(jī)數(shù)的生成 RFC2617建議采用這個假想的隨機(jī)數(shù)公式: nonce = BASE64(time-stamp MD5(time-stamp “:” ETag “:” private-key))其中: time-stamp是服務(wù)器產(chǎn)生的時間戳或者其他不會重復(fù)的序列號,ETag是與所請求實體有關(guān)的HTTP ETag首部的值,priviate-key是只有服務(wù)器知道的數(shù)據(jù)。 這樣,服務(wù)器就可以收到客戶端的認(rèn)證首部之后重新計算散列部分,如果結(jié)果與那個首部的隨機(jī)數(shù)不符,或者是時間戳的值不夠新,就可以拒絕請求,服務(wù)器可以通過這種方式來限制隨機(jī)數(shù)的有效持續(xù)時間。 包括了ETag可以防止對已經(jīng)更新資源版本的重放請求。注意:在隨機(jī)數(shù)中包含客戶端IP,服務(wù)器好像就可以限制原來獲取此隨機(jī)數(shù)的客戶端重用這個隨 機(jī)數(shù)了,但這會破壞代理集群的工作,使用代理集群時候,來自單個用戶的多條請求通常會經(jīng)過不同的代理進(jìn)行傳輸,而且IP地址欺騙實現(xiàn)起來也不復(fù)雜。 C、傳統(tǒng) C++ #include //設(shè)定插入點 #include //字符處理 #include //定義錯誤碼 #include //浮點數(shù)處理 #include //文件輸入/輸出 #include //參數(shù)化輸入/輸出 #include //數(shù)據(jù)流輸入/輸出 #include //定義各種數(shù)據(jù)類型最值常量 #include //定義本地化函數(shù) #include //定義數(shù)學(xué)函數(shù) #include //定義輸入/輸出函數(shù) #include //定義雜項函數(shù)及內(nèi)存分配函數(shù) #include //字符串處理 #include //基于數(shù)組的輸入/輸出 #include //定義關(guān)于時間的函數(shù) #include //寬字符處理及輸入/輸出 #include //寬字符分類 ////////////////////////////////////////////////////////////////////////// 標(biāo)準(zhǔn) C++(同上的不再注釋) #include //STL 通用算法 #include //STL 位集容器 #include //復(fù)數(shù)類 #include #include //STL 雙端隊列容器 #include //異常處理類 #include #include //STL 定義運算函數(shù)(代替運算符) #include #include //STL 線性列表容器 #include //STL 映射容器 #include #include //基本輸入/輸出支持 #include //輸入/輸出系統(tǒng)使用的前置聲明 #include #include //基本輸入流 #include //基本輸出流 #include //STL 隊列容器 #include //STL 集合容器 #include //基于字符串的流 #include //STL 堆棧容器 #include //標(biāo)準(zhǔn)異常類 #include //底層輸入/輸出支持 #include //字符串類 #include //STL 通用模板類 #include //STL 動態(tài)數(shù)組容器 #include C++ 增加 #include //復(fù)數(shù)處理 #include //浮點環(huán)境 #include #include //布爾環(huán)境 #include //整型環(huán)境 #include //通用類型數(shù)學(xué)宏 HTTP協(xié)議學(xué)習(xí)心得體會 HTTP(HyperText Transfer Protocol) ==================================== 是TCP/IP協(xié)議集中的一個應(yīng)用層協(xié)議,用于定義瀏覽器和Web服務(wù)器之間交換數(shù)據(jù)的過程以及數(shù)據(jù)本身的格式?,F(xiàn)在被廣泛使用的是HTTP1.1,相對于1.0,1.1的最大特點是支持持續(xù)連接。 基于HTTP1.0協(xié)議的客戶機(jī)與服務(wù)器的信息交換過程包括四個步驟:建立連接;發(fā)送請求信息;回送響應(yīng)信息;關(guān)閉連接。 通信過程總是通過瀏覽器發(fā)送請求來啟動的,Web服務(wù)器則是被動地對這些請求作出響應(yīng)。HTTP協(xié)議是無狀態(tài)的。 HTTP1.1與HTTP1.0的比較 ------ HTTP1.0規(guī)定瀏覽器與服務(wù)器只保持短暫的連接,瀏覽器的每次請求都需要與服務(wù)器建立一個TCP連接,服務(wù)器完成請求處理后立即斷開TCP連接。服務(wù)器不跟蹤每個客戶機(jī),也不記錄過去的請求。為了克服HTTP1.0的這個缺陷,HTTP1.1支持持久連接,在一個TCP連接上可以傳送多個HTTP請求和響應(yīng),減少了建立和關(guān)閉連接的消耗和延遲。HTTP1.1還允許客戶端不用等待上一次請求結(jié)果返回,就可以發(fā)送下一次請求,但服務(wù)器端必須按照接受到客戶端請求的先后順序依次回送響應(yīng)結(jié)果,以保證客戶端能夠區(qū)分出每次請求的響應(yīng)內(nèi)容。 HTTP1.1還增加了host請求頭字段,用于明確表示訪問服務(wù)器上的哪個web站點,可以在一個IP地址和端口號上使用不同的主機(jī)名來創(chuàng)建多個虛擬web站點。HTTP1.1還有keep-alive請求頭來支持持續(xù)連接。 HTTP消息的格式 ----------------------- 一個完整的請求消息包括:一個請求行,若干消息頭,以及實體內(nèi)容,其中消息頭和實體內(nèi)容都是可選的。消息頭和實體內(nèi)容之間要用空行隔開。瀏覽器使用GET方式的請求消息可以放松不含實體內(nèi)容的請求消息。只有使用POST, PUT, DELETE方式的請求消息中才可以包含實體內(nèi)容。 Hypertext Transfer Protocol GET / HTTP/1.1rn Request Method: GET Request URI: / Request Version: HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap,application/x-shockwave-flash, application/vnd.ms-excel, application/vn Accept-Language: zh-cnrn UA-CPU: x86rn Accept-Encoding: gzip, deflatern User-Agent: Mozilla/4.0(compatible;MSIE 7.0;Windows NT 6.0;SLCC1;.NET CLR 2.0.50727;.NET CLR 3.0.04506)rn Connection: Keep-Alivern rn 一個完整的響應(yīng)消息包括:一個狀態(tài)行,若干消息頭,以及實體內(nèi)容。同樣,消息頭和實體內(nèi)容都是可選的。消息頭和實體內(nèi)容之間要用空行隔開。消息響應(yīng)的實體內(nèi)容就是網(wǎng)頁文檔的內(nèi)容。 Hypertext Transfer Protocol HTTP/1.1 200 OKrn Request Version: HTTP/1.1 Response Code: 200 Cache-Control: privatern Content-Type: text/html;charset=UTF-8rn Set-Cookie: PREF=ID=7f53f6f0b1511417:NW=1:TM=1205568884:LM=1205568884:S=zHreYqNC-Z3rmOc6;expires=Mon, 15-Mar-2010 08:14:44 GMT;path=/;domain=.google.cnrn Content-Encoding: gziprn Server: gwsrn Transfer-Encoding: chunkedrn Date: Sat, 15 Mar 2008 08:14:44 GMTrn rn HTTP chunked response Data chunk(1025 octets) Chunk size: 1025 octets Data(1025 bytes) HTTP消息頭 ---------------- HTTP請求和響應(yīng)都使用消息頭來描述HTTP消息本身的信息,可以實現(xiàn)HTTP客戶機(jī)與服務(wù)器之間的條件請求和應(yīng)答。 消息頭可以分為:通用消息頭,請求頭,響應(yīng)頭,實體頭四類。 請求行與狀態(tài)行 ----------------------- 請求消息的請求行包括三個部分:請求方式,資源路徑,以及使用的HTTP版本。如:GET / HTTP/1.1rn。 響應(yīng)消息的狀態(tài)行包括三個部分:HTTP協(xié)議的版本號,一個表示成功或者失敗的整數(shù)代碼(狀態(tài)碼)和對狀態(tài)碼進(jìn)行描述的文本信息。如:HTTP/1.1 200 OKrn。 使用GET和POST方式傳遞參數(shù) ------------- 在URL地址后面可以附加一些參數(shù),每個參數(shù)由參數(shù)名和參數(shù)值組成,例如:當(dāng)使用GET方式提交表單內(nèi)容時,瀏覽器將各個表單字段元素及其數(shù)據(jù)按照URL參數(shù)的格式附加在請求行中的資源路徑后面。使用GET方式傳送的數(shù)據(jù)量有限制,一般在1KB以下。 當(dāng)使用POST方式提交表單內(nèi)容時,瀏覽器將個表單字段元素及其數(shù)據(jù)作為HTTP消息的實體內(nèi)容發(fā)送給服務(wù)器。因此數(shù)據(jù)量可以比GET方式大的多。使用POST方式時,還必須將Content-Type消息頭設(shè)置為“application/x-www-form-urlencoded”,將Content-length消息頭設(shè)置為實體內(nèi)容的長度。 響應(yīng)狀態(tài)碼 --------------- 1.100~199: 成功接受請求,要求客戶端繼續(xù)提交下一次請求才能完成整個處理過程。 2.200~299: 成功接受請求并已完成整個處理過程。 3.300~399: 為完成請求,客戶端需要進(jìn)一步細(xì)化請求。 4.400~499: 客戶端的請求有錯誤。 5.500~599: 服務(wù)器段出現(xiàn)錯誤。 通用信息頭 ============== 即能用于請求消息,也能用于響應(yīng)消息,包括一些與被傳輸?shù)膶嶓w內(nèi)容沒有關(guān)系的常用消息頭字段。 1.Cache-Control 2.Connection 3.Date 4.Pragma 5.Trailer 6.Transfer-Encoding 7.Upgrade 8.Via 9.Warning Cache-Control -------------------- 如果位于請求消息頭,用于通知位于客戶機(jī)和服務(wù)之間的代理服務(wù)器如何使用已緩存的頁面,可以取值為:no-cache, no-store, max-age, max-stale, min-fresh, no-transform, only-if-cached等。 如果位于響應(yīng)消息頭,用于通知客戶機(jī)和代理服務(wù)器如何緩存該頁面,可以取值為:public, private, no-cache, no-store, no-transform, must-revalidate, proxy-revalidate, max-age, s-maxage等。 Connection --------------- 用于指定處理完本次請求/響應(yīng)后,客戶端與服務(wù)器是否還要繼續(xù)保持連接。如果為Keep-Alive,則保持連接,如果為close,則關(guān)閉。HTTP1.1默認(rèn)采用持久連接。 Date --------- 表示HTTP消息產(chǎn)生的當(dāng)前時間。服務(wù)器回送的正常響應(yīng)消息中,應(yīng)該總是設(shè)置Date頭字段。如果客戶機(jī)發(fā)送的請求消息中包含有實體內(nèi)容,也要設(shè)置Date。 Pragma ------------ 只能固定為no-cache.Trailer ----------- 一些頭字段可以放置在整個HTTP消息的尾部。 Transfer-Encoding --------------------- 指定傳輸編碼方式,目前標(biāo)準(zhǔn)的設(shè)置值只有chunked,用于把整個消息分成一連串的分段后進(jìn)行傳輸。 Upgrade ------------ 允許客戶機(jī)指定它所支持并希望將當(dāng)前協(xié)議切換到的通信協(xié)議。 Via ----- 用于指定HTTP消息所途徑的中介代理服務(wù)器名稱和所使用的協(xié)議。 請求頭 ========= 客戶端可以接受的數(shù)據(jù)類型,壓縮方法,語言,以及發(fā)出請求的超鏈接所屬頁面的URL地址等信息。Accept:指出客戶端程序能夠處理的MIME類型。 Accept-Charset:用于指出客戶端程序可以使用的字符集。 Accept-Encoding:客戶機(jī)能夠進(jìn)行解碼的數(shù)據(jù)編碼方式。 Accept-Language:指定客戶機(jī)期望服務(wù)器返回哪個國家語言的文檔。 Authorization:兩種認(rèn)證方式BASIC,和DIGEST.Except: From: Host: 指定資源所在的主機(jī)號和端口號。HTTP1.1中每個請求消息中都必須包含Host請求字段。If-Match: If-Modified-Since: If-None-Match: If-Range If-Unmodified-Since Max-Forwards: Proxy-Authorization: Range: Referer: 當(dāng)單擊另一個網(wǎng)頁上的超鏈接時發(fā)出的請求在Referer字段中指定URL。 TE: User-Agent: 響應(yīng)頭 ========== Accept-Range, Age, Etag,Location: 用于通知客戶機(jī)應(yīng)當(dāng)?shù)侥膫€新的地址去獲取文檔。狀態(tài)碼為300~399的響應(yīng)消息都應(yīng)該使用Location字段將新的文檔地址告訴客戶機(jī),以便客戶機(jī)自動重新連接到新地址并檢索新文檔。使用Location頭的HTTP消息不應(yīng)該有實體內(nèi)容。所以,HTTP消息頭中不能同時出現(xiàn)Location和Content-Type這兩個頭字段。 Proxy-Authenticate,Retry-After, Server, Vary, WWW-Authenticate。 實體頭 ======== 是實體內(nèi)容的元信息,描述了實體內(nèi)容的屬性,包括實體信息類型、長度、壓縮方法、最后一次修改時間、數(shù)據(jù)有效期等。 Allow: 指定客戶端請求的資源所支持的請求方法(如GET,POST等)。 Content-Encoding: 指定實體內(nèi)容的壓縮編碼方式。 Content-Language: Content-Length: 用于表示實體內(nèi)容的長度(字節(jié)數(shù)),瀏覽器與Web服務(wù)器之間使用持久連接時,這個字段在非Chunked傳輸編碼的響應(yīng)消息中是必不可少的。 Content-Location: 指定響應(yīng)消息中所封裝的實體內(nèi)容的實際位置路徑。 Content-MD5, Content-Range, Content-Type Expires: 指定當(dāng)前文檔應(yīng)該在什么時候被認(rèn)為過期,瀏覽器到哪個時候以后不能再繼續(xù)使用本地緩存,而是在有需要時應(yīng)該像服務(wù)器發(fā)出新的請求訪問。 Last-Modified:文檔的最后更改時間。 擴(kuò)展頭 ======== 現(xiàn)在流行的瀏覽器實際上都支持Cookie,Set-Cookie,Refresh和Content-Disposition等幾個常用的擴(kuò)展頭字段。 Refresh: 告訴瀏覽器多少秒后自動刷新頁面。 51單片機(jī)C語言學(xué)習(xí)筆記7:關(guān)于.c文件和.h文件 2009-09-15 09:55:43| 分類:| 標(biāo)簽: |舉報 |字號大中小 訂閱 1)h文件作用方便開發(fā):包含一些文件需要的共同的常量,結(jié)構(gòu),類型定義,函數(shù),變量申明;提供接口:對一個軟件包來說可以提供一個給外界的接口(例如: stdio.h)。 2)h文件里應(yīng)該有什么 常量,結(jié)構(gòu),類型定義,函數(shù),變量申明。 3)h文件不應(yīng)該有什么 變量定義, 函數(shù)定義。 4)extern問題 對于變量需要extern; 對于函數(shù)不需要因為函數(shù)的缺省狀態(tài)是extern的.如果一個函數(shù)要改變?yōu)橹辉谖募?nèi)可見,加static。 5)include包含問題 雖然申明和類型定義可以重復(fù),不過推薦使用條件編譯。 #ifndef _FILENAME_H,#define _FILENAME_H …… #endif 6)應(yīng)該在那兒包含h文件 在需要的地方.比如某個提供接口的h文件僅僅被1.c文件需要,那么就在1.c文件里包含。編寫的程序一般會有.H文件和相對應(yīng)的.C文件,.H文件是聲明所用,.C文件是其函數(shù)實現(xiàn)部分。在調(diào)用時只要包含.H文件即可,我們沒有聽說過#include “delay.c”這類的程序,同時也不提倡使用這個形 式。 在delay.h文件中: //對調(diào)用的函數(shù)聲明 #ifndef __DELAY_H__ #define __DELAY_H__ extern void Delayms(unsigned int n); #endif 在delay.c文件中: //函數(shù)實現(xiàn)部分 #include //for crystal 11.0592M void Delayms(unsigned int n) { unsigned int i,j; for(j=n;j>0;j--) for(i=112;i>0;i--); } 在主程序main.c中 #include …… 上述方法仍然要求每建立一個工程就需要把對應(yīng)的頭文件復(fù)制到工程的文件夾里,這樣看來仍然是比較麻煩的,這時還有另外一中方法就是將做好的頭文件放在一個文件夾中,然后將這個文件夾整體拷貝到..KEILC51INC下面,以后若需要使用某個頭文件,就如使用KEIL自帶的頭文件一樣方便了,在主函 數(shù)mani()之前有一句#include 就可以在main()中使用其中的函數(shù)了。 參考資料: 1)h文件里變量(函數(shù))申明用不用extern 2).c文件和.h文件的概念與聯(lián)系 3)過馬路,左右看 4).c 和.h文件的不同 5)C51包含頭文件方法 防止頭文件重復(fù)包含的方法 第一條預(yù)處理命令是說,如果MAXMIN_H不為真,說明此文件沒被包含過,此命令后面的源代碼有效(相當(dāng)于:‘如果大門沒關(guān),請您進(jìn)來’); 第二條預(yù)處理命令把MAXMIN_H置為真(相當(dāng)于請您把門鎖插上,不讓第二個人進(jìn)來)。最后一條預(yù)處理命令是為了標(biāo)出接受上述處理的源程序的范圍(相當(dāng)于您已經(jīng)走到了后門)。假定有以下幾個頭文件及其包含關(guān)系為: File1.h,file2.h,file3.h,file4.h,file5.h,main.cpp 那么:file3.h包含file1.h,file2.h,file4.h包含file1.h,file2.h,file5.h包含file3.h,file4.h。就會導(dǎo)致在file5中對file1和file2的反復(fù)包含,編譯時就會報錯。 解決方法1: 1:應(yīng)用#ifndef #define #endif 即每個文件在定義時都寫成以下情勢(以file1.h為例): #ifndef H_FILE1 #define H_FILE1 #include #include …..#endif File3.h: #ifndef H_FILE3 #define H_FILE3 #include #include #inlcude”file1.h”#include”file2.h”…..#endif 方法二:在每個文件的頭部定義:#pragmaonce(用于解釋本文件中的內(nèi)容只應(yīng)用一次)例:fiel1.h: #pragmaonce#include #pragmaonce#include 玻璃水配方 http://com.mysvw.com/viewthread.php?tid=232464 懂得開車,就應(yīng)懂用車。然而,有懶惰的車主甚至許久才會洗一次車,當(dāng)好不容易把愛車拿去維修廠或4S店做一次保養(yǎng)時,底盤、輪胎、剎車系統(tǒng)等項目往往是重點檢查項目。在日常的“三油(機(jī)油、變速箱油、剎車油)、三水(水箱冷卻水、電瓶水及雨刮水)”的保養(yǎng)中,記者發(fā)現(xiàn),不少粗心的車主(特別是新手司機(jī))最容易忽視對前擋風(fēng)玻璃的關(guān)注。 你是否忽視了愛車的“透明”性 近日,記者與一位朋友駕車同行時,這位朋友在行車過程中,想用玻璃水清洗一下灰塵密布和有蟲尸的前擋風(fēng)玻璃,結(jié)果按了半天雨刮器噴水按鈕,才突然想起忘記添加玻璃水,于是只好一路“視線模糊”的行駛在路上。相信很多的車主都會有這樣的經(jīng)歷和體會,特別是行車時如果看見擋風(fēng)玻璃上沾染污物或蟲尸,視覺立刻就會感到不舒服。廣州本田一位4S店的維修技師黃師傅告訴記者,添加“玻璃水”是80%車主在日常保養(yǎng)中最容易忽視的細(xì)節(jié),前擋風(fēng)玻璃的保養(yǎng)更往往被車主遺忘。 那么,所謂玻璃水是什么?汽車擋風(fēng)玻璃水俗稱玻璃水(即車窗玻璃清洗液、雨刮水),是保養(yǎng)愛車最大的消耗品之一。一般來說,我國用品零售市場上的玻璃水可分三種:一種夏季常用的,在清洗液里增加了除蟲膠成分,可以快速清除撞在擋風(fēng)玻璃上的飛蟲殘留物;一種專為冬季使用的防凍型玻璃清洗液,保證在外界氣溫低于零下20℃時,依舊不會結(jié)冰凍壞汽車設(shè)施;一種是特效防凍型,保證在零下40℃時依舊不結(jié)冰,適合我國最北部的嚴(yán)寒地區(qū)使用。在廣州這種南方地區(qū),使用第一種玻璃水即可。 當(dāng)您感覺車的前擋風(fēng)玻璃透明度差了,這時候噴一噴玻璃水,就能夠給你一個“明朗”的視野。特別是在夜間行車時,玻璃灰塵會散射光線,這時候就需要噴一噴玻璃水,讓前擋風(fēng)玻璃保持在最佳透明狀態(tài)。此外,在灰塵較多的環(huán)境,以及在雨天跑高速路時,玻璃水的消耗會非常快。 玻璃水其實不簡單 有的車主認(rèn)為清洗前擋風(fēng)玻璃其實很簡單,用不著小題大做。師傅介紹,有車主會放棄購買一瓶10~20元左右的專用玻璃水,選擇“偏方”——自制的玻璃水。他們將洗潔精、洗滌劑、洗衣粉等兌一點水來替代專用玻璃水,認(rèn)為又便宜又省心;也有的車主直接用清水替代玻璃水。黃師傅指出這些做法存在著一定的隱患。 用水兌洗衣粉:洗衣粉水里會有一些沉淀物,時間長了,不僅會腐蝕橡膠管,而且會堵塞噴水口,嚴(yán)重情況下會損壞到電機(jī)。一般洗滌劑都呈堿性,對橡膠會有一定的腐蝕性,會加速催化雨刮器膠條的硬化,硬化的膠條刮擦擋風(fēng)玻璃時,會加速擋風(fēng)玻璃表面被刮毛、刮花。如果重新更換雨刮器,付出的費用將是玻璃水的幾十倍價格。 用水代替玻璃水:這個風(fēng)險相對小一些。但需要留意的是,普通的自來水同樣含有較多雜質(zhì),時間長了,雜質(zhì)會依附在橡膠管內(nèi),影響正常的噴水。長期使用可能會使玻璃表面與雨刮器之間摩擦力加大,玻璃產(chǎn)生劃痕。師傅表示,清水只能簡單地清洗灰塵,對車窗上附著的臟污、蟲尸,并沒有徹底清洗的能力。 小貼士 DIY加玻璃水并不難 為愛車添加玻璃水,最省事的辦法是委托洗車店或者維修廠幫忙添加。算一下賬,讓美容店加一次約10元左右,所支付的費用肯定比自己買一瓶玻璃水DIY添加來得貴些。黃師傅告訴記者,如果專門為添加玻璃水而跑一趟4S店或者美容店其實不值得,添加玻璃水的活兒,車主完全可以DIY自行解決。車主只需去市場上用10~20元購買一瓶車用玻璃水,按照指示加入即可,并沒有太多“技術(shù)含量”。 提示1:第一步要稀釋。 一般購買回來的玻璃水均需要稀釋使用,只需按照說明書上的指示操作即可。 提示2:注意玻璃水容量。 汽車的玻璃水容量大約是1.5L左右,因此選擇稀釋玻璃水的容器用1.25L到1.5L的就可以了。可以用礦泉水瓶替代。 提示3:不要加太滿。 自己添加玻璃水的時候,要注意不要加過滿,如果容器口有一些泡沫,不需擔(dān)心,并不影響使用。 提示4:玻璃水也有冬夏之分。 一般來說,在南方地區(qū)使用增加了除蟲膠成分的玻璃水即可。如果愛車需要在北方過冬,則需要使用防凍型玻璃水。這一點,習(xí)慣了南方氣候的司機(jī)去到北方時常會忽略。 汽車用玻璃水是什么成分的?看論壇中有幾種配方,成分也就是防凍液+清潔劑+水+酒精等: 1、取大可了瓶一個。 2、家中沒人愛喝的白酒(高中低度均可,五糧液、茅臺更好)。 3、質(zhì)量好點的餐洗凈(不傷手的那種,連手都不傷,就不怕腐蝕車了,市場的玻璃清潔劑就怕這點不過關(guān)) 4、純凈水 5、一滴藍(lán)墨水,著色用,可省。步驟 1、將白酒半瓶到入可了瓶。 2、加半勺餐洗凈 3、加入純凈水,不要太滿。 4、搖均勻即可。實驗 本品放入冰箱內(nèi)-20度,兩小時左右,略有結(jié)冰現(xiàn)象。使用 1、在-10度左右,夜晚室外停放15小時,沒有凍。 2、洗玻璃時由于有酒精,揮發(fā)的很快。洗后風(fēng)擋玻璃非常干凈,還有一種餐洗凈的香味和淡淡的酒香。 3、如果酒后駕車被查,沖JC噴一下,說不定可蒙混過關(guān)!! 特別要注意的是乙醇(酒精)的加量并非越多越好。大家可參考《中學(xué)教師化學(xué)手冊》上的這個比例,結(jié)合當(dāng)?shù)氐淖畹蜌鉁貋砼渲谩?/p> 乙醇添加量 溶液冰點 6% -2.0℃ 14% -5.0℃ 17% -6.1℃ 20.2% -7.5℃,24.8% -10.6℃ 27% -12.2℃ 注意:本文所提到的百分比濃度全部為體積分?jǐn)?shù)濃度。 附 搜羅的一些配方,給同學(xué)門參考: 購買普通玻璃水,效果達(dá)不到標(biāo)準(zhǔn),還可能會造成噴頭堵塞。買高級的,花費會較高。綜上,我認(rèn)為DIY玻璃水,可以讓我們得到實惠!并且效果也可以很好!A:春天,風(fēng)沙大,雨多,所以玻璃水主要功效就是清潔風(fēng)擋。準(zhǔn)備2.5升可樂瓶一個,一定要沖洗干凈?。P(guān)鍵是去掉糖分?。?/p> 純凈水2升,醫(yī)用95%酒精250ML(藥店有售)洗滌劑1-2可樂瓶蓋(洗滌劑質(zhì)量要好)充分互溶后可直接使用。加洗滌劑主要是去沙土,應(yīng)為洗滌劑的泡沫能很快的將泥土去掉。酒精能加速水分蒸發(fā),使玻璃迅速清潔。加入以上這些,可能不滿,可直接加1升左右純凈水。 B:夏天,秋天。有雨,不一定很臟,但是昆蟲多打在風(fēng)當(dāng)時,清水不容易將其清除,因為蟲膠也比較難處理。所以要加入更多的溶劑。 同樣,2.5升可樂瓶,2升純凈水,95%醫(yī)用酒精500ML,洗滌劑1瓶蓋足矣!酒精這種有機(jī)溶劑還是很不錯的!去蟲膠的效果很好。要是在市區(qū),可以將不滿的水壺加純凈水加滿,但是高速不建議降低濃度,影響效果! C:冬天,雖然已經(jīng)過去,但還是說說。深有體會的是,所在城市冬季可以達(dá)到-30℃甚至更低,有不少同學(xué)直接加二鍋頭,基本可以滿足需要,但是其酒精含量的高低直接影響塑料件的老化程度,所以還是改善下好。20%質(zhì)量的95%酒精,80%質(zhì)量的水,冰點基本在-10℃左右,初冬沒問題。20-30%的酒精,60%的水,冰點也只在-15℃,也不是很理想,40-50%的酒精,50-60%的水,冰點可以達(dá)到-25℃不結(jié)冰,基本滿足冬季的需要,因為冬天基本不太用水去清潔玻璃。關(guān)鍵的一點,冬天一定不能加滿玻璃水壺!上蓋的通氣孔極易凍住,而結(jié)冰膨脹的液體會直接把水壺漲裂。所以冬天用2.5L可樂瓶配的溶液一瓶,足夠!第二篇:頭文件總結(jié)
第三篇:HTTP協(xié)議學(xué)習(xí)心得體會
第四篇:51頭文件書寫而方法
第五篇:玻璃水配方 http范文