1. 程式人生 > >Java 面試之計算機網路

Java 面試之計算機網路

OSI與TCP/IP各層

OSI與TCP/IP結構

TCP、HTTP

TCP與HTTP的報文結構

tcp報文結構
http報文結構

TCP三次握手、四次揮手

TCP三次握手(建立連線)

  1. 第一次握手:客戶端向伺服器傳送SYN(seq=j)包到伺服器;
  2. 第二次握手:伺服器收到SYN包,向客戶端傳送ACK包(ack=j+1)和SYN包(seq=k);
  3. 第三次握手:客戶端收到SYN+ACK包,向伺服器傳送ACK包(ack=k+1),完成三次握手。
    三次握手

TCP四次揮手(終止連線)

  1. 第一次揮手:客戶端向伺服器傳送FIN包(seq=j),關閉客戶到伺服器的資料傳送;
  2. 第二次揮手:伺服器收到FIN包,向客戶端傳送ACK包(ack=j+1);
  3. 第三次揮手:伺服器向客戶端傳送FIN包(seq=k);
  4. 第四次揮手:客戶端收到FIN包,向客戶端傳送ACK包(ack=k+1),完成四次揮手。
    四次揮手

為什麼TCP連線是3次而終止是4次

  連線時,服務端收到SYN後,把ACK和SYN一起打包回發給客戶端,只有3次。
  終止時,由於TCP連線是全雙工的,每個方向都必須單獨進行關閉,即FIN和ACK是分開發送的,所以有4次。
  當一方完成它的資料傳送任務後,傳送一個FIN來終止連線。但收到一個FIN只表示對方沒有資料傳送,而己方仍能傳送資料。因此必須單獨關閉。

HTTP相關

HTTP的狀態碼含義

分類 描述
1xx 資訊,伺服器收到請求,需要請求者繼續執行操作
2xx 成功,操作被成功接收並處理
3xx 重定向,需要進一步的操作以完成請求
4xx 請求錯誤,請求包含語法錯誤或無法完成請求
5xx 伺服器錯誤,伺服器在處理請求時發生錯誤

HTTP Request的幾種型別

型別 描述 冪等性 安全性
POST 向指定資源提交資料進行處理請求(例如提交表單或上傳檔案)
PUT 向指定資源位置上傳其最新內容
DELETE 請求伺服器刪除所標識的資源
GET 向特定的資源發出請求
HEAD 向伺服器索要與GET請求相一致的響應,不過響應體不會被返回
OPTIONS 返回伺服器針對特定資源所支援的HTTP請求方法
TRACE 回顯伺服器收到的請求,主要用於測試或診斷 - -
CONNECT HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器 - -

冪等性指該方法多次呼叫最終資源狀態是一樣的。
安全性指訪問資源的時候資源本身不會發生改變。

HTTP 1.0、HTTP1.1、HTTP2.0

  • HTTP 1.0中,客戶端的每次請求都要建立一次單獨的連線,在處理完本次請求後,就自動釋放連線。
  • HTTP 1.1中,支援長連線流水線請求處理,在一個TCP連線上可以傳送多個HTTP請求和響應,若干個請求序列化單執行緒處理。
  • HTTP2.0中,基於二進位制解析,可多路複用,多個請求可同時在一個連線上並行處理

HTTP比較

Forward與Redirect

  • 直接轉發(Forward):也稱轉發,瀏覽器發出請求,伺服器把響應內容讀取過來,然後再把這些內容發給瀏覽器。位址列顯示原來的URL
  • 間接轉發(Redirect):也稱重定向,瀏覽器發出請求,伺服器端在響應第一次請求的時候,讓瀏覽器向另一個地址發出請求,然後得到響應。位址列顯示新的URL

Cookie與Session

  • Cookie:為了辨別使用者身份而儲存在客戶端的資料。伺服器在Http響應頭中新增Set-Cookie資訊,瀏覽器收到響應後會根據頭中的欄位儲存Cookie,下一次訪問時在請求頭中附帶Cookie內容,供伺服器根據Cookie值進行後續處理。
  • Session:為了儲存使用者資訊而儲存在服務端的資料。當客戶端第一次訪問時,伺服器會計算出一個sessionID,建立一個對應的Session物件並存儲;然後將sessionID儲存至瀏覽器Cookie,下一次訪問時伺服器根據sessionID來匹配Session,Session中可以存一些鍵值對。

Cookie最典型的應用是:①判斷使用者是否登陸過網站,以便下次登入時能夠直接登入。②購物車資訊處理。

訪問一個網頁全過程

  1. 輸入URL;
  2. DNS將域名解析成IP地址;
  3. 建立TCP連線;
  4. OSPF(內部閘道器協議)決定經過哪些路由器,ARP(地址解析協議)負責求下一個節點地址;
  5. 傳送HTTP請求;
  6. 得到響應,展現HTML介面。

使用Socket通訊的幾個關鍵函式

  1. 初始化socket:int socket(int domain, int type, int protocol);
    • domain :指定通訊協議族。
    • type:指定socket型別。
    • protocol :協議型別。
    • 返回值:成功返回非負整數。
  2. 繫結埠:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    • sockfd:socket函式返回的套接字。
    • addr:要繫結的地址。
    • addrlen:地址長度。
    • 返回值:成功返回0,失敗返回-1。
  3. 監聽埠:int listen(int sockfd, int backlog);
    • sockfd:socket函式返回的套接字。
    • backlog:已完成三次握手的最大連線個數。
    • 返回值:成功返回0,失敗返回-1。
  4. 響應連線請求:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    • sockfd:伺服器套接字。
    • addr:將返回對等方的套接字地址。
    • addrlen:返回對等方的套接字地址長度。
    • 返回值:成功返回非負整數,失敗返回-1。
  5. 建立連線:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    • sockfd:未連線套接字。
    • addr:要連線的套接字地址。
    • addrlen:第二個引數addr長度。
    • 返回值:成功返回0,失敗返回-1。

IP地址分類

IP地址分類

交換機與路由器區別

比較點 交換機 路由器
作用 用於網路內部資料交換 用於不同網路間資料傳輸
工作層 資料鏈路層 網路層
處理方式 硬體處理 軟體處理
工作依靠 MAC地址 IP地址