Java 面試之計算機網路
阿新 • • 發佈:2019-01-22
OSI與TCP/IP各層
TCP、HTTP
TCP與HTTP的報文結構
TCP三次握手、四次揮手
TCP三次握手(建立連線)
- 第一次握手:客戶端向伺服器傳送SYN(seq=j)包到伺服器;
- 第二次握手:伺服器收到SYN包,向客戶端傳送ACK包(ack=j+1)和SYN包(seq=k);
- 第三次握手:客戶端收到SYN+ACK包,向伺服器傳送ACK包(ack=k+1),完成三次握手。
TCP四次揮手(終止連線)
- 第一次揮手:客戶端向伺服器傳送FIN包(seq=j),關閉客戶到伺服器的資料傳送;
- 第二次揮手:伺服器收到FIN包,向客戶端傳送ACK包(ack=j+1);
- 第三次揮手:伺服器向客戶端傳送FIN包(seq=k);
- 第四次揮手:客戶端收到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中,基於二進位制解析,可多路複用,多個請求可同時在一個連線上並行處理。
Forward與Redirect
- 直接轉發(Forward):也稱轉發,瀏覽器發出請求,伺服器把響應內容讀取過來,然後再把這些內容發給瀏覽器。位址列顯示原來的URL。
- 間接轉發(Redirect):也稱重定向,瀏覽器發出請求,伺服器端在響應第一次請求的時候,讓瀏覽器向另一個地址發出請求,然後得到響應。位址列顯示新的URL。
Cookie與Session
- Cookie:為了辨別使用者身份而儲存在客戶端的資料。伺服器在Http響應頭中新增Set-Cookie資訊,瀏覽器收到響應後會根據頭中的欄位儲存Cookie,下一次訪問時在請求頭中附帶Cookie內容,供伺服器根據Cookie值進行後續處理。
- Session:為了儲存使用者資訊而儲存在服務端的資料。當客戶端第一次訪問時,伺服器會計算出一個sessionID,建立一個對應的Session物件並存儲;然後將sessionID儲存至瀏覽器Cookie,下一次訪問時伺服器根據sessionID來匹配Session,Session中可以存一些鍵值對。
Cookie最典型的應用是:①判斷使用者是否登陸過網站,以便下次登入時能夠直接登入。②購物車資訊處理。
訪問一個網頁全過程
- 輸入URL;
- DNS將域名解析成IP地址;
- 建立TCP連線;
- OSPF(內部閘道器協議)決定經過哪些路由器,ARP(地址解析協議)負責求下一個節點地址;
- 傳送HTTP請求;
- 得到響應,展現HTML介面。
使用Socket通訊的幾個關鍵函式
- 初始化socket:
int socket(int domain, int type, int protocol);
- domain :指定通訊協議族。
- type:指定socket型別。
- protocol :協議型別。
- 返回值:成功返回非負整數。
- 繫結埠:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfd:socket函式返回的套接字。
- addr:要繫結的地址。
- addrlen:地址長度。
- 返回值:成功返回0,失敗返回-1。
- 監聽埠:
int listen(int sockfd, int backlog);
- sockfd:socket函式返回的套接字。
- backlog:已完成三次握手的最大連線個數。
- 返回值:成功返回0,失敗返回-1。
- 響應連線請求:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- sockfd:伺服器套接字。
- addr:將返回對等方的套接字地址。
- addrlen:返回對等方的套接字地址長度。
- 返回值:成功返回非負整數,失敗返回-1。
- 建立連線:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfd:未連線套接字。
- addr:要連線的套接字地址。
- addrlen:第二個引數addr長度。
- 返回值:成功返回0,失敗返回-1。
IP地址分類
交換機與路由器區別
比較點 | 交換機 | 路由器 |
---|---|---|
作用 | 用於網路內部資料交換 | 用於不同網路間資料傳輸 |
工作層 | 資料鏈路層 | 網路層 |
處理方式 | 硬體處理 | 軟體處理 |
工作依靠 | MAC地址 | IP地址 |