1. 程式人生 > >OSI七層網路模型與TCP/IP四層網路模型及在java中對應API(Socket、HttpServlet)實現

OSI七層網路模型與TCP/IP四層網路模型及在java中對應API(Socket、HttpServlet)實現

1、OSI七層網路模型

OSI七層網路模型從上到下依次是:應用層、表示層、會話層、傳輸層、網路層、資料鏈路層和物理層。
其中應用層、表示層、會話層和傳輸層被稱作主機層,是開發工程師通過開發應用程式處理和實現的內容;而網路層、物理層和資料鏈路層被稱作媒體層,是網路工程師所研究的物件。

2、TCP/IP四層網路模型

TCP/IP四層網路模型從上到下依次是:應用層、傳輸層、網間層和網路介面層。
其中應用層包含了七層網路模型中的上三層:應用層、表示層和會話層,傳輸層對應傳輸層,網路層對應網間層,網路介面層包含了資料鏈路層和物理層。

OSI七層網路模型與TCP/IP四層網路模型對應關係、協議以及功能描述,如下圖:
這裡寫圖片描述

網路協議可以補充檢視阮一峰大神的兩篇部落格:網際網路協議入門(一)網際網路協議入門(二)

3、HTTP協議與TCP/IP協議概念與關係

HTTP協議:處於應用層,是Web聯網的基礎,主要負責資料的包裝、服務請求和服務應答;關於HTTP協議的介紹可以看:HTTP 協議入門關於HTTP協議一篇就夠了HTTP協議詳解(真的很經典)HTTP協議報文工作原理及Java中的HTTP通訊技術詳解
應用層並非由計算機上執行的實際應用軟體組成,而是由嚮應用程式提供訪問網路資源的API組成,應用程式組成的API實現HTTP協議。

TCP/IP協議:處於傳輸層和網路層,主要負責資料(位元組流)

的傳輸,其中TCP負責資料的傳輸方式,IP負責管理資料傳輸地址。此處涉及TCP/IP協議三次握手建立連線與四次揮手關閉連線,可以檢視:TCP/IP協議三次握手與四次握手流程解析

TCP/IP協議負責傳輸資料,支援TCP/IP協議的網路通訊的基本操作單元稱為套接字(socket),它是網路通訊過程中端點的抽象表示。

HTTP協議是應用層,底層通過TCP/IP協議來傳輸位元組流資訊,HTTP協議是建立在TCP協議之上的一種應用。

4、Socket套接字與Socket介面程式設計

Socket概念

套接字(Socket)是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元。它是網路通訊過程中端點的抽象表示,包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。

應用層通過傳輸層進行資料通訊時,TCP會遇到同時為多個應用程式程序提供併發服務的問題。多個TCP連線或多個應用程式程序可能需要通過同一個 TCP協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與TCP/IP協議互動提供了套接字(Socket)介面。應用層可以和傳輸層通過Socket介面,區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。

Socket是對TCP/IP協議棧操作的抽象,是一個呼叫介面(API)。Socket套節字物件,是連線兩個網路端點的傳送器。

HTTP、TCP/IP、Socket的區別,可以檢視:TCP/IP SOCKET HTTP及HTTPS之間的關係及各自特性之總結

java中Socket介面程式設計

Socket介面程式設計,建立Socket連線至少需要一對套接字,其中一個運行於客戶端,另一個運行於伺服器端。如圖:
這裡寫圖片描述

偽例:A應用作為客戶端部署在A_IP機器上,埠號為A_PORT,B應用作為服務端部署在B_IP臺機器上,埠號為B_PORT,A應用向B應用傳送請求

A應用客戶端虛擬碼:

//1、建立客戶端Socket,指定目標伺服器端地址和埠
Socket socket =new Socket(B_IP,B_PORT);

//2、獲取輸出流,用於向伺服器端傳送位元組流資訊
OutputStream os = socket.getOutputStream();//位元組輸出流

//3、獲取輸入流,用於讀取伺服器端的響應資訊
InputStream is = socket.getInputStream();

B應用服務端虛擬碼:

//1、建立一個伺服器端Socket,即ServerSocket,指定監聽埠
ServerSocket serverSocket =newServerSocket(B_PORT);

//2、呼叫accept()方法開始監聽,等待客戶端的連線
Socket socket = serverSocket.accept();

//3、獲取輸入流,用於讀取客戶端資訊
InputStream is = socket.getInputStream();

//4、獲取輸出流,用於響應客戶端的請求
OutputStream os = socket.getOutputStream();

5、實現應用層HTTP協議的API

前面說到,應用層並非由計算機上執行的實際應用軟體組成,而是由嚮應用程式提供訪問網路資源的API組成,也就是說,這些組成的API完成HTTP協議的抽象,實現HTTP協議。
在java中Socket物件實現了TCP/IP協議,那麼實現HTTP協議的API是什麼呢?

java中負責實現企業級應用開發的是j2ee規範,j2ee規範始於Servlet介面,B/S架構的應用基於Internet程式設計,由Servlet抽象實現類HttpServlet實現,也就是說,HttpServlet是HTTP協議處理類的抽象類。

HttpServlet中的doGet(HttpServletRequest req, HttpServletResponse resp)doPost(HttpServletRequest req, HttpServletResponse resp)負責處理http的GET和POST請求,HttpServletRequest和HttpServletResponse用於封裝http請求資訊(請求報文頭、請求報文體)和http響應資訊(響應報文頭、響應報文體)。

上面第4點,Socket通訊是以位元組的形式通過輸入輸出流完成資料傳輸操作的,同時,HTTP協議是基於TCP/IP協議的。那麼http請求和響應也一定是以位元組的形式通過輸入輸出流完成資料傳輸操作的。

//負責接收請求流資料
ServletInputStream sis = request.getInputStream();
//負責傳送響應流資料,比如write方法向輸出流中寫入返回頁面的內容
ServletOutputStream sos = response.getOutputStream();

6、後續知識拓展方向

通過前面的5點內容,從網路協議模型細化到HTTP協議與TCP/IP協議的概念和關係,從底層協議實現Socket到上層協議實現HttpServlet,強勢將底層協議、上層API實現、j2ee規範貫穿起來,這樣再理解B/S架構企業應用就透徹的多了。

但這對一個企業應用開發人員來說,剛剛是個開始,接下來還有很多的路要走:Servlet執行原理與生命週期詳解、Servlet容器tomcat原始碼解析與效能優化,再到底層NIO非阻塞式Socket程式設計與netty框架使用等等,這是一個持久的知其然並且知其所以然的過程,慢慢來,總會有卓效。