"TCP/IP" "TCP/IP模型" "TCP三次握手與四次握手" "TCP 如何保證可靠傳輸" "HTTP協議" "基本介紹" "工作原理" "HTTP特性" "請求方法" "HTTP 狀態碼" "URL" "HTTP與HTTPS的區別" "RESTful" TCP/IP TCP/IP模型 TC ...
TCP/IP
TCP/IP模型
TCP/IP不是一個協議,而是一個協議族模型,裡面包括4個層:應用層,傳輸層,網路層與數據層(被視為OSI七層模型的簡化版)
HTTP,TCP,IP在網路中分屬不同的層。
應用層:HTTP,FTP,POP,SMTP等就屬於這個層。應用層主要主要向用戶提供一組應用程式,比如郵件發送,遠程登錄等
- DNS(功能變數名稱系統)是一個將功能變數名稱和IP地址相互映射的分散式資料庫,它可以使人更方便的訪問互聯網(使用功能變數名稱),而不用記住IP數串。
- HTTP(超文本傳輸協議)是互聯網上應用最廣泛的協議,所有萬維網的文件必須遵守該協議。設計HTTP最初的目的是為了傳輸和接收HTML頁面。
傳輸層:TCP和UDP屬於這個層,該層用於提供兩個節點間的數據傳輸。
- TCP:
- 面向連接(需要手動建立連接,確保連接通暢才會傳輸,網路設備會預留資源以確保連接通暢,通信完成後釋放連接)
- TCP連接只能有兩個端點,因此TCP連接只能一對一。
- TCP提供可靠傳輸:不重覆,不丟失,無錯序。(面向連接協議中發送端和接收端都會記錄發送和接收的狀態)
- UDP:
- 無連接(不需要事先建立連接,接收方也不會確認,無法提供可靠傳輸)
- UDP沒有阻塞控制,因此網路儘管出現阻塞也不會降低傳輸速率。
- UDP支持一對多,多對多,一對一,多對一的傳輸。
- UDP提供最大努力傳輸:不保證數據可以成功傳送(無連接的數據包每次發送的狀態彼此之間獨立,不記錄)
無連接的優點:速度快(沒有阻塞控制,也省了許多保證可靠傳輸的機制);可以實現多對一,一對多,多對多(面向連接的需要多個獨立連接才能做到);且無連接是實現面向連接的基礎(IP是無連接的,它是構建TCP/IP的基礎)
網路層:IP屬於這個層。網路層包括地址管理與路由選擇,它決定數據通過什麼路徑來到達另一端。在這層數據被稱為數據包。
網路介面層:通常包括操作系統中的設備驅動程式和電腦中對應的網路介面卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理介面細節。
TCP三次握手與四次握手
三次握手目的是建立可靠的連接。這三次是確認雙方都能正確發送並接收對方信息的最小次數。
第一次握手:客戶端發送帶有SYN標誌的數據包到服務端,服務端可以由此確認自己正常接收了數據,也可以確認客戶端正確發送了數據。但客戶端無法確認任何事。
第二次握手,服務端發送帶有SYN/ACK標誌的數據包到客戶端,證明瞭自己發送數據功能正常。客戶端知道了自己接收發送功能都正常,也知道了服務端接收發送都正常,但服務端不知道客戶端的接收功能是否正常,也不知道自己的發送功能是否正常。
第三次握手,客戶端發送帶有ACK標誌給服務端,至此雙方都確認了自己和對方接收、發送功能正常,連接正式建立。
SYN是客戶端到服務端的確認標誌;而ACK是反過來的確認標誌。在TCP連接中,兩者互相發送信息必須都無誤才行。
之所以是三次握手而不是兩次握手,主要原因是:如果客戶端之前發了一個SYN,但是滯留在網路中沒有傳到服務端。如果只有兩次握手,那麼服務端之後如果收到這個過時請求不會再向客戶端確認,而是直接建立連接,那麼會白白浪費資源。
斷開一個TCP連接需要四次揮手:
第一次揮手:客戶端發送帶FIN標誌的數據包給服務端,告訴服務端客戶端已停止傳送數據。
第二次揮手:服務端發回客戶端ACK,併進入CLOSE_WAIT狀態,表示知道了。此時從客戶端到服務端的傳輸通道關閉。(但反向通道沒有關閉,於是此時連接處於半關閉狀態)
第三次揮手:等到服務端的數據發送完畢後,它會再給客戶端發一個FIN。
第四次揮手:客戶端收到後返給服務端ACK,服務端收到後正式關閉通道。而客戶端需要等待一段時間後再進入CLOSE狀態。
之所以服務端不能在接收到ACK後立刻返回FIN,是因為終止數據傳輸的指令是上層應用層下達的,客戶端只能終結自己這邊的傳輸通道,而服務端的數據可能還沒有傳完。
最後,當客戶端最終發給服務端ACK之後並不是馬上CLOSE,而是等一段時間(通常是報文最大壽命時間),有兩個原因:
- 第一,因為它需要確認服務端收到了ACK之後才會正式關閉。如果服務端沒有收到ACK的話會重新發送給客戶端FIN,然後客戶端會再發一次ACK,並重新計時。
- 第二,它可以消滅所有殘留的報文。這也是規避掉可能有滯留在網路的過時報文進入新的請求的情況。
TCP 如何保證可靠傳輸
- 應用數據被分割成TCP認為最適合發送的數據塊。
- TCP給發送的每一個包進行編號,接收方對數據包進行排序,把有序數據傳送給應用層。
- 校驗和:TCP 將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP 將丟棄這個報文段和不確認收到此報文段。
TCP 的接收端會丟棄重覆的數據。 - 流量控制:TCP連接的每一方都有固定大小的緩衝空間,TCP的接收端只允許發送端發送接收端緩衝區能接納的數據。當接收方來不及處理髮送方的數據,能提示發送方降低發送的速率,防止包丟失。TCP 使用的流量控制協議是可變大小的滑動視窗協議。 (TCP 利用滑動視窗實現流量控制)
- 擁塞控制:當網路擁塞時,減少數據的發送。
- 停止等待協議:也是為了實現可靠傳輸的,它的基本原理就是每發完一個分組就停止發送,等待對方確認。在收到確認後再發下一個分組。
- 超時重傳: 當TCP發出一個報文段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。
HTTP協議
基本介紹
HTTP 是一個客戶端終端和伺服器端請求和應答的標準,是基於TCP/IP之上的應用層協議。通過使用瀏覽器、網路爬蟲等工具,客戶端發起了一個請求到伺服器上指定埠,我們稱這個客戶端為用戶代理程式。應答的伺服器上會存儲一些資源,我們稱這個應答伺服器為源伺服器。在用戶代理和源伺服器之間有很多中間層,比如代理伺服器、網關、隧道等。
工作原理
- 客戶端(通常是瀏覽器)通過DNS查找到功能變數名稱對應的IP地址。
- 根據IP地址,HTTP客戶端與Web伺服器的HTTP埠(預設為80)建立一個TCP連接。
- 通過TCP連接,客戶端發送一個HTTP請求報文。
- 伺服器接收請求,根據提供的參數,cookies等信息再生成HTTP響應,並將資源副本(通常是HTML)寫到TCP套接字,由客戶端讀取。
- 釋放TCP連接
- 客戶端瀏覽器解析HTML內容。
例如:在瀏覽器地址欄輸入一個url,回車後所經歷的流程如下:
- 瀏覽器向DNS伺服器請求解析該url中對應的IP地址。
- 解析到IP地址後,根據IP地址和埠號,和對應伺服器建立TCP連接。
- 瀏覽器發出讀取文件(URL中功能變數名稱後面部分)的HTTP請求。該請求報文作為TCP三次握手的第三個報文的數據發送給伺服器。
- 伺服器對瀏覽器請求做出響應,並把對應的html文本發送給瀏覽器。
- 釋放TCP連接
- 瀏覽器解析並顯示html內容。
HTTP特性
- 基於請求-響應模式
HTTP協議規定,請求由客戶端發出,然後伺服器端進行響應。如果客戶端沒有請求,伺服器端也不會響應。 - 無狀態
HTTP協議自身不對請求和響應之間的通信狀態進行保存。也就是說,如果該事務後續處理要求前邊的信息,則必須要重新傳輸。這樣的好處時當每個事務是獨立的時,它的響應速度會很快,但也意味著如果事務間有聯繫的話則需要傳入重覆的數據。對此引入cookies技術,該技術可以保持一個狀態(比如用戶登錄了網站,但是他跳轉的同時需要保持登錄狀態)。 - 無連接
無連接意味著伺服器一次鏈接處理一個請求,當完成響應並且得到客戶端應答後即斷開。採用這種方式可以節省傳輸時間,並且提高併發性能。
請求方法
HTTP定義了八種方法來操作指定的資源:
- GET:請求指定的資源,並返回實體本體。
- HEAD:也是請求指定資源,但不會返回具體內容,用於獲取報頭。
- POST:向指定資源提交數據。(這個請求可能會導致新資源的創建或者舊資源的修改)
- PUT:向指定資源位置上傳其最新內容。
- DELETE:請求伺服器刪除指定的數據。
- TRACE:回顯服務請求,用於測試診斷。
- OPTION: 這個方法可使伺服器傳回該資源所支持的所有HTTP請求方法,允許客戶端查看伺服器是否正常運行。
- HTTP/1.1協議中預留給能夠將連接改為管道方式的代理伺服器。
HTTP 狀態碼
1xxx(信息):請求已伺服器接收,繼續處理。
2xxx(成功):請求已被伺服器成功接收,理解。
3xxx(重定向):需要後續操作。
4xxx(客戶端錯誤):請求無法實現。
5xxx(伺服器錯誤):伺服器在實現某個正常請求時出現問題
常見狀態碼:
200 OK: 請求成功
301 Moved permanently:永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替
400 Bad request:請求有語法錯誤,伺服器無法理解
402 Unauthorized:請求要求用戶的身份認證
403 Forbidden:伺服器理解請求客戶端的請求,但是拒絕執行此請求
404 Not Found:伺服器無法根據客戶端的請求找到資源(網頁)。
500 Internal Server Error:伺服器內部錯誤,無法完成請求
URL
URL,全稱是Uniform Resource Locator, 中文叫統一資源定位符,是互聯網上用來標識某一處資源的地址。
以下是一個url應有的格式:
http://www.mmm.com:80/max?name=max&age=26#first
- http表示協議;
- www.mmm.com表示功能變數名稱部分(也可以直接使用IP地址)
- :80是一個埠部分,如果省略的話則使用預設埠。
- /max表示虛擬路徑部分,從第一個/開始到?為止,包括目錄與文件名。
- ?開始之後表示參數部分,有兩種方法設置參數:
- 以?開始,以&進行參數分割,以=匹配鍵和值:
http://120.0.0.1:8000/admin?name=max&age=30 - 用分隔符來分
http://120.0.0.1:8000/admin/max/30 #(感覺容易和路徑混淆。)
- 以?開始,以&進行參數分割,以=匹配鍵和值:
-
到最後是錨部分(不是必須的)
HTTP與HTTPS的區別
HTTP以明文形式在瀏覽器和伺服器之間傳遞信息,不提供加密。如果攻擊者截取了報文,則可以直接竊取信息。
HTTPS則在HTTP的基礎上添加了SSL加密協議。SSL依靠證書來驗證伺服器的身份,並且為客戶端與服務端的通信提供加密。HTTPS協議更安全,但是在握手時也更耗時。
RESTful
什麼是REST?
Representation State Transfer:表現層狀態轉化。
表現層意思是“資源的表現方法”,比如文本的表現方法是txt文件,圖片的表現方法是jpg等。而狀態轉化的意思是“通過某種手段讓伺服器發生變化”。這種手段就是HTTP協議操作。綜上所述,REST的意思是:
- Resources:使用URL定位資源。
- Representation:在客戶端與服務端,傳遞資源的表現層
- State Transfer:使用4個HTTP動詞(GET,POST,PUT,DELETE)對伺服器進行操作。
REST是網路中client與server之間的交互風格,REST本身不實用,實用的是如何寫出RESTful的API。
- URI使用名詞而不是動詞,且名詞最好是複數。
- 具體動詞使用HTTP的操作符GET,POST等
- 使用HTTP status code 來傳遞狀態信息,比如404什麼的。
- 傳遞資源的某種表現形式(比如json,html,jpg等)