PythonHTTP協議

網絡通信過程:

  • MAC地址:在設備與設備之間數據通信時用來標記收發雙方(網卡的序列號)
  • IP地址:在邏輯上標記一臺電腦,用來指引數據包的收發方向(相當於電腦的序列號)
  • 網絡掩碼:用來區分ip地址的網絡號和主機號
  • 默認網關:當需要發送的數據報包的目的ip不在本網段內時,就會發送給默認的一臺電腦,稱爲網關
  • 集線器:已過時,用來連接多臺電腦,缺點:每次收發數據都進行廣播(數據安全),網絡會變的擁堵
  • 交換機:集線器的升級版,有學習功能知道需要發送給哪臺設備,根據需要進行單播、廣播(ARP協議包(地址解析協議)–>根據ip地址獲取對應的MAC地址)
  • 路由器:連接多個不同,的網段,讓他們之間可以進行收發數據,每次收到數據後,ip不變,但是MAC地址會變化
  • DHCP:動態主機分配IP地址,自動給網絡中的主機分配IP地址
  • DNS:根據域名用來解析出IP(類似電話簿)
  • http服務器:提供瀏覽器能夠訪問到的數據
  • NAT:網絡地址轉換器,將局域網地址和公網地址進行映射

HTTP協議:

  • 超文本傳輸協議(HyperText Transfer Protocol)是一種應用層協議
  • HTTP是萬維網的數據通信的基礎
  • HTML超文本標記語言,是一種用來定義網頁的文本
  • 作用:實現HTML網頁相關資源的傳送
  • Elements顯示網頁的結構
  • Network顯示瀏覽器和服務器的通信

瀏覽器請求和服務器相應

GET表示一個讀取請求
失敗的相應有404 Not Found:網頁不存在
500 Internal Server Error:服務器內部出錯
Content-Type提示相應的內容

HTTP請求步驟

步驟1:瀏覽器首先向服務器發送HTTP請求,請求包括:
    方法:GET還是POST,GET僅請求資源,POST會附帶用戶數據;
    路徑:/full/url/path;
    域名:由Host頭指定:Host:www.sina.com 以及其他相關的Header;
步驟2:服務器向瀏覽器返回HTTP相應,相應包括:
    相應代碼:200表示成功(OK),3xx表示重定向,4xx表示客戶端發送的請求有錯誤(比如404 Not Found), 5xx表示服務器端處理時發生了錯誤(比如 503 Service Unavailable);
    響應類型:由Content-Type指定,以及其他相關的Header;
步驟3:如果瀏覽器還需要繼續向服務器請求其他資源,比如圖片,就再次發出HTTP請求,重複12

HTTP格式

  • 每個HTTP請求和響應都遵循相同的格式,一個HTTP包含Header和Body兩部分,其中Body是可選的

HTTP GET請求的格式:

GET /path HTTP/1.1
Header1:Value1
Header2:Value2
Header3:Value3

每個Hearer一行一個,換行符是\r\n

HTTP POST請求的格式:

POST /path HTTP/1.1
Header1:Value1
Header2:Value2
Header3:Value3

body data goes here...


每一行換行符是\r\n
當遇到連續兩個\r\n時,Header部分結束,後面的數據全部是Body

HTTP響應的格式:

200 OK HTTP/1.1
Header1: Value1
Header2: Value2
Header3: value3

body data goes here...

沒一行換行符是\r\n
HTTP響應如果包含body,也是通過\r\n\r\n來分隔的



請注意:Bodyde 數據類型由Content-Type頭來確定;當存在Content-Encoding時,Body數據是被壓縮的(壓縮的目的在於減少Body的大小,加快網絡傳輸)

請求報文格式

請求行[方法 路徑 版本\r\n]
請求頭[頭名稱:頭值\r\n]
空行[\r\n]
請求體

響應報文格式

響應行[版本 響應狀態]
響應頭[頭名稱:頭值]
空行
響應體

長連接和短連接:

  • TCP在真正的讀寫操作之前,server與client之間必須建立一個連接,當讀寫操作完成後,雙方不再需要這個連接時它們可以釋放這個連接,連接的建立通過三次握手,釋放則需要四次握手,所以說每個連接的建立都是需要資源消耗和時間消耗的

TCP短鏈接(模擬一種情況)

  • 1.client 向 server 發起連接請求
  • 2.server 接到請求,雙方建立連接
  • 3.client 向 server 發送消息
  • 4.server 迴應 client
  • 5.一次讀寫完成,此時雙方任何一個都可以發起 close 操作

TCP長連接(模擬一種情況)

  • 1.client 向 server 發起連接
  • 2.server 接到請求,雙方建立連接
  • 3.client 向 server 發送消息
  • 4.server 迴應 client
  • 5.一次讀寫完成,連接不關閉
  • 6.後續讀寫操作..
  • 7.長時間操作之後client發起關閉請求

TCP長/短連接操作過程

# 短連接的操作步驟:
建立連接——數據傳輸——關閉連接...建立連接——數據傳輸——關閉連接
# 長連接的操作步驟:
建立連接——數據傳輸...(保持連接)...數據傳輸——關閉連接

TCP長/短連接的優點個缺點

  • 長連接可以省去較多的TCP建立和關閉的操作,減少浪費,節約時間。對於頻繁請求資源的客戶來說,較適用長連接。
  • client與server之間的連接如果一直不關閉的話,會存在一個問題,隨着客戶端連接越來越多,server早晚有扛不住的時候,這時候server端需要採取一些策略,如關閉一些長時間沒讀寫事件發生的連接,這樣可以避免一些惡意連接導致server端服務受損;如果條件再允許就可以以客戶端機器爲顆粒度,限制每個客戶端的最大長連接數,這樣可以完全避免某個蛋疼的客戶端連累後端服務。

  • 短連接對於服務器來說管理較爲簡單,存在的連接都是有用的連接,不需要額外的控制手段。

  • 但如果客戶請求頻繁,將在TCP的建立和關閉操作上浪費時間和帶寬。

TCP長/短連接的應用場景

  • 長連接多用於操作頻繁,點對點的通訊,而且連接數不能太多情況.每個TCP連接都需要三次握手,這需要時間,如果每個操作都是先連接,再操作的話那麼處理速度會降低很多,所以每個操作完後都不斷開,再次處理時直接發送數據包就OK了,不用建立TCP連接。

  • 小的WEB網站的http服務一般都用短鏈接,因爲長連接對於服務端來說會耗費一定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億客戶端的連接用短連接會更省一些資源,如果用長連接,同時有成千上萬的用戶,如果每個用戶都佔用一個連接的話,那可想而知吧。所以併發量大,但每個用戶無需頻繁操作情況下需用短連好。

  • 對於中大型WEB網站一般都採用長連接,好處是響應用戶時間更短,用戶體驗更好,雖然更耗硬件資源一些,但這都不是事兒。

小案例(模擬瀏覽器)


import socket

# 創建TCP連接
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# DNS解析 和  連接HTTP服務器
tcp_socket.connect(("www.itcastcpp.cn", 80))

# 組包 發送HTTP請求報文

# 請求行
request_line = "GET / HTTP/1.1\r\n"

# 請求頭
request_header = "Host: www.itcastcpp.cn\r\n"
request_data = request_line + request_header + "\r\n"

# 發送請求
tcp_socket.send(request_data.encode())


# 接收響應報文
response_data = tcp_socket.recv(4096)

# 對響應報文進行解析 -- 切割
response_str_data = response_data.decode()
# print(response_data)

# '\r\n\r\n'之後的數據就是響應體數據
index = response_str_data.find("\r\n\r\n")

# 切割出的數據就是文件數據
html_data = response_str_data[index+4:]

# data_file = open("index.html", "wb")
# data_file.write(html_data.encode())
# data_file.close()
with open("index.html", "wb") as file:
    file.write(html_data.encode())

# 關閉套接字
tcp_socket.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章