作為一名java EE開發人員,我們最常用到的可能就是http協議了,但是我們對http協議及其之下的各層協議真的清楚嘛。現在我們就來大概的瞭解一下。
一、應用程式層-HTTP
二、傳輸層-TCP
三、網路層-IP 一、應用程式層-HTTP
一個http請求包含三個組成部分:
1. 方法-統一資源識別項(uri)-協議/版本
2. 請求的頭部
3. 主體內容
以下是一個http請求的例子:
POST /test/index.jsp HTTP/1.1Accept:text/plain, text/htmlAccept-Language:zh-CN,zh;q=0.8,en;q=0.6Connection:keep-aliveHost:localhostUser-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)Content-Length:27Content-Type:application/x-www-form-urlencodedAccept-Encoding: gzip, deflateusername=test&passwd=123456
方法-統一資源識別項(uri)-協議/版本,出現在第一行。
POST /test/index.jsp HTTP/1.1
這個是post要求方法,/test/index.jsp是uri。而HTTP/1.1 是協議/版本部分。
每個http請求可以使用http標準裡的多種方法之一。http 1.1支援7中類型的請求:GET,POST,HEAD,OPTIONS,PUT,DELETE和TRACE。get和post在互連網內使用最為普遍。
uri完全指明了一個互連網資源,uri通常是對伺服器的根目錄解釋。因此,始終以/開頭。
請求的頭部包含了關於用戶端環境和請求的主體內容的有用資訊。
Accept:text/plain, text/html 可接受的資料類型。
Accept-Language 可接收的語言類型。
Connection:keep-alive 本次串連保持一定的時間,當用戶端發送另一個請求時,它會使用同一個串連,作為回應,伺服器在響應該次串連時也會在回應標頭中添加一個Connection:keep-alive,該次串連的具體時間長度根據不同伺服器有不同實現。
Host:localhost 已連線的服務器地址。
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) 當前用戶端環境資訊。
Content-Length:27 發送的請求體內容長度,也就是username=test&passwd=123456內容的長度。
Content-Type:application/x-www-form-urlencoded 發送的請求體內容類型。
Accept-Encoding: gzip, deflate 可接收的資料類型。
最後就是請求體的資料內容 username=test&passwd=123456。注意要求標頭和請求體之間有一個換行存在,這也就是區分這兩部分的關鍵所在。
以上內容就是http協議的請求資料,作為一個web伺服器(tomcat),其實就是一個tcp伺服器,當接收到該socket請求時,會擷取該次socket串連的InputStream輸入資料流對象傳給request對象,擷取該次socket串連的OutputStream輸出資料流對象傳給response對象。通過輸入資料流對象可以讀取到以上發送的全部資訊,然後將其封裝到request對象的相應屬性上,例如requestMap,requestNames,requestUri,cookie等屬性上,我們就可以通過相應的getter方法擷取到用戶端請求資訊了。根據請求的uri反射擷取請求的servlet對象執行個體,然後將封裝好的request對象和response對象傳遞給servlet的service方法,並執行service內的邏輯,最後通過response對象(也就是該次socket串連的輸出資料流對象)寫會資料到用戶端。一次http請求也就算結束了。
以上說明的只是http協議的部分。接下來我們說下http下面的協議。 二、傳輸層-TCP
應用程式層http協議是建立在傳輸層tcp協議之上的。tcp協議是個可靠傳輸,全雙工系統的協議,可靠傳輸是指該協議在不可靠的ip協議之上做了自己的接受確認和逾時重發機制,所以建立串連前需要三向交握,並且建立的是長連結。全雙工系統指的是發送方和接收方可以互發資料,也就是雙向通訊,所以中斷連線前需要四次揮手(部分情況下存在半串連,即一方發送SYN告訴另一方自身不再發送資料,但還可以接收另一方發來的資料)。一個tcp資料報包含了請求方應用程式連接埠號碼,回應程式應用程式連接埠號碼,該連接埠號碼用於指定需要連線應用程式程式。
tcp協議的可靠性給我們做了有力的資料轉送保障,我們不需要關心存在資料包丟失問題。因為tcp資料報記憶體在著請求方和相應方的應用程式連接埠號碼,所以可以實現全雙工系統通訊(雙向通訊)。雙向通訊為我們http的Connection:keep-alive做了保障,keep-alive保持串連後可以多次雙向傳輸資料,可節省建立多個串連,而且http1.1協議記憶體在的半串連也是建立在這之上的。
IP是一個無狀態的協議,也就是每一個IP資料報的發送的路由是變化的,這就導致了接收方接收到的資料報是無序的,但tcp協議頭記憶體在著對資料報的排序,所以通過tcp協議最後接收到的資料會進行排序,從而使我們看到的是一個完整有序的資料。 三、網路層-IP
說完了tcp我們接下來聊一下ip協議。tcp協議調用的就是ip協議了,ip協議只負責定址。我們都知道在請求一個網域名稱時首先第一步就是去dns解析網域名稱擷取該網域名稱背後的ip地址,因為下層的所有協議都是使用的ip地址(網域名稱解析協議除外)。如果我們對某個網域名稱請求達到一定的次數的話,我們的電腦就會將該網域名稱背後的IP緩衝到記憶體中,下次就不再解析該網域名稱,這就節省了網域名稱解析所消耗的時間。當然,我們關機後緩衝的IP也就會清空掉。
一個ip地址我們可以將其理解為三部分,根據子網路遮罩的不同,我們可以找到相對應的網路號,子網號,主機號。通過大的網路號尋找下面對應的子網號,然後通過子網號找到目標主機號。
ip路由定址主要完成以下功能:
1. 搜尋路由表,尋找能與目的IP地址完全符合的表目(網路號和主機號都要匹配)。如果找到,則把報文發送給該表目指定的下一站路由器或直接連接的網路介面。
2. 搜尋路由表,尋找能與目的網路號相匹配的表目。如果找到,則把報文發送給該表目指定的下一站路由器或直接連接的網路介面。
3. 搜尋路由表,尋找標為“預設(default)”的表目。如果找到,則把報文發送給該表目指定的下一站路由器。
4. 如果上面這些步驟都沒有成功,那麼該資料報就不能被傳送。如果不能傳送的資料報來自本機,那麼一般會向產生資料報的有用程式返回一個“主機不可達”或“網路不可達”的錯誤。
以上概述的就是網路相關的內容。
我的部落格:https://qbian61.github.io/