web開發者不可不知的網路知識

NO IMAGE

作為一名java EE開發者,我們最常用到的可能就是http協議了,但是我們對http協議及其之下的各層協議真的清楚嘛。現在我們就來大概的瞭解一下。

一、應用層-HTTP

二、傳輸層-TCP

三、網路層-IP

一、應用層-HTTP

一個http請求包含三個組成部分:
1. 方法-統一資源識別符號(uri)-協議/版本
2. 請求的頭部
3. 主體內容

以下是一個http請求的例子:

POST /test/index.jsp HTTP/1.1
Accept:text/plain, text/html
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Host:localhost
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6)
Content-Length:27
Content-Type:application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
username=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/