基於TCP/UDP的Socket程式設計,HTTP/HTTPS協議

嘻嘻*哈哈發表於2020-11-27

TCP :傳輸控制協議(TCP),是網際網路協議組的主要協議之一。它起源於最初的網路實施,在網路實施中,它補充了網際網路協議。

UDP: 使用者資料包協議(User Datagram Protocol)是一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,可以保證通訊效率,傳輸延時小。

Socket:Socket程式設計用於解決我們客戶端與服務端之間通訊的問題。


TCP:

服務端(server):

1)建立ServerSocket例項,指定本地的埠,用於監聽其連線請求。
2)呼叫socket的accept()方法獲得客戶端的連線請求,通過accept()方法返回的socket例項,建立與客戶端的連線。
3)通過返回的Socket例項來獲得InputStream和OutputStream,進行資料的寫入和讀出。
4)資料傳輸結束,呼叫 socket 例項的 close() 方法關閉連線 。

客戶端(client):

1)建立Socket例項,通過指定的伺服器地址和埠建立連線。
2)通過Socket例項獲取InputStream和OutputStream進行資料讀寫。
3)資料傳輸結束,呼叫 socket 例項的 close() 方法關閉連線。

UDP:

服務端(server):

1)指定本地埠建立 DatagramSocket 例項
2)通過位元組陣列,建立 DatagramPacket 例項,呼叫 DatagramSocket 例項的 receive() 方法,用 DatagramPacket 例項來接收資料
3)設定 DatagramPacket 例項返回的資料,呼叫 DatagramSocket 例項的 send() 方法來傳送資料
4)資料傳輸完成,呼叫 DatagramSocket 例項的 close() 方法

客戶端(client):

1)建立 DatagramSocket 例項
2)通過 IP 地址埠和資料建立 DatagramSocket 例項,呼叫 DatagramSocket 例項 send() 方法傳送資料包
3)通過位元組陣列建立 DatagramSocket 例項,呼叫 DatagramSocket 例項 receive() 方法接受資料包
4)資料傳輸完成,呼叫 DatagramSocket 例項的 close() 方法


Socket程式設計的API介面:

(1)建立socket:socket()函式

函式原型:

int socket(int af, int type, int protocol);
  • af:為 IP 地址型別,常用的有 AF_INET 和 AF_INET6

  • type:type 為資料傳輸方式,常用的有 面向連線(SOCK_STREAM)方式(即TCP) 和 無連線(SOCK_DGRAM)的方式(即UDP)。

  • protocol:套介面所用的協議,常用的有 IPPROTO_TCPIPPTOTO_UDP,分別表示 TCP 傳輸協議和 UDP 傳輸協議。

(2)繫結套接字:bind()函式

函式原型:

int bind(int sock, struct sockaddr *addr, socklen_t addrlen); 
  • sock引數:sock 為 socket 檔案描述符。
  • addr引數:addr 為 sockaddr 結構體變數的指標。
  • addrlen引數:addrlen 為 addr 變數的大小,可由 sizeof() 計算得出。

(3)建立連線:connect()函式

函式原型:

int connect(int sock, struct sockaddr *serv_addr, socklen_t addrlen);  

引數與bind()的引數類似。

(4)監聽:listen()函式

函式原型:

int listen(int sock, int backlog);
  • sock引數:sock 為需要進入監聽狀態的套接字。
  • backlog引數:backlog 為請求佇列的最大長度。

(5)接收請求:accept()函式

函式原型:

int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);
  • sock引數:sock 為伺服器端套接字。
  • addr引數:addr 為 sockaddr_in 結構體變數。
  • addrlen引數:addrlen 為引數 addr 的長度,可由 sizeof() 求得。
  • 返回值:一個新的套接字,用於與客戶端通訊。

(6)關閉:close()函式

函式原型:

int close(int fd);
  • fd:要關閉的檔案描述符。

HTTP協議:

HTTP超文字傳輸協議,HTTP協議主要就是用來進行客戶端和伺服器之間進行通訊的標準協議。HTTP主要規定了客戶端如何與伺服器建立連線、客戶端如何從伺服器請求資料、伺服器如何響應請求,以及最後連線如何關閉。

建立連線:根據使用者輸入的URL地址,通過DNS、負載均衡等技術找到一臺伺服器,客戶端與伺服器的80埠建立一個TCP連結

進行請求:客戶端向伺服器傳送訊息,請求URL中指定的頁面,要求執行指定的操作,包括 get post head

響應:伺服器向客戶端傳送響應。響應以狀態碼開頭。

關閉連線:客戶端或服務端都可以關閉連線。每個請求都是用一個單獨的網路連線

缺點:

(1)通訊使用明文不加密,內容可能被竊聽
(2)不驗證通訊方身份,可能遭到偽裝
(3)無法驗證報文完整性,可能被篡改

HTTPS協議:

超文字傳輸安全協議。是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。HTTP和HTTPS是兩個不同的協議。

主要作用:

1)建立一個資訊保安通道,來保證資料傳輸的安全;
2)確認網站的真實性。

HTTP和HTTPS的區別:

1、https協議需要申請證照,一般免費證照較少,因而需要一定費用。
2、http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl(Secure Sockets Layer)加密傳輸協議。
3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

結語:
所有文章已整理成文件,戳我領取更多java基礎知識手冊,也可關注後續發文。

相關文章