1、OSI模型
開放式系統互聯通信參考模型(Open System Interconnection Reference Model,縮寫為OSI),簡稱為OSI模型,該模型是由ISO(國際標準化組織)定義,是個靈活穩健和可互操作的模型,
1.1 OSI七層模型的劃分
OSI定義了網路互連的七層框架(物理層、資料鏈路層、網路層、傳輸層、會話層、表示層、應用層),即ISO開放互連系統參考模型,如下圖,

1.2 常見應用層協議:
| 協議 | 埠 | 說明 |
|---|---|---|
| HTTP | 80 | 超文本傳輸協議 |
| HTTPS | 443 | HTTP+SSL,HTTP的安全版 |
| FTP | 20,21,990 | 檔案傳輸協議 |
| POP3 | 110 | 郵局協議 |
| SMTP | 25 | 簡單郵件傳輸協議 |
| telnet | 23 | 遠程終端協議 |
Socket是在會話層,TCP和UDP是在傳輸層,
OSI是一種理想的網路模型,因此一般網路系統只涉及其中的幾層,很少有系統能夠具有所有的7層,并完全遵循它的規定,
2、TCP/IP連接
在互聯網的通信中,永遠是客戶端主動連接到服務端,主動與服務端斷開連接,
2.1 欄位定義
(1)序列號seq:占4個位元組,用來標記資料段的順序,TCP把連接中發送的所有資料位元組都編上一個序號,第一個位元組的編號由本地隨機產生;給位元組編上序號后,就給每一個報文段指派一個序號;序列號seq就是這個報文段中的第一個位元組的資料編號,
(2)確認號ack:占4個位元組,期待收到對方下一個報文段的第一個資料位元組的序號;序列號表示報文段攜帶資料的第一個位元組的編號;而確認號指的是期望接收到下一個位元組的編號;因此當前報文段最后一個位元組的編號+1即為確認號,
(3)確認ACK:占1位,僅當ACK=1時,確認號欄位才有效,ACK=0時,確認號無效,
(4)同步SYN:連接建立時用于同步序號,當SYN=1,ACK=0時表示:這是一個連接請求報文段,若同意連接,則在回應報文段中使得SYN=1,ACK=1,因此,SYN=1表示這是一個連接請求,或連接接受報文,SYN這個標志位只有在TCP建產連接時才會被置1,握手完成后SYN標志位被置0,
(5)終止FIN:用來釋放一個連接,FIN=1表示:此報文段的發送方的資料已經發送完畢,并要求釋放運輸連接,
注意:ACK、SYN和FIN這些大寫的單詞表示標志位,其值要么是1,要么是0;ack、seq小寫的單詞表示序號,


2.2三次握手


第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,并進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers),
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態,
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手,
2.3 四次斷開


(1)客戶端行程發出連接釋放報文,并且停止發送資料,釋放資料報文首部,FIN=1,其序列號為seq=u(等于前面已經傳送過來的資料的最后一個位元組的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態, TCP規定,FIN報文段即使不攜帶資料,也要消耗一個序號,
(2)服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,并且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態,TCP服務器通知高層的應用行程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態,即客戶端已經沒有資料要發送了,但是服務器若發送資料,客戶端依然要接受,這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間,
(3)客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的資料),
(4)服務器將最后的資料發送完畢后,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由于在半關閉狀態,服務器很可能又發送了一些資料,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認,
(5)客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態,注意此時TCP連接還沒有釋放,必須經過2*MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB(Transmission Control Block,傳輸控制塊,包含了資料發送雙方對應的socket資訊以及擁有裝載資料的緩沖區)后,才進入CLOSED狀態,
(6)服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態,同樣,服務器撤銷TCB后,就結束了這次的TCP連接,可以看到,服務器結束TCP連接的時間要比客戶端早一些,
2.4 面試問題
【問題1】為什么連接的時候是三次握手,關閉的時候卻是四次握手?
答:因為當Server端收到Client端的SYN連接請求報文后,可以直接發送SYN+ACK報文,其中ACK報文是用來應答的,SYN報文是用來同步的,但是關閉連接時,當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”,只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送,故需要四步握手,
【問題2】如果已經建立了連接,但是客戶端突然出現故障了怎么辦?
TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源,服務器每收到一次客戶端的請求后都會重新復位這個計時器,時間通常是設定為2小時,若兩小時還沒有收到客戶端的任何資料,服務器就會發送一個探測報文段,以后每隔75秒鐘發送一次,若一連發送10個探測報文仍然沒反應,服務器就認為客戶端出了故障,接著就關閉連接,
3、SOCKET原理
3.1套接字(socket)概念
套接字(socket)是通信的基石,是支持TCP/IP協議的網路通信的基本操作單元,它是網路通信程序中端點的抽象表示,包含進行網路通信必須的五種資訊:連接使用的協議,本地主機的IP地址,本地行程的協議埠,遠地主機的IP地址,遠地行程的協議埠,
應用層通過傳輸層進行資料通信時,TCP會遇到同時為多個應用程式行程提供并發服務的問題,多個TCP連接或多個應用程式行程可能需要通過同一個 TCP協議埠傳輸資料,為了區別不同的應用程式行程和連接,許多計算機作業系統為應用程式與TCP/IP協議互動提供了套接字(Socket)介面,應用層可以和傳輸層通過Socket介面,區分來自不同應用程式行程或網路連接的通信,實作資料傳輸的并發服務,
3.2 建立socket連接
建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket ,
套接字之間的連接程序分為三個步驟:服務器監聽,客戶端請求,連接確認,
服務器監聽:服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網路狀態,等待客戶端的連接請求,
客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字,為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和埠號,然后就向服務器端套接字提出連接請求,
連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就回應客戶端套接字的請求,建立一個新的執行緒,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接,而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求,
3.3 SOCKET連接與TCP/IP連接
創建Socket連接時,可以指定使用的傳輸層協議,Socket可以支持不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連接時,該Socket連接就是一個TCP連接,
socket則是對TCP/IP協議的封裝和應用(程式員層面上),也可以說,TPC/IP協議是傳輸層協議,主要解決資料 如何在網路中傳輸,而HTTP是應用層協議,主要解決如何包裝資料,關于TCP/IP和HTTP協議的關系,網路有一段比較容易理解的介紹:
“我們在傳輸資料時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別資料內容,如果想要使傳輸的資料有意義,則必須使用到應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議,WEB使用HTTP協議作應用層協議,以封裝HTTP文本資訊,然后使用TCP/IP做傳輸層協議將它發到網路上,”
我們平時說的最多的socket是什么呢,實際上socket是對TCP/IP協議的封裝,Socket本身并不是協議,而是一個呼叫介面(API),通過Socket,我們才能使用TCP/IP協議,
實際上,Socket跟TCP/IP協議沒有必然的聯系,Socket編程介面在設計的時候,就希望也能適應其他的網路協議,所以說,Socket的出現只是使得程式員更方便地使用TCP/IP協議堆疊而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函式介面,比如create、 listen、connect、accept、send、read和write等等,網路有一段關于socket和TCP/IP協議關系的說法比較容易理解:
“TCP/IP只是一個協議堆疊,就像作業系統的運行機制一樣,必須要具體實作,同時還要提供對外的操作介面,這個就像作業系統會提供標準的編程介面,比如win32編程介面一樣,TCP/IP也要提供可供程式員做網路開發所用的介面,這就是Socket編程介面,”
實際上,傳輸層的TCP是基于網路層的IP協議的,而應用層的HTTP協議又是基于傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的介面,socket是對埠通信開發的工具,它要更底層一些.
3.4 Socket連接與HTTP連接
由于通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送資料內容,直到雙方連接斷開,但在實際網路應用中,客戶端到服務器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火墻等,大部分防火墻默認會關閉長時間處于非活躍狀態的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網路,該連接處于活躍狀態,而HTTP連接使用的是“請求—回應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求后,服務器端才能回復資料,很多情況下,需要服務器端主動向客戶端推送資料,保持客戶端與服務器資料的實時與同步,此時若雙方建立的是Socket連接,服務器就可以直接將資料傳送給客戶端;若雙方建立的是HTTP連接,則服務器需要等到客戶端發送一次請求后才能將資料傳回給客戶端,因此,客戶端定時向服務器端發送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的資料,如果有就將資料傳給客戶端,
4、HTTP協議
HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用,
HTTP連接最顯著的特點是客戶端發送的每次請求都需要服務器回送回應,在請求結束后,會主動釋放連接,從建立連接到關閉連接的程序稱為“一次連接”,
(1)在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求后,就自動釋放連接,
(2)在HTTP 1.1中則可以在一次連接中處理多個請求,并且多個請求可以重疊進行,不需要等待一個請求結束后再發送下一個請求,
由于HTTP在每次請求結束后都會主動釋放連接,因此HTTP連接是一種“短連接”,要保持客戶端程式的在線狀態,需要不斷地向服務器發起連接請求,通常的做法是即時不需要獲得任何資料,客戶端也保持每隔一段固定的時間向服務器發送一次“保持連接”的請求,服務器在收到該請求后對客戶端進行回復,表明知道客戶端“在線”,若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網路已經斷開,
4.1 http協議的請求
http協議的報文傳輸的是ASCII碼
請求主要分為三部分:請求行、請求頭、請求體
4.1.1 請求行
第一行,包含三個資訊:請求方式,url,http協議版本
GET 請求
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
POST 請求
POST / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
sex=man&name=Professional
4.1.2 post和get的區別
1、url可見性:
get,引數url可見;
post,url引數不可見
2、資料傳輸上:
get,通過拼接url進行傳遞引數;
post,通過body體傳輸引數
3、快取性:
get,請求是可以快取的
post,請求不可以快取
4、后退頁面的反應
get,請求頁面后退時,不產生影響
post,請求頁面后退時,會重新提交請求
5、傳輸資料的大小
get,一般傳輸資料大小不超過2k-4k(根據瀏覽器不同,限制不一樣,但相差不大)
post,請求傳輸資料的大小根據php.ini 組態檔設定,也可以無限大,
6、安全性
這個也是最不好分析的,原則上post肯定要比get安全,畢竟傳輸引數時url不可見,但也擋不住部分人閑的沒事在那抓包玩,安全性個人覺得是沒多大區別的,防君子不防小人就是這個道理,對傳遞的引數進行加密,其實都一樣,
4.1.3 post和get的本質區別:
GET產生一個TCP資料包;POST產生兩個TCP資料包,
對于GET方式的請求,瀏覽器會把http header和data一并發送出去,服務器回應200(回傳資料);
而對于POST,瀏覽器先發送header,服務器回應100 continue,瀏覽器再發送data,服務器回應200 ok(回傳資料),
4.1.4 請求頭
瀏覽器向服務器發送一些狀態資料,標識資料等等
一個資訊一行,包括資訊名:資訊值 按行分隔
User-Agent: firefox//表示發送請求的瀏覽器(請求代理端)是firefox
Host: shop.100.com//表示請求的主機域名(基于域名的虛擬主機就是靠這個頭判斷的)
Cookie:name=itcast//瀏覽器攜帶的cookie資料,
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
注意,請求頭資訊,需要使用一個空行結束!
4.1.5 請求主體
請求代理端向服務器端,發送的請求資料!
典型的就是POST形式發送的表單資料!
get請求,沒有請求主體部分!get資料是在請求行中的url上進行傳遞的!
4.2 http協議的回應
回應包括:回應行、回應頭、回應體
HTTP/1.1 200 0K
Date: Tue,19 Nov 2013 03:08:55 GMT
Server: Apache/2. 2.22 (Win32) PHP/5.3. 13
X- -Powered -By: PHP/5. 3.13
Content-Length: 16
Content- Type: text/html
4.2.1 回應行
回應行包括:協議版本、狀態碼、狀態訊息
典型的:
1xx:訊息
2xx:成功
3xx:請求被重定向
4xx:瀏覽器端錯誤
5xx:服務器端錯誤
典型:
500 服務器內部錯誤
404 請求的頁面沒有找到
403 沒有權限
200 請求成功
4.2.2 回應頭
Content-Type: text/html 內容型別,告知瀏覽器接下來發送的回應主體資料是什么格式!
Content-Length: 回應主體資料的長度!
Date: 回應的時間,GMT時間!
4.2.3 回應主體
主要的回應資料,在瀏覽器的主體區域顯示的資料都是相應主體!
注意,每行,包括回應行和回應頭,都需要一個 \r\n結尾
5、HTTPS協議
http協議是明文傳輸的,因此很容易被截取和決議,泄漏個人資料,https協議是在http和tcp之間多添加了一層,進行身份驗證和資料加密,
5.1 密碼學基礎
(1)明文: 明文指的是未被加密過的原始資料,
(2)密文:明文被某種加密演算法加密之后,會變成密文,從而確保原始資料的安全,密文也可以被解密,得到原始的明文,
(3)密鑰:密鑰是一種引數,它是在明文轉換為密文或將密文轉換為明文的演算法中輸入的引數,密鑰分為對稱密鑰與非對稱密鑰,分別應用在對稱加密和非對稱加密上,
(4)對稱加密:對稱加密又叫做私鑰加密,即資訊的發送方和接收方使用同一個密鑰去加密和解密資料,
對稱加密的特點是演算法公開、加密和解密速度快,適合于對大資料量進行加密,常見的對稱加密演算法有DES、3DES、TDEA、Blowfish、RC5和IDEA,
其加密程序如下:明文 + 加密演算法 + 私鑰 => 密文
解密程序如下: 密文 + 解密演算法 + 私鑰 => 明文
對稱加密中用到的密鑰叫做私鑰,私鑰表示個人私有的密鑰,即該密鑰不能被泄露,
其加密程序中的私鑰與解密程序中用到的私鑰是同一個密鑰,這也是稱加密之所以稱之為“對稱”的原因,由于對稱加密的演算法是公開的,所以一旦私鑰被泄露,那么密文就很容易被破解,所以對稱加密的缺點是密鑰安全管理困難,
(5)非對稱加密:非對稱加密也叫做公鑰加密,非對稱加密與對稱加密相比,其安全性更好,對稱加密的通信雙方使用相同的密鑰,如果一方的密鑰遭泄露,那么整個通信就會被破解,而非對稱加密使用一對密鑰,即公鑰和私鑰,且二者成對出現,私鑰被自己保存,不能對外泄露,公鑰指的是公共的密鑰,任何人都可以獲得該密鑰,用公鑰或私鑰中的任何一個進行加密,用另一個進行解密,
被公鑰加密過的密文只能被私鑰解密,程序如下:
明文 + 加密演算法 + 公鑰 => 密文, 密文 + 解密演算法 + 私鑰 => 明文
被私鑰加密過的密文只能被公鑰解密,程序如下:
明文 + 加密演算法 + 私鑰 => 密文, 密文 + 解密演算法 + 公鑰 => 明文
由于加密和解密使用了兩個不同的密鑰,這就是非對稱加密“非對稱”的原因,
非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量資料進行加密,
在非對稱加密中使用的主要演算法有:RSA、Elgamal、Rabin、D-H、ECC(橢圓曲線加密演算法)等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/316540.html
標籤:其他
