天天看點

網絡協定HTTP TCP與UDP 浏覽器緩存 Restful(十)

一 TCP網絡協定

1 建立TCP連接配接:三次握手原則

  1. 用戶端通過向伺服器端發送一個SYN來建立一個主動打開,作為三次握手的一部分。用戶端把這段連接配接的序号設定為随機數 A。
  2. 伺服器端應當為一個合法的SYN回送一個SYN/ACK。ACK 的确認碼應為 A+1,SYN/ACK 包本身又有一個随機序号 B。
  3. 最後,用戶端再發送一個ACK。當服務端受到這個ACK的時候,就完成了三路握手,并進入了連接配接建立狀态。此時包序号被設定為收到的确認号 A+1,而響應則為 B+1。

2 斷開連接配接: 四次揮手原則

  1. 用戶端發送一個資料分段, 其中的 FIN 标記設定為1. 用戶端進入 FIN-WAIT 狀态. 該狀态下用戶端隻接收資料, 不再發送資料.
  2. 伺服器接收到帶有 FIN = 1 的資料分段, 發送帶有 ACK = 1 的剩餘資料分段, 确認收到用戶端發來的 FIN 資訊.
  3. 伺服器等到所有資料傳輸結束, 向用戶端發送一個帶有 FIN = 1 的資料分段, 并進入 CLOSE-WAIT 狀态, 等待用戶端發來帶有 ACK = 1 的确認封包.
  4. 用戶端收到伺服器發來帶有 FIN = 1 的封包, 傳回 ACK = 1 的封包确認, 為了防止伺服器端未收到需要重發, 進入 TIME-WAIT 狀态. 伺服器接收到封包後關閉連接配接. 用戶端等待 2MSL 後未收到回複, 則認為伺服器成功關閉, 用戶端關閉連接配接.

ARP協定 : 位址解析協定(Address Resolution Protocol),其基本功能為透過目标裝置的IP位址,查詢目标的MAC位址,以保證通信的順利進行.

二 GET 與 Post

GET和POST是什麼?HTTP協定中的兩種發送請求的方法。

HTTP的底層是TCP/IP。是以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP連結。GET和POST能做的事情是一樣一樣的。你要給GET加上request body,給POST帶上url參數,技術上是完全行的通的。

​ 在我大網際網路世界中,TCP就像汽車,我們用TCP來運輸資料,它很可靠,從來不會發生丢件少件的現象。但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統一定會癱瘓。為了避免這種情況發生,交通規則HTTP誕生了。HTTP給汽車運輸設定了好幾個服務類别,有GET, POST, PUT, DELETE等等,HTTP規定,當執行GET請求的時候,要給汽車貼上GET的标簽(設定method為GET),而且要求把傳送的資料放在車頂上(url中)以友善記錄。如果是POST請求,就要在車上貼上POST的标簽,并把貨物放在車廂裡。當然,你也可以在GET的時候往車廂内偷偷藏點貨物,但是這是很不光彩;也可以在POST的時候在車頂上也放一些資料,讓人覺得傻乎乎的。HTTP隻是個行為準則,是約定,而TCP才是GET和POST怎麼實作的基本。

注意:

是以,GET和POST本質上就是TCP連結,并無差别。但是由于HTTP的規定和浏覽器/伺服器的限制,導緻他們在應用過程中展現出一些不同。

GET和POST還有一個重大差別:

GET産生一個TCP資料包;POST産生兩個TCP資料包。

解釋:

對于GET方式的請求,浏覽器會把http header和data一并發送出去,伺服器響應200(傳回資料);

對于POST浏覽器先發送header,伺服器響應100 continue,浏覽器再發送data,伺服器響應200 ok(傳回資料)。

也就是說,GET隻需要汽車跑一趟就把貨送到了,而POST得跑兩趟,第一趟,先去和伺服器打個招呼“嗨,我等下要送一批貨來,你們打開門迎接我”,然後再回頭把貨送過去。

注意:
  1. GET與POST都有自己的語義,不能随便混用。
  2. 據研究,在網絡環境好的情況下,發一次包的時間和發兩次包的時間差别基本可以無視。而在網絡環境差的情況下,兩次包的TCP在驗證資料包完整性上,有非常大的優點。
  3. 并不是所有浏覽器都會在POST中發送兩次包,Firefox就隻發送一次。

三 Apache與nginx

nginx 優點:

  • 輕量級,同樣起web 服務,比apache 占用更少的記憶體及資源
  • 抗并發,nginx 處理請求是異步非阻塞的,支援更多的并發連接配接,而apache 則是阻塞型的,在高并發下nginx 能保持低資源低消耗高性能
  • 配置簡潔
  • 高度子產品化的設計,編寫子產品相對簡單
  • 社群活躍

apache 優點:

  • rewrite ,比nginx 的rewrite 強大
  • 子產品超多,基本想到的都可以找到
  • 少bug ,nginx 的bug 相對較多
  • 超穩定

網站的使用者密碼存儲

  1. 明文hash後儲存,如md5
  2. MD5+Salt方式,這個salt可以随機
  3. 其他加密方式

HTTP與HTTPS

狀态碼 定義
1xx 報告 接收到請求,繼續程序
2xx 成功 步驟成功接收,被了解,并被接受
3xx 重定向 為了完成請求,必須采取進一步措施
4xx 用戶端出錯 請求包括錯的順序或不能完成
5xx 伺服器出錯 伺服器無法完成顯然有效的請求

xsrf與xss

  • CSRF(Cross-site request forgery)跨站請求僞造,CSRF重點在請求
  • XSS(Cross Site Scripting)跨站腳本攻擊,XSS重點在腳本

四 RESTful (Representational State Transfer)

RESTful架構:

(1)每一個URI代表一種資源;

(2)用戶端和伺服器之間,傳遞這種資源的某種表現層;

(3)用戶端通過四個HTTP動詞,對伺服器端資源進行操作,實作”表現層狀态轉化”。

GET用擷取資源,POST用來建立資源(或用于更新資源),PUT用來更新資源,DELETE用來删除資源。

RPC(Remote Procedure Call Protocol)——遠端過程調用協定,它是一種通過網絡從遠端計算機程式上請求服務,而不需要了解底層網絡技術的協定

SOAP(原為Simple Object Access Protocol的首字母縮寫,即簡單對象通路協定)是交換資料的一種協定規範,使用在計算機網絡Web服務(web service)中,交換帶結構資訊

進化的順序: RPC -> SOAP -> RESTful

CGI與WSGI

CGI是通用網關接口,是連接配接web伺服器和應用程式的接口,使用者通過CGI來擷取動态資料或檔案等。

CGI程式是一個獨立的程式,它可以用幾乎所有語言來寫,包括perl,c,lua,python等等。

WSGI, Web Server Gateway Interface,是Python應用程式或架構和Web伺服器之間的一種接口,WSGI的其中一個目的就是讓使用者可以用統一的語言(Python)編寫前後端。

中間人攻擊(Man-in-the-middle attack,通常縮寫為MITM)是指攻擊者與通訊的兩端分别建立獨立的聯系,并交換其所收到的資料,使通訊的兩端認為他們正在通過一個私密的連接配接與對方直接對話,但事實上整個會話都被攻擊者完全控制。

五 TCP/IP 與 UDP

TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協定/網間協定,是一個工業标準的協定集,它是為廣域網(WANs)設計的。

UDP(User Data Protocol,使用者資料報協定)是與TCP相對應的協定。它是屬于TCP/IP協定族中的一種。

這裡有一張圖,表明了這些協定的關系。

TCP/IP協定族包括運輸層、網絡層、鍊路層。現在你知道TCP/IP與UDP的關系了吧。

Socket在哪裡呢?

Socket是什麼呢?

​ Socket是應用層與TCP/IP協定族通信的中間軟體抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協定族隐藏在Socket接口後面,對使用者來說,一組簡單的接口就是全部,讓Socket去組織資料,以符合指定的協定。

TCP服務端

'''
通路伺服器的步驟:
1 建立伺服器serviceScoket
  socket.socket(協定版本,傳輸方式)
2 綁定伺服器位址
  serviceScoket.bind(ip位址,短号)
3 給伺服器設定監聽器(用戶端的數量)
  serviceScoket.listen(用戶端連接配接的數量)
4 等待用戶端的連接配接
  serviceScoket.accept()
5 接受用戶端的請求
  recv(大小)
6 伺服器發送資料給用戶端
  send(資料)
'''

import socket
#建立伺服器
serviceScoket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#綁定伺服器位址(ip,端口号)
serviceScoket.bind(('10.31.162.26',21334))
#給伺服器設定監聽,可以連入的用戶端數量
serviceScoket.listen(5)

print('等待用戶端接入')
#等待用戶端接入
#sock是客服端的socket資訊
#addr是用戶端的位址(ip與端口)
sock,addr = serviceScoket.accept()
print('sock:%s'%sock)
print(addr)
print('用戶端已接入')

#接收用戶端請求
while True:
    recvData = sock.recv(1024)
    print('用戶端說:%s'%(recvData.decode('utf-8')))
    sendData = input('伺服器說:')
    #發送(回複)資料給用戶端
    sock.send(sendData.encode('utf-8'))
           

TCP用戶端

import socket
clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientSocket.connect(('10.31.162.91',2223))

while True:

    sendData = input('用戶端說:')
    clientSocket.send(sendData.encode('utf-8'))

    recvData = clientSocket.recv(1024)
    print('伺服器說:%s'%recvData.decode('utf-8'))
           

UDP服務端

import socket
#建立伺服器
udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

#給伺服器綁定位址
udpSocket.bind(('10.31.162.26',21334))

while True:
    data,address = udpSocket.recvfrom(1024)

    print('用戶端說:%s'%data.decode('utf-8'))
    sendData = input('伺服器說:')
    #發送消息
    udpSocket.sendto(sendData.encode('utf-8'),address)           

UDP用戶端

import socket
clientUdpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
    sendData = input('用戶端說:')
    clientUdpSocket.sendto(sendData.encode('utf-8'),('10.31.162.26',21334))

    recvData,add = clientUdpSocket.recvfrom(1024)
    print('伺服器說:%s'%recvData)
    print(add)           

六 浏覽器的緩存機制

Expires政策

Expires是Web伺服器響應消息頭字段,在響應http請求時告訴浏覽器在過期時間前浏覽器可以直接從浏覽器緩存取資料,而無需再次請求。

Cache-control政策

Cache-Control與Expires的作用一緻,都是指明目前資源的有效期,控制浏覽器是否直接從浏覽器緩存取資料還是重新發請求到伺服器取資料。隻不過Cache-Control的選擇更多,設定更細緻,如果同時設定的話,其優先級高于Expires。

浏覽器第一次請求時的流程:

浏覽器再次請求時的流程:

七 HTTP1.0與HTTP1.1

HTTP作用:

  1. 請求頭Host字段,一個伺服器多個網站
  2. 長連結
  3. 檔案斷點續傳
  4. 身份認證,狀态管理,Cache緩存

HTTP請求8種方法介紹

HTTP/1.1協定中共定義了8種HTTP請求方法,HTTP請求方法也被叫做“請求動作”,不同的方法規定了不同的操作指定的資源方式。服務端也會根據不同的請求方法做不同的響應。

GET

GET請求會顯示請求指定的資源。一般來說GET方法應該隻用于資料的讀取,而不應當用于會産生副作用的非幂等的操作中。

GET會方法請求指定的頁面資訊,并傳回響應主體,GET被認為是不安全的方法,因為GET方法會被網絡蜘蛛等任意的通路。

HEAD

HEAD方法與GET方法一樣,都是向伺服器發出指定資源的請求。但是,伺服器在響應HEAD請求時不會回傳資源的内容部分,即:響應主體。這樣,我們可以不傳輸全部内容的情況下,就可以擷取伺服器的響應頭資訊。HEAD方法常被用于用戶端檢視伺服器的性能。

POST

POST請求會 向指定資源送出資料,請求伺服器進行處理,如:表單資料送出、檔案上傳等,請求資料會被包含在請求體中。POST方法是非幂等的方法,因為這個請求可能會建立新的資源或/和修改現有資源。

PUT

PUT請求會身向指定資源位置上傳其最新内容,PUT方法是幂等的方法。通過該方法用戶端可以将指定資源的最新資料傳送給伺服器取代指定的資源的内容。

DELETE

DELETE請求用于請求伺服器删除所請求URI(統一資源辨別符,Uniform Resource Identifier)所辨別的資源。DELETE請求後指定資源會被删除,DELETE方法也是幂等的。

CONNECT

CONNECT方法是HTTP/1.1協定預留的,能夠将連接配接改為管道方式的代理伺服器。通常用于SSL加密伺服器的連結與非加密的HTTP代理伺服器的通信。

OPTIONS

OPTIONS請求與HEAD類似,一般也是用于用戶端檢視伺服器的性能。 這個方法會請求伺服器傳回該資源所支援的所有HTTP請求方法,該方法會用’*’來代替資源名稱,向伺服器發送OPTIONS請求,可以測試伺服器功能是否正常。JavaScript的XMLHttpRequest對象進行CORS跨域資源共享時,就是使用OPTIONS方法發送嗅探請求,以判斷是否有對指定資源的通路權限。 允許

TRACE

TRACE請求伺服器回顯其收到的請求資訊,該方法主要用于HTTP請求的測試或診斷。

HTTP/1.1之後增加的方法

在HTTP/1.1标準制定之後,又陸續擴充了一些方法。其中使用中較多的是 PATCH 方法:

PATCH

PATCH方法出現的較晚,它在2010年的RFC 5789标準中被定義。PATCH請求與PUT請求類似,同樣用于資源的更新。二者有以下兩點不同:

但PATCH一般用于資源的部分更新,而PUT一般用于資源的整體更新。

當資源不存在時,PATCH會建立一個新的資源,而PUT隻會對已在資源進行更新。

繼續閱讀