- 一些術語匯總
- 并發與并行
- TCP/IP
- TCP/IP模型
- TCP三次握手與四次握手
- TCP 如何保證可靠傳輸
- HTTP協議
- 基本介紹
- 作業原理
- HTTP特性
- HTTP請求Request和回應Response格式
- 請求方法
- HTTP 狀態碼
- URL
- HTTP與HTTPS的區別
- RESTful
一些術語匯總
并發與并行
這倆是不同的喲......
并發:輪流處理多任務,(兩個隊伍在排隊進一家咖啡廳,咖啡廳就一個門)
并行:同時處理多任務,(兩個隊伍在排隊進一家咖啡廳,咖啡廳有兩個門,每隊排一個門)
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的keep-alive(長連接),會在完成回應后等一段時間再開始關閉連接,如果還有http請求則保持連接,這樣在一個TCP連接中可以發送多個資料,減少了揮手中TIME_WAIT的時間(更少的TCP連接意味著更少的系統內核呼叫,或者說socket中accpet和close的呼叫),但是,如果keep-alive的時間過長則也會導致資源浪費)
(http和TCP都有keep-alive機制,意圖不一樣,TCP 的keep—alive機制會在最后一次傳輸完畢http之后過一段時間發給客戶端一個確認包,以確保連接正常,如果客戶端給出了回應,則表示連接依舊正常,不釋放TCP連接)
還有一種并發連接:其實就是并發的短鏈接:)

HTTP請求Request和回應Response格式
Request包含四部分:請求行,請求頭部,空行,請求資料

舉例(一個GET請求)
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
上面的例子中,第一行為請求行,先標明是GET方法,后面是URL以及協議版本,
下面幾行都是請求頭部,用來標明服務器要使用的附加資訊,
該請求沒有請求資料,所以資料行為空
要注意的是,GET會把請求資料放在url中,而POST則會放在請求資料行中,因此,GET方法請求資料會顯示給客戶端,而POST不會,所以使用GET提交資料是不安全的,
Response 包括三部分:狀態行,回應報頭,空行,回應正文

舉例:
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
第一行為狀態行,表名協議版本以及狀態碼
后面兩行data和content-type則是回應報頭,用于輸出客戶端需要的一些額外資訊,
空行之后,則是相應正文(html)
請求方法
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等)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/144255.html
標籤:Python
上一篇:通過Final修飾的String真的不可以修改嘛??
下一篇:Python基礎-01變數
