《Linux高性能服务器编程》学习总结(四)——TCP/IP通信案例:访问Internet上的Web服务器...
第四章????? TCP/IP通信案例:訪問Internet上的Web服務(wù)器
HTTP協(xié)議是工作在應(yīng)用層上的協(xié)議,其應(yīng)用十分廣泛,而在進(jìn)行通信的過程中,經(jīng)常使用HTTP代理服務(wù)器。HTTP代理服務(wù)器主要分為:正向代理服務(wù)器,反向代理服務(wù)器和透明代理服務(wù)器。其中,正向代理服務(wù)器要求客戶端自己設(shè)置代理服務(wù)器的地址,客戶的每次請求都直接發(fā)送至該代理服務(wù)器,并由代理服務(wù)器來請求目標(biāo)資源。比如防火墻內(nèi)的局域網(wǎng)主機(jī)想要訪問Internet或想要訪問一些被屏蔽掉的國外網(wǎng)站,就需要使用正向代理服務(wù)器。而反向代理服務(wù)器則被設(shè)置在服務(wù)器端,用來接收用戶請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)的服務(wù)器,并將內(nèi)部返回的結(jié)果返回給客戶端,這樣,代理服務(wù)器對外就表現(xiàn)為一個真實(shí)的服務(wù)器。透明代理只能設(shè)置在網(wǎng)關(guān)上,可以看作是正向代理的特殊情況。常用的代理服務(wù)器軟件有squid、varnish、nginx等,squid支持所有代理方式,而varnish只支持反向代理。
關(guān)于HTTP協(xié)議,HTTP協(xié)議是為數(shù)不多的不以二進(jìn)制作為首部和數(shù)據(jù)而是以明文作為首部和數(shù)據(jù)協(xié)議。HTTP工作在TCP之上,所以在傳輸數(shù)據(jù)之前,需要三次握手來建立TCP連接。下面我們以HTTP首部為例來簡單講解一下HTTP協(xié)議,首先是HTTP請求報文:
GET http://www.baidu.com/index.html HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Host: www.baidu.com
Connection: close
在這樣一個請求報文的首部中,首先GET代表請求方法,其余常用請求方法還有HEAD、POST等,后面接的是請求資源的URL,我們來分析一下這個URL,首先的http代表使用的http協(xié)議,后面的www.baidu.com代表資源所在的主機(jī),而后是指定資源文件的路徑及名稱。后面的HTTP/1.0代表客戶端使用的HTTP版本號是1.0,但是目前主流的版本號為1.1。下面的User-Agent是客戶端程序,Host代表目標(biāo)主機(jī)名,而HTTP協(xié)議規(guī)定頭部中必須包含的字段就是主機(jī)名。最后的Connection表示連接方式,close代表短連接,此次傳輸完畢連接就可以斷開,而keep-alive代表長連接。在頭部字段的最后應(yīng)該包含一個空行,只包含<CR><LF>,分別是回車符和換行符。
對于HTTP應(yīng)答報文:
HTTP/1.0 200 OK
Server: BWS/1.0
Content-Length: 8024
Content-Type: text/html;charset = gbk
第一行是狀態(tài)行,200 OK是狀態(tài)碼和狀態(tài)信息,1xx代表仍有數(shù)據(jù)要發(fā)送,2xx代表成功,3xx代表資源重定向,4xx代表客戶端錯誤,5xx代表服務(wù)器錯誤。后面的字段含義顯而易見,值得注意的是在這個應(yīng)答報文中沒有Cookie,但是我們在平時使用中會用這個字段,接下來我們簡單分析一下Cookie的作用。
前面我們說過HTML協(xié)議是無狀態(tài)的協(xié)議,類似于IP協(xié)議,即HTTP報文段之間沒有上下文關(guān)系,但是對于現(xiàn)在交互式Web應(yīng)用程序,這樣的協(xié)議就比較落后了,所以我們使用Cookie來唯一標(biāo)識不同的客戶端,用來保持HTTP的連接狀態(tài),我們?yōu)g覽器內(nèi)部的自動登錄就是使用Cookie實(shí)現(xiàn)的。
轉(zhuǎn)載于:https://www.cnblogs.com/Torrance/p/8398945.html
總結(jié)
以上是生活随笔為你收集整理的《Linux高性能服务器编程》学习总结(四)——TCP/IP通信案例:访问Internet上的Web服务器...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: C#窗体之间事件传值
 - 下一篇: [Servlet]研究ServletCo