訪問http
1. 電腦http訪問不正常怎麼辦
1. 電腦inter無法訪問怎麼辦
1、首先,試著用另一台電腦連接網路,上一台電腦可能網卡出了故障。
如果也不能,檢查一下本地網路是否斷開。如果本地網路已斷開,則問題出在路由路上,重啟一下或者更換一個新的路由路即可。
2、其次,看看DSL數據機的報錯燈是否亮著,如果是,關掉解調器並重啟,或者你也需要關掉電腦,並拔掉各種設備,等上三十秒後,把它們重新連接至電腦然後再啟動。 3、採用上述方法後依然不奏效,試試在Windows系統里重新設置網路連接。
在 Windows XP按照下述步驟,單擊開始,運行,輸入CMD並回車,然後輸入ipconfig /renew並回車。或者你也可以右鍵單擊系統托盤里的網路連接圖標,然後選擇修復選項。
不過我發現前者更為有效。 4、若經過此番折騰你的電腦依然連不上網,並且通常是通過無線適配器上網的,那麼試著通過 網線直接連接至路由器。
還是不行的話就別管路由器了,看看能否通過解調器直接連接到其它電腦,這樣有助於進一步查明問題的根源。此外仔細地檢查所有的線纜,並 且,如果可能的話全部更換它們。
5、給寬頻提供商打個電話吧,讓檢查一下周邊地區是否存在同樣問題。 (別忘了留意那些顯而易見之處:如果你通過有線寬頻上網,有些服務提供商能夠遠程測試網路設 備;有時候ISP會向數據機發送重置信號。
但到了此時很有可能碰上網路本身的故障,這種情況通常都是暫時性的,不過報告故障並進行投訴——不斷 地投訴——通常會幫助ISP更高效率地解決故障。 避免問題重現:購買一些備用的網路連接設備——找找鄰近朋友的Wi-Fi信號並徵求許可而使用,或者購買筆記本用的無線數據傳輸卡。
甚至擁有一個ISP的拔號上網號碼,在緊要關頭也能登錄互聯網。
2. 電腦無法訪問網頁怎麼辦
如電腦無法瀏覽網頁,你可根據以下情況進行排障:
1、寬頻未連接。重新連接寬頻。
2、路由器故障。拆除路由器後,進行寬頻連接試用。
3、偶發性故障,如ADSL斷流,電腦內存數據溢出等。重啟電腦、modem試用。
4、瀏覽器故障,應用不恰當的代理伺服器。卸載一切瀏覽器插件,恢復IE瀏覽器默認設置試用。去掉代理伺服器設置。重裝瀏覽器程序。
5、IP地址、DNS設置設置不當。一般家庭用戶IP地址設置成自動獲取,重設DNS伺服器地址。
6、殺毒軟體防火牆設置錯誤。臨時關閉殺毒軟體防火牆試用,如果恢復正常,檢查被禁用項目,放行即可。
7、電腦中毒或者被攻擊。升級殺毒軟體至最新版本,打好系統補丁,在安全模式下查殺病毒,如果病毒殺不掉需要重做系統。
8、TCP/IP 出錯。點擊開始--運行--輸入CMD,在Dos提示符下輸入命令「ping 127.0.0.1」(本機循環地址),如果顯示Reply from 127.0.0.1: bytes=?? time=?ms TTL=???,則表示TCP/IP協議運行正常,若顯示Request timed out(超時),重裝該協議。ping本機IP地址。使用ipconfig查看本機IP地址,若通則表明網路適配器工作正常,否則可能是網卡故障。WIN98、2000可用重裝協議。XP、vista、win7需要重做系統。
9、系統文件丟失、操作系統故障。可分析何種故障,可用系統安裝盤恢復,或者重做系統。
10、新裝軟體之間有沖突。最近安裝的程序分析可能引起沖突的軟體,卸載試用。
11、不同的撥號軟體相互干擾。win98 、2000系統只用一個撥號軟體。XP、vista、win7盡量使用自帶撥號程序。
12、多網卡沖突,或者網卡工作不正常。ping本機IP地址。使用ipconfig查看本機IP地址,若通則表明網路適配器工作正常,否則可能是網卡壞。禁用不用的網卡,檢查網卡驅動是否與新裝軟體、新裝驅動有沖突,咨詢客戶是否添加新硬體如果用請拆除臨時新硬體使用。重啟電腦網卡,更改網卡工作速率試用。
13、寬頻信號,樓宇交換機出現故障。撥打寬頻所屬運營商客服熱線進行故障申告。
3. 電腦無法正常訪問網頁,網路存在異常
【一】原因:
網卡驅動過舊或者損壞
瀏覽器設置代理伺服器選項,所以出現打不開網頁情況
系統垃圾和網頁痕跡較多,沒有做定期清理
可能是DNS伺服器出現故障
網卡硬體有毛病
【二】嘗試以下操作:
重裝一遍網卡驅動
下載殺毒軟體,清理電腦垃圾和瀏覽器垃圾文件
重裝系統,但此方法有風險
打開開始---附件---以管理員身份運行CMD;使用ipconfig /flushdns命令重置DNS。
4. 電腦不能正常的訪問網站
1、感染了病毒所致 這種情況往往表現在打開IE時,在IE界面的左下框里提示:正在打開網頁,但老半天沒響應。
在任務管理器里查看進程,(進入方法,把滑鼠放在任務欄上,按右鍵—任務管理器—進程)看看CPU的佔用率如何,如果是100%,可以肯定,是感染了病毒。 2、與設置代理伺服器有關 有些設置了代理伺服器(控制面板--Inter選項—連接—區域網設置—為LAN使用代理伺服器),設置代理伺服器是不影響QQ聯網的,因為QQ用的是4000埠,而訪問互聯網使用的是80或8080埠。
這就是為什麼QQ能上,而網頁不能打開的原因。而代理伺服器一般不是很穩定,有時侯能上,有時候不能上。
如果有這樣設置的,請把代理取消就可以了。 3、DNS伺服器解釋出錯 所謂DNS,即域名伺服器(Domain Name Server),它把域名轉換成計算機能夠識別的IP地址,如果DNS伺服器出錯,則無法進行域名解釋,自然不能上網了。
可把路由器關一會再開,或者重新設置路由器。或者是網卡無法自動搜尋到DNS的伺服器地址,可以嘗試用指定的DNS伺服器地址。
在網路的屬性里進行,(控制面板—網路和拔號連接—本地連接—右鍵屬性—TCP/IP協議—屬性—使用下面的DNS伺服器地址)。 更新網卡的驅動程序或更換網卡也不失為一個思路。
4、系統文件丟失導致IE不能正常啟動 這種現象頗為常見,由於: a)系統的不穩定 表現為死機頻繁、經常莫名重啟、非法關機造成系統文件丟失; b)軟硬體的沖突 常表現為安裝了某些程序引起網卡驅動的沖突或與IE的沖突。自從INTEL推出超線程CPU後,有一個突出的問題是XP SP1下的IE6與超線程產生沖突; c)病毒的侵擾 導致系統文件損壞或丟失。
5、IE損壞 以上方法若果都不奏效,有可能是IE的內核損壞,雖經系統修復,亦無法彌補,那麼重裝IE就是最好的方法了。 如果是2K+IE6.0或XP(自帶的IE就是6.0的)的系統,重新IE有點麻煩,有兩種方法: 1)打開注冊表,展開HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed ponents\{ 89820200-ECBD-11cf-8B85-00AA005B4383 },將IsInstalled的DWORD的值改為0即可; 2)放入XP安裝光碟,在開始—運行里輸入「rundll32.exe setupapi,InstallHinfSection DefaultInstall 132%windir%\Inf\ie.inf」 註:重裝IE並不一定就能解決問題,僅是一個處理問題的思路而已。
5. 域名無法正常訪問網頁怎麼辦
dns域名解析錯誤的原因有不少,但主要由以下原因造成的,大家可以使用排除法。
方法1.電腦中病毒
如果電腦中病毒一般是惡意軟體篡改用戶主頁,劫持電腦dns等,造成電腦打開知名網站會跳轉到其它惡意網站,或者乾脆網站都打不開。
dns錯誤怎麼辦
解決辦法:使用殺毒軟體對電腦先進行全盤掃描,查看電腦是否中病毒,是否有殺毒軟體相關提示。如果殺毒後網頁可以打開,多數是因為病毒原因所導致的。
方法2.網站故障
當發現打開某些網站會出現dns錯誤,但又有些大站打開一切正常,這種情況多數由於網站域名伺服器故障或網站伺服器有故障。另外也有一種情況是網路服務商(如電信的網路服務伺服器出現故障,也會出現類似情況,主要由於線路堵塞導致,常見某個地方區域網站無法訪問,具有區域性,一般這樣的情況很少發生)。
解決辦法:由於是網站本身的問題,所以我們一般也無法解決,只有等到網站恢復正常才可以訪問。
方法3.網路故障
網路故障是比較常見的打引起DNS錯誤的原因,經常由於沒網路打開網頁就有類似的提示。
解決辦法:修復網路問題即可。
方法4.電腦dns設置錯誤
雖然我們多數朋友上網都不會去設置dns,一般都是採用自動獲取,不過不少區域網都需要固定IP地址,選擇固定IP地址,我們就需要輸入dns地址了,而dns輸入錯誤就會導致網頁打不開,原因上面有介紹,相信大家都會明白,如果dns設置錯誤我們會發現: QQ可以上但網頁打不開。
解決辦法:進入「網上鄰居」-- 「本地連接」上右鍵選擇屬性,在"連接使用下列項目"中,尋找(TCP/IP)選項 雙擊,在下方會有DNS選項,您這中情況可以嘗試自動獲取DNS 由於各地區的DNS通常會有差別,如果自動獲取不行的話,可以聯系當地網路管理部門查詢DNS 以便填寫,也可以在網上搜索下本地網路服務商的dns IP地址。
將以上的DNS 伺服器地址填寫正確一般都可以打開網頁了,一般我們電腦都是選擇自動獲取路由器分配的IP與自動獲取網路服務商的DNS,但由於需要固定IP來解決電腦開機本地連接啟動很慢等問題,也就需要設置dns了,地址建議朋友最好詢問網路商獲取,一般網上查找也是可以的。
2. 如何利用socket進行HTTP訪問
先對URL進行分析,提取出域名部分和請求URI部分,然後調用解析域名的函數解析域名得到Web伺服器的IP地址。然後建立與那個IP的socket連接,並發送HTTP請求頭部,接著接收返回的HTTP響應頭部和HTTP響應主體(對於網頁來說就是HTML),響應頭部與響應主體之間是以一個空禪埋睜行來分割的,需要代碼進行判斷。
編寫完成這些任務的代碼需要知道液棚HTTP協議中對HTTP請求頭部和響應頭部各個欄位的規定,還有GET和POST方法的規賀歲定,HTTP協議官方文檔比較難讀,建議你看相關的書籍,比如很易讀的圖解HTTP。
3. 使用https訪問http/https通信協議,需要哪些配置文件
項目里需要訪問其他介面,通過http/https協議。我們一般是用HttpClient類來實現具體的http/https協議介面的調用。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=http://www.xxx.com/xxx;
// Init a HttpMethod
HttpMethod get = new GetMethod(url);
get.setDoAuthentication(true);
get.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(1, false));
// Call http interface
try {
client.executeMethod(get);
// Handle the response from http interface
InputStream in = get.getResponseBodyAsStream();
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
} finally {
// Release the http connection
get.releaseConnection();
}
以上代碼在通過普通的http協議是沒有問題的,但如果是https協議的話,就會有證書文件的要求了。一般情況下,是這樣去做的。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=https://www.xxx.com/xxx;
if (url.startsWith("https:")) {
System.setProperty("javax.net.ssl.trustStore", "/.sis.cer");
System.setProperty("javax.net.ssl.trustStorePassword", "public");
}
於是,這里就需要事先生成一個.sis.cer的文件,生成這個文件的方法一般是先通過瀏覽器訪問https://,導出證書文件,再用JAVA keytool command 生成證書
# $JAVA_HOME/bin/keytool -import -file sis.cer -keystore .sis.cer
但這樣做,一比較麻煩,二來證書也有有效期,過了有效期之後,又需要重新生成一次證書。如果能夠避開生成證書文件的方式來使用https的話,就比較好了。
還好,在最近的項目里,我們終於找到了方法。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=https://www.xxx.com/xxx;
if (url.startsWith("https:")) {
this.supportSSL(url, client);
}
用到了supportSSL(url, client)這個方法,看看這個方法是如何實現的。
private void supportSSL(String url, HttpClient client) {
if(StringUtils.isBlank(url)) {
return;
}
String siteUrl = StringUtils.lowerCase(url);
if (!(siteUrl.startsWith("https"))) {
return;
}
try {
setSSLProtocol(siteUrl, client);
} catch (Exception e) {
logger.error("setProtocol error ", e);
}
Security.setProperty( "ssl.SocketFactory.provider",
"com.tool.util.DummySSLSocketFactory");
}
private static void setSSLProtocol(String strUrl, HttpClient client) throws Exception {
URL url = new URL(strUrl);
String host = url.getHost();
int port = url.getPort();
if (port <= 0) {
port = 443;
}
ProtocolSocketFactory factory = new SSLSocketFactory();
Protocol authhttps = new Protocol("https", factory, port);
Protocol.registerProtocol("https", authhttps);
// set https protocol
client.getHostConfiguration().setHost(host, port, authhttps);
}
在supportSSL方法里,調用了Security.setProperty( "ssl.SocketFactory.provider",
"com.tool.util.DummySSLSocketFactory");
那麼這個com.tool.util.DummySSLSocketFactory是這樣的:
訪問https 資源時,讓httpclient接受所有ssl證書,在weblogic等容器中很有用
代碼如下:
1. import java.io.IOException;
2. import java.net.InetAddress;
3. import java.net.InetSocketAddress;
4. import java.net.Socket;
5. import java.net.SocketAddress;
6. import java.net.UnknownHostException;
7. import java.security.KeyManagementException;
8. import java.security.NoSuchAlgorithmException;
9. import java.security.cert.CertificateException;
10. import java.security.cert.X509Certificate;
11.
12. import javax.net.SocketFactory;
13. import javax.net.ssl.SSLContext;
14. import javax.net.ssl.TrustManager;
15. import javax.net.ssl.X509TrustManager;
16.
17. import org.apache.commons.httpclient.ConnectTimeoutException;
18. import org.apache.commons.httpclient.params.HttpConnectionParams;
19. import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
20.
21. public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
22. static{
23. System.out.println(">>>>in MySecureProtocolSocketFactory>>");
24. }
25. private SSLContext sslcontext = null;
26.
27. private SSLContext createSSLContext() {
28. SSLContext sslcontext=null;
29. try {
30. sslcontext = SSLContext.getInstance("SSL");
31. sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
32. } catch (NoSuchAlgorithmException e) {
33. e.printStackTrace();
34. } catch (KeyManagementException e) {
35. e.printStackTrace();
36. }
37. return sslcontext;
38. }
39.
40. private SSLContext getSSLContext() {
41. if (this.sslcontext == null) {
42. this.sslcontext = createSSLContext();
43. }
44. return this.sslcontext;
45. }
46.
47. public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
48. throws IOException, UnknownHostException {
49. return getSSLContext().getSocketFactory().createSocket(
50. socket,
51. host,
52. port,
53. autoClose
54. );
55. }
56.
57. public Socket createSocket(String host, int port) throws IOException,
58. UnknownHostException {
59. return getSSLContext().getSocketFactory().createSocket(
60. host,
61. port
62. );
63. }
64.
65.
66. public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
67. throws IOException, UnknownHostException {
68. return getSSLContext().getSocketFactory().createSocket(host, port, clientHost, clientPort);
69. }
70.
71. public Socket createSocket(String host, int port, InetAddress localAddress,
72. int localPort, HttpConnectionParams params) throws IOException,
73. UnknownHostException, ConnectTimeoutException {
74. if (params == null) {
75. throw new IllegalArgumentException("Parameters may not be null");
76. }
77. int timeout = params.getConnectionTimeout();
78. SocketFactory socketfactory = getSSLContext().getSocketFactory();
79. if (timeout == 0) {
80. return socketfactory.createSocket(host, port, localAddress, localPort);
81. } else {
82. Socket socket = socketfactory.createSocket();
83. SocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
84. SocketAddress remoteaddr = new InetSocketAddress(host, port);
85. socket.bind(localaddr);
86. socket.connect(remoteaddr, timeout);
87. return socket;
88. }
89. }
90.
91. //自定義私有類
92. private static class TrustAnyTrustManager implements X509TrustManager {
93.
94. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
95. }
96.
97. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
98. }
99.
100. public X509Certificate[] getAcceptedIssuers() {
101. return new X509Certificate[]{};
102. }
103. }
104.
105. }
public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
static{
System.out.println(">>>>in MySecureProtocolSocketFactory>>");
}
private SSLContext sslcontext = null;
private SSLContext createSSLContext() {
SSLContext sslcontext=null;
try {
sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return sslcontext;
}
private SSLContext getSSLContext() {
if (this.sslcontext == null) {
this.sslcontext = createSSLContext();
}
return this.sslcontext;
}
public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
socket,
host,
port,
autoClose
);
}
public Socket createSocket(String host, int port) throws IOException,
UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
host,
port
然後按如下方式使用HttpClient
Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
Protocol.registerProtocol("https", myhttps);
HttpClient httpclient=new HttpClient();
4. 瀏覽器採用http協議訪問網頁的工作過程是什麼
過程如下:
用戶在瀏覽器中輸入網址,計算機提取出域名;
瀏覽器通過DNS查找域名對應的IP地址,獲得IP地址後;
嘗試與對應的伺服器建立TCP連接,連接成功之後;
將用戶的請求裝入http數據包,通過建立的tcp連接發送給伺服器,等待數據返回;
如果數據成功返回,比如說,返回的是一個html頁面,則渲染這個頁面(可以理解為顯示出來);
渲染的過程中會遇到一些數據標記,比如圖片,這時候就查找本地緩存,如果緩存里有且沒過期,就使用本地緩存的數據,否則就向伺服器發送請求。
5. java 訪問http
你的代碼由問題吧。。。。。
1.創建連接:
URL url = new URL("http://www..com");
2.打開連接,獲取連接輸入流。
InputStream in = url.openConnection().getInputStream();
3.解析流。
System.out.println(IOUtils.toString(in));//輸出訪問地址內容。。。。
6. 訪問http,過程是怎樣的,中間用了哪些協議csdn
TCP:HTTP,FTP,SMTP,TENET,
POP3
,Finger,NNTP,
IMAP4
,
UDP:友前BOOTP,DHCP,NTP,TFTP,SNMP
DNS可以基於TCP,也可以基於UDP~~·
希望我的回答對您有所幫助頃悄,您的好乎清採納是對我最好的鼓勵,謝謝!
7. 瀏覽器採用http 協議訪問網頁的工作過程
1. 首先嘛,你得在瀏覽器里輸入要網址:
2. 瀏覽器查找域名的IP地址
導航的第一步是通過訪問的域名找出其IP地址。DNS查找過程如下:
瀏覽器緩存 – 瀏覽器會緩存DNS記錄一段時間。 有趣的是,操作系統沒有告訴瀏覽器儲存DNS記錄的時間,這樣不同瀏覽器會儲存個自固定的一個時間(2分鍾到30分鍾不等)。
系統緩存 – 如果在瀏覽器緩存里沒有找到需要的記錄,瀏覽器會做一個系統調用(windows里是gethostbyname)。這樣便可獲得系統緩存中的記錄。
路由器緩存 – 接著,前面的查詢請求發向路由器,它一般會有自己的DNS緩存。
ISP DNS 緩存 – 接下來要check的就是ISP緩存DNS的伺服器。在這一般都能找到相應的緩存記錄。
遞歸搜索 – 你的ISP的DNS伺服器從跟域名伺服器開始進行遞歸搜索,從.com頂級域名伺服器到Facebook的域名伺服器。一般DNS伺服器的緩存中會有.com域名伺服器中的域名,所以到頂級伺服器的匹配過程不是那麼必要了。
DNS遞歸查找如下圖所示:
DNS有一點令人擔憂,這就是像wikipedia.org 或者 facebook.com這樣的整個域名看上去只是對應一個單獨的IP地址。還好,有幾種方法可以消除這個瓶頸:
循環 DNS 是DNS查找時返回多個IP時的解決方案。舉例來說,Facebook.com實際上就對應了四個IP地址。
負載平衡器 是以一個特定IP地址進行偵聽並將網路請求轉發到集群伺服器上的硬體設備。 一些大型的站點一般都會使用這種昂貴的高性能負載平衡器。
地理 DNS 根據用戶所處的地理位置,通過把域名映射到多個不同的IP地址提高可擴展性。這樣不同的伺服器不能夠更新同步狀態,但映射靜態內容的話非常好。
Anycast 是一個IP地址映射多個物理主機的路由技術。 美中不足,Anycast與TCP協議適應的不是很好,所以很少應用在那些方案中。
大多數DNS伺服器使用Anycast來獲得高效低延遲的DNS查找。
3. 瀏覽器給web伺服器發送一個HTTP請求
因為像Facebook主頁這樣的動態頁面,打開後在瀏覽器緩存中很快甚至馬上就會過期,毫無疑問他們不能從中讀取。
所以,瀏覽器將把一下請求發送到Facebook所在的伺服器:
GET http://facebook.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: facebook.com
Cookie: datr=1265876274-[...]; locale=en_US; lsd=WW[...]; c_user=2101[...]
GET 這個請求定義了要讀取的URL: 「http://facebook.com/」。 瀏覽器自身定義 (User-Agent 頭), 和它希望接受什麼類型的相應 (Accept and Accept-Encoding 頭). Connection頭要求伺服器為了後邊的請求不要關閉TCP連接。
請求中也包含瀏覽器存儲的該域名的cookies。可能你已經知道,在不同頁面請求當中,cookies是與跟蹤一個網站狀態相匹配的鍵值。這樣cookies會存儲登錄用戶名,伺服器分配的密碼和一些用戶設置等。Cookies會以文本文檔形式存儲在客戶機里,每次請求時發送給伺服器。
用來看原始HTTP請求及其相應的工具很多。作者比較喜歡使用fiddler,當然也有像FireBug這樣其他的工具。這些軟體在網站優化時會幫上很大忙。
除了獲取請求,還有一種是發送請求,它常在提交表單用到。發送請求通過URL傳遞其參數(e.g.: http://robozzle.com/puzzle.aspx?id=85)。發送請求在請求正文頭之後發送其參數。
像「http://facebook.com/」中的斜杠是至關重要的。這種情況下,瀏覽器能安全的添加斜杠。而像「http: //example.com/folderOrFile」這樣的地址,因為瀏覽器不清楚folderOrFile到底是文件夾還是文件,所以不能自動添加 斜杠。這時,瀏覽器就不加斜杠直接訪問地址,伺服器會響應一個重定向,結果造成一次不必要的握手。
4. facebook服務的永久重定向響應
圖中所示為Facebook伺服器發回給瀏覽器的響應:
HTTP/1.1 301 Moved Permanently
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Location: http://www.facebook.com/
P3P: CP="DSP LAW"
Pragma: no-cache
Set-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009 05:09:50 GMT;
path=/; domain=.facebook.com; httponly
Content-Type: text/html; charset=utf-8
X-Cnection: close
Date: Fri, 12 Feb 2010 05:09:51 GMT
Content-Length: 0
伺服器給瀏覽器響應一個301永久重定向響應,這樣瀏覽器就會訪問「http://www.facebook.com/」 而非「http://facebook.com/」。
為什麼伺服器一定要重定向而不是直接發會用戶想看的網頁內容呢?這個問題有好多有意思的答案。
其中一個原因跟搜索引擎排名有 關。你看,如果一個頁面有兩個地址,就像http://www.igoro.com/ 和http://igoro.com/,搜索引擎會認為它們是兩個網站,結果造成每一個的搜索鏈接都減少從而降低排名。而搜索引擎知道301永久重定向是 什麼意思,這樣就會把訪問帶www的和不帶www的地址歸到同一個網站排名下。
還有一個是用不同的地址會造成緩存友好性變差。當一個頁面有好幾個名字時,它可能會在緩存里出現好幾次。
5. 瀏覽器跟蹤重定向地址
現在,瀏覽器知道了「http://www.facebook.com/」才是要訪問的正確地址,所以它會發送另一個獲取請求:
GET http://www.facebook.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Cookie: lsd=XW[...]; c_user=21[...]; x-referer=[...]
Host: www.facebook.com
頭信息以之前請求中的意義相同。
6. 伺服器「處理」請求
伺服器接收到獲取請求,然後處理並返回一個響應。
這表面上看起來是一個順向的任務,但其實這中間發生了很多有意思的東西- 就像作者博客這樣簡單的網站,何況像facebook那樣訪問量大的網站呢!
Web 伺服器軟體
web伺服器軟體(像IIS和阿帕奇)接收到HTTP請求,然後確定執行什麼請求處理來處理它。請求處理就是一個能夠讀懂請求並且能生成HTML來進行響應的程序(像ASP.NET,php,RUBY...)。
舉 個最簡單的例子,需求處理可以以映射網站地址結構的文件層次存儲。像http://example.com/folder1/page1.aspx這個地 址會映射/httpdocs/folder1/page1.aspx這個文件。web伺服器軟體可以設置成為地址人工的對應請求處理,這樣 page1.aspx的發布地址就可以是http://example.com/folder1/page1。
請求處理
請求處理閱讀請求及它的參數和cookies。它會讀取也可能更新一些數據,並講數據存儲在伺服器上。然後,需求處理會生成一個HTML響應。
所 有動態網站都面臨一個有意思的難點 -如何存儲數據。小網站一半都會有一個SQL資料庫來存儲數據,存儲大量數據和/或訪問量大的網站不得不找一些辦法把資料庫分配到多台機器上。解決方案 有:sharding (基於主鍵值講數據表分散到多個資料庫中),復制,利用弱語義一致性的簡化資料庫。
委 托工作給批處理是一個廉價保持數據更新的技術。舉例來講,Fackbook得及時更新新聞feed,但數據支持下的「你可能認識的人」功能只需要每晚更新 (作者猜測是這樣的,改功能如何完善不得而知)。批處理作業更新會導致一些不太重要的數據陳舊,但能使數據更新耕作更快更簡潔。
7. 伺服器發回一個HTML響應
圖中為伺服器生成並返回的響應:
HTTP/1.1 200 OK
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
P3P: CP="DSP LAW"
Pragma: no-cache
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-Cnection: close
Transfer-Encoding: chunked
Date: Fri, 12 Feb 2010 09:05:55 GMT
2b3Tn@[...]
整個響應大小為35kB,其中大部分在整理後以blob類型傳輸。
內容編碼頭告訴瀏覽器整個響應體用gzip演算法進行壓縮。解壓blob塊後,你可以看到如下期望的HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
lang="en" id="facebook" class=" no_js">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-language" content="en" />
...
關於壓縮,頭信息說明了是否緩存這個頁面,如果緩存的話如何去做,有什麼cookies要去設置(前面這個響應里沒有這點)和隱私信息等等。
請注意報頭中把Content-type設置為「text/html」。報頭讓瀏覽器將該響應內容以HTML形式呈現,而不是以文件形式下載它。瀏覽器會根據報頭信息決定如何解釋該響應,不過同時也會考慮像URL擴展內容等其他因素。
8. 瀏覽器開始顯示HTML
在瀏覽器沒有完整接受全部HTML文檔時,它就已經開始顯示這個頁面了:
9. 瀏覽器發送獲取嵌入在HTML中的對象
在瀏覽器顯示HTML時,它會注意到需要獲取其他地址內容的標簽。這時,瀏覽器會發送一個獲取請求來重新獲得這些文件。
下面是幾個我們訪問facebook.com時需要重獲取的幾個URL:
圖片
http://static.ak.fbcdn.net/rsrc.php/z12E0/hash/8q2anwu7.gif
http://static.ak.fbcdn.net/rsrc.php/zBS5C/hash/7hwy7at6.gif
…
CSS 式樣表
http://static.ak.fbcdn.net/rsrc.php/z448Z/hash/2plh8s4n.css
http://static.ak.fbcdn.net/rsrc.php/zANE1/hash/cvtutcee.css
…
JavaScript 文件
http://static.ak.fbcdn.net/rsrc.php/zEMOA/hash/c8yzb6ub.js
http://static.ak.fbcdn.net/rsrc.php/z6R9L/hash/cq2lgbs8.js
…
這些地址都要經歷一個和HTML讀取類似的過程。所以瀏覽器會在DNS中查找這些域名,發送請求,重定向等等...
但 不像動態頁面那樣,靜態文件會允許瀏覽器對其進行緩存。有的文件可能會不需要與伺服器通訊,而從緩存中直接讀取。伺服器的響應中包含了靜態文件保存的期限 信息,所以瀏覽器知道要把它們緩存多長時間。還有,每個響應都可能包含像版本號一樣工作的ETag頭(被請求變數的實體值),如果瀏覽器觀察到文件的版本 ETag信息已經存在,就馬上停止這個文件的傳輸。
試著猜猜看「fbcdn.net」在地址中代表什麼?聰明的答案是"Facebook內容分發網路"。Facebook利用內容分發網路(CDN)分發像圖片,CSS表和JavaScript文件這些靜態文件。所以,這些文件會在全球很多CDN的數據中心中留下備份。
靜態內容往往代表站點的帶寬大小,也能通過CDN輕松的復制。通常網站會使用第三方的CDN。例如,Facebook的靜態文件由最大的CDN提供商Akamai來託管。
舉例來講,當你試著ping static.ak.fbcdn.net的時候,可能會從某個akamai.net伺服器上獲得響應。有意思的是,當你同樣再ping一次的時候,響應的伺服器可能就不一樣,這說明幕後的負載平衡開始起作用了。
10. 瀏覽器發送非同步(AJAX)請求
在Web 2.0偉大精神的指引下,頁面顯示完成後客戶端仍與伺服器端保持著聯系。
以 Facebook聊天功能為例,它會持續與伺服器保持聯系來及時更新你那些亮亮灰灰的好友狀態。為了更新這些頭像亮著的好友狀態,在瀏覽器中執行的 JavaScript代碼會給伺服器發送非同步請求。這個非同步請求發送給特定的地址,它是一個按照程式構造的獲取或發送請求。還是在Facebook這個例 子中,客戶端發送給http://www.facebook.com/ajax/chat/buddy_list.php一個發布請求來獲取你好友里哪個 在線的狀態信息。
提起這個模式,就必須要講講"AJAX"-- 「非同步JavaScript 和 XML」,雖然伺服器為什麼用XML格式來進行響應也沒有個一清二白的原因。再舉個例子吧,對於非同步請求,Facebook會返回一些JavaScript的代碼片段。
除了其他,fiddler這個工具能夠讓你看到瀏覽器發送的非同步請求。事實上,你不僅可以被動的做為這些請求的看客,還能主動出擊修改和重新發送它們。AJAX請求這么容易被蒙,可著實讓那些計分的在線游戲開發者們郁悶的了。(當然,可別那樣騙人家~)
Facebook聊天功能提供了關於AJAX一個有意思的問題案例:把數據從伺服器端推送到客戶端。因為HTTP是一個請求-響應協議,所以聊天伺服器不能把新消息發給客戶。取而代之的是客戶端不得不隔幾秒就輪詢下伺服器端看自己有沒有新消息。
這些情況發生時長輪詢是個減輕伺服器負載挺有趣的技術。如果當被輪詢時伺服器沒有新消息,它就不理這個客戶端。而當尚未超時的情況下收到了該客戶的新消息,伺服器就會找到未完成的請求,把新消息做為響應返回給客戶端。
8. 怎樣使用HTTP協議訪問網路
文件協議主要用於訪問本地計算機中的文件冊戚,就如同在windows資源管理器中打開文件擾姿虧一樣,注意它是針對本地(本機)的,簡單來說,文件協議是訪問你本機的文件資源。
http訪問本地html是在本地起了一台http伺服器,然後你訪問自己電腦上的本地伺服器,http伺服器再去訪問你本機的文件資源。
再簡單的說:文件協緩神議只是純粹的請求本地文件,http是架了伺服器的。所以也有導致題主所說的某些api只能通過http訪問的頁面里能夠調用。
9. HTTP訪問不正常
HTTP不能正常訪問是多方面的原因,有多種情況可以導致HTTP不能夠正常訪問,下面來給大家說一種我說見到的HTTP不能夠正常訪問的解決辦法中的iOS9 & iOS10 的http不能夠正常訪問的解決辦法:
首先,在編譯網路階段,由於新特性要求不同,這樣的情況下可能會導致App內訪問的網路必須使用HTTPS協議。雖然現在很多項目使用的是HTTP協議,使用私有加密方式保證數據安全。但是,現在也不能馬上改成HTTPS協議傳輸。
那麼,此類型解決辦法可以通過以下步驟來實現(添加圖片詳細解說):
1、在Info.plist中添加NSAppTransportSecurity類型Dictionary。即為在Filter中搜索Info.plist,選擇Info.plist進行編輯,如下圖所示
根據自己需要的域名修改, NSIncludeSubdomains 顧名思義是包括子域的意思。
通過以上操作,基本就可以解決iOS9 & iOS10 的 http 不能夠正常訪問的問題。
10. 怎樣使用HTTP協議訪問網路
1. 首先嘛,你得在瀏覽器里輸入要網址:
2. 瀏覽器查找域名的IP地址
導航的第一步是通過訪問的域名找出其IP地址。DNS查找過程如下:
瀏覽器緩存 – 瀏覽器會緩存DNS記錄一段時間。 有趣的是,操作系統沒有告訴瀏覽器儲存DNS記錄的時間,這樣不同瀏覽器會儲存個自固定的一個時間(2分鍾到30分鍾不等)。
系統緩存 – 如果在瀏覽器緩存里沒有找到需要的記錄,瀏覽器會做一個系統調用(windows里是gethostbyname)。這樣便可獲得系統緩存中的記錄。
路由器緩存 – 接著,前面的查詢請求發向路由器,它一般會有自己的DNS緩存。
ISP DNS 緩存 – 接下來要check的就是ISP緩存DNS的伺服器。在這一般都能找到相應的緩存記錄。
遞歸搜索 – 你的ISP的DNS伺服器從跟域名伺服器開始進行遞歸搜索,從.com頂級域名伺服器到Facebook的域名伺服器。一般DNS伺服器的緩存中會有.com域名伺服器中的域名,所以到頂級伺服器的匹配過程不是那麼必要了。
DNS遞歸查找如下圖所示:
DNS有一點令人擔憂,這就是像wikipedia.org 或者 facebook.com這樣的整個域名看上去只是對應一個單獨的IP地址。還好,有幾種方法可以消除這個瓶頸:
循環 DNS 是DNS查找時返回多個IP時的解決方案。舉例來說,Facebook.com實際上就對應了四個IP地址。
負載平衡器 是以一個特定IP地址進行偵聽並將網路請求轉發到集群伺服器上的硬體設備。 一些大型的站點一般都會使用這種昂貴的高性能負載平衡器。
地理 DNS 根據用戶所處的地理位置,通過把域名映射到多個不同的IP地址提高可擴展性。這樣不同的伺服器不能夠更新同步狀態,但映射靜態內容的話非常好。
Anycast 是一個IP地址映射多個物理主機的路由技術。 美中不足,Anycast與TCP協議適應的不是很好,所以很少應用在那些方案中。
大多數DNS伺服器使用Anycast來獲得高效低延遲的DNS查找。