1. 程式人生 > >Java系列-Socket網路程式設計,TCP/IP和Http等網路協議理解

Java系列-Socket網路程式設計,TCP/IP和Http等網路協議理解

一、網路各個協議:TCP/IP、SOCKET、HTTP等

網路七層由下往上分別為物理層、資料鏈路層、網路層、傳輸層、會話層、表示層和應用層。
其中物理層、資料鏈路層和網路層通常被稱作媒體層,是網路工程師所研究的物件;
傳輸層、會話層、表示層和應用層則被稱作主機層,是使用者所面向和關心的內容。
 http協議   對應於應用層 
 tcp協議    對應於傳輸層  
 ip協議     對應於網路層 
 三者本質上沒有可比性。  何況HTTP協議是基於TCP連線的。 
 TCP/IP是傳輸層協議,主要解決資料如何在網路中傳輸;而HTTP是應用層協議,主要解決如何包裝資料。
 我 們在傳輸資料時,可以只使用傳輸層(TCP/IP),但是那樣的話,由於沒有應用層,便無法識別資料內容,如果想要使傳輸的資料有意義,則必須使用應用層 協議,應用層協議很多,有HTTP、FTP、TELNET等等,也可以自己定義應用層協議。WEB使用HTTP作傳輸層協議,以封裝HTTP文字資訊,然 後使用TCP/IP做傳輸層協議將它傳送到網路上。Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個呼叫介面(API),通過Socket,我們才能使用TCP/IP協議。

二、Http和Socket連線區別

 相信不少學習手機聯網開發的朋友都接觸過Http與Socket連線,究竟他們有什麼區別,這邊淺談下個人理解。

2.1、TCP連線

Socket是對TCP/IP協議的封裝,要想明白Socket連線,先要明白TCP連線。手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網路建立TCP連線。TCP協議可以對上層網路提供介面,使上層網路資料的傳輸建立在“無差別”的網路之上。
建立起一個TCP連線需要經過“三次握手”:
第一次握手:客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

握 手過程中傳送的包裡不包含資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,TCP連線一旦建立,在通訊雙方中的任何一方主動關閉連 接之前,TCP 連線都將被一直保持下去。斷開連線時伺服器和客戶端均可以主動發起斷開TCP連線的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是伺服器和客 戶端互動,最終確定斷開)

2.1.1 TCP 連線的建立步驟

典型的 TCP 客戶端要經過下面三步操作:
• 建立一個 Socket 例項:建構函式向指定的遠端主機和埠建立一個 TCP 連線;
• 通過套接字的 I/O 流與服務端通訊;
• 使用 Socket 類的 close 方法關閉連線。
服務端的工作是建立一個通訊終端,並被動地等待客戶端的連線。
典型的 TCP 服務端執行如下兩步操作:
1. 建立一個 ServerSocket 例項並指定本地埠,用來監聽客戶端在該埠傳送的 TCP 連線請求;
2. 重複執行:
• 呼叫 ServerSocket 的 accept()方法以獲取客戶端連線,並通過其返回值建立一個 Socket 例項;
• 為返回的 Socket 例項開啟新的執行緒,並使用返回的 Socket 例項的 I/O 流與客戶端通訊; 通訊完成後,使
用 Socket 類的 close()方法關閉該客戶端的套接字連線。

2.2、HTTP連線

HTTP協議即超文字傳送協議(HypertextTransfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP連線最顯著的特點是客戶端傳送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連線。從建立連線到關閉連線的過程稱為“一次連線”。
1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連線,在處理完本次請求後,就自動釋放連線。
2)在HTTP 1.1中則可以在一次連線中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。

3) 在 HTTP 2.0中,多路複用,Http2連線可以承載數十或數百個流的複用,多路複用意味著來自很多流的資料包能夠混合在一起通過同樣連線傳輸,兩列不同火車被混合在一起傳輸,當到達終點時,它們又被拆開組成兩列不同的火車。
由 於HTTP在每次請求結束後都會主動釋放連線,因此HTTP連線是一種“短連線”,要保持客戶端程式的線上狀態,需要不斷地向伺服器發起連線請求。通常的 做法是即時不需要獲得任何資料,客戶端也保持每隔一段固定的時間向伺服器傳送一次“保持連線”的請求,伺服器在收到該請求後對客戶端進行回覆,表明知道客 戶端“線上”。若伺服器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到伺服器的回覆,則認為網路已經斷開。

三、SOCKET原理

3.1、套接字(socket)概念

套接字(socket)是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元。它是網路通訊過程中端點的抽象表示,包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的IP地址,本地程序的協議埠,遠地主機的IP地址,遠地程序的協議埠。
應 用層通過傳輸層進行資料通訊時,TCP會遇到同時為多個應用程式程序提供併發服務的問題。多個TCP連線或多個應用程式程序可能需要通過同一個 TCP協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與TCP/IP協議互動提供了套接字(Socket)介面。應 用層可以和傳輸層通過Socket介面,區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。

3.2 、建立socket連線

建立Socket連線至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket,另一個運行於伺服器端,稱為ServerSocket。
套接字之間的連線過程分為三個步驟:伺服器監聽,客戶端請求,連線確認。
伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連線的狀態,實時監控網路狀態,等待客戶端的連線請求。
客戶端請求:指客戶端的套接字提出連線請求,要連線的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連線的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連線請求。
連 接確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連線請求時,就響應客戶端套接字的請求,建立一個新的執行緒,把伺服器端套接字的描述發給客戶 端,一旦客戶端確認了此描述,雙方就正式建立連線。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連線請求。

 3.3、SOCKET連線與TCP連線

協議相當於相互通訊的程式間達成的一種約定,它規定了分組報文的結構、交換方式、包含的意義以及怎樣對報文所包含的資訊進行解析TCP/IP 協議族有 IP 協議、TCP 協議和 UDP 協議。現在 TCP/IP 協議族中的主要 socket 型別為流套接字(使用 TCP 協議)和資料報套接字(使用 UDP 協議)。TCP 協議提供面向連線的服務,通過它建立的是可靠地連線。Java 為 TCP 協議提供了兩個類:Socke 類和 ServerSocket 類。一個 Socket 例項代表了 TCP 連線的一個客戶端,而一個 ServerSocket 例項代表了 TCP連線的一個伺服器端,一般在 TCP Socket 程式設計中,客戶端有多個,而伺服器端只有一個,客戶端 TCP 向伺服器端 TCP 傳送連線請求,伺服器端的 ServerSocket 例項則監聽來自客戶端的 TCP 連線請求,併為每個請求建立新的 Socket 例項,由於服務端在呼叫 accept()等待客戶端的連線請求時會阻塞,直到收到客戶端傳送的連線請求才會繼續往下執行程式碼,因此要為每個 Socket 連線開啟一個執行緒。伺服器端要同時處理 ServerSocket 例項和 Socket 例項,而客戶端只需要使用 Socket 例項。另外,每個 Socket 例項會關聯一個 InputStream和 OutputStream 物件,我們通過將位元組寫入套接字的 OutputStream 來發送資料,並通過從 InputStream 來接收資料。 客戶端向伺服器端傳送連線請求後,就被動地等待伺服器的響應。