日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈http协议

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈http协议 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1.http認識

  • HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是互聯網上應用最為廣泛的一種網絡協議,用于web服務器與瀏覽器之間傳輸超文本數據的協議

  • HTTP是一個基于TCP/IP通信協議來傳遞數據(HTML網頁文件, 圖片文件,視頻文件, 查詢結果等等)

    html:(Hyper Text Mark-up Language)超文本標記語言,用html來編寫網頁

  • 通俗的講: HTTP是在網絡上傳輸HTML網頁的協議,用于瀏覽器和服務器的通信。

2. HTTP 協議的 Request/Response(請求/響應)模型

3. HTTP 請求報文格式分析

?

下面就是我們要請求的示例數據:

GET /index.html HTTP/1.1 Host: 192.168.192.221:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: BAIDUID=8FD6ED496A03231D920484C6379517CF:FG=1;
1.GET / HTTP/1.1 叫做請求行. 里面包含3個信息, 以空格隔開
2.請求頭. 除了第一行之外, 剩下的所有數據的格式都是類似的.叫請求頭。

請求報文格式總結

4. HTTP 響應報文格式分析

HTTP/1.1 200 OK Connection: Keep-Alive Content-Encoding: gzip Content-Type: text/html; charset=utf-8 Date: Wed, 14 Mar 2018 09:52:48 GMT Server: BWS/1.1   1.第一行 HTTP/1.1 200 OK 叫做響應行, 共分成3部分, 第一部分 HTTP/1.1 表示 HTTP協議的版本, 第二部分是一個數字, 這個數字表示響應狀態碼, 用戶向服務器發出了請求, 如果服務器正常返回響應報文, 那么狀態碼一般都是200, 第三部分的 "OK" 表示原因短語, 表示對前面狀態碼的簡單描述. 這里需要說的是, 響應的狀態碼除了 200 之外, 還有其他的狀態碼。(其他狀態碼自己百度)2.第二行下面的所有內容, 我們叫做響應頭.??

響應數據格式總結

?

?

瀏覽器訪問網站的過程

基本流程如下:

  • 用戶輸入網址.
  • 瀏覽器請求DNS服務器, 獲取域名對應的IP地址.
  • 請求連接該IP地址服務器.
  • 發送資源請求. (HTTP協議)
  • web服務器接收到請求, 并解析請求, 判斷用戶意圖.
  • 獲取用戶想要的資源.
  • 將資源返回給http服務器程序.
  • http服務器程序將資源數據通過網絡發送給瀏覽器.
  • 瀏覽器解析呈現請求的數據.
  • TCP通信的整個過程,如下圖:

    1. TCP短連接

    模擬一種TCP短連接的情況:

  • client 向 server 發起連接請求
  • server 接到請求,雙方建立連接
  • client 向 server 發送消息
  • server 回應 client
  • 一次讀寫完成,此時雙方任何一個都可以發起 close 操作
  • 在步驟5中,一般都是 client 先發起 close 操作。當然也不排除有特殊的情況。

    從上面的描述看,短連接一般只會在 client/server 間傳遞一次讀寫操作!

    ?

    2. TCP長連接

    再模擬一種長連接的情況:

  • client 向 server 發起連接
  • server 接到請求,雙方建立連接
  • client 向 server 發送消息
  • server 回應 client
  • 一次讀寫完成,連接不關閉
  • 后續讀寫操作...
  • 長時間操作之后client發起關閉請求
  • ?

    3. TCP/IP協議(族)

    互聯網協議包含了上百種協議標準,但是最重要的兩個協議是TCP和IP協議,所以,大家把互聯網的協議簡稱TCP/IP協議(族)

    常用的網絡協議如下圖所示:

  • 網絡接口層(物理層、數據鏈路層):包括傳輸介質(網線)、計算機中對應的網絡接口卡等,其實這一層tcp/ip協議是沒有定義的,給其上層"網絡層"提供訪問接口.
  • 網絡層(互聯網層):主要用IP地址來完成對主機的尋址,它還負責數據包在多種網絡中的路由
  • 運輸層:主要為兩臺主機上的應用提供端到端的通信.
  • 應用層:為用戶提供所需的服務,比如http服務,ftp服務,smtp服務等.
  • 1. 模擬瀏覽器訪問服務端

    ?

    import socketdef main():# 1.創建tcp客戶端socket對象http_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 連接服務端http_client_socket.connect(('127.0.0.1', 7788))# 3. 發送http請求報文格式"""1. 請求行 : GET /index.html HTTP/1.12. 請求頭 : HOST:127.0.0.1:77883. 分隔符 ‘\r\n’4. 請求體 product_id=1001"""request_line = 'GET /index.html HTTP/1.1\r\n' # 請求行,必須有request_headers = 'HOST: 127.0.0.1:7788\r\n' # 請求頭request_headers += 'Accept: text/html\r\n'split = "\r\n" # 請求頭與請求體分隔符request_body = "product_id=1001\r\n"request_data = request_line + request_headers + split + request_body # 拼接請求報文數據# 發送請求數據到服務端,發送前需編碼http_client_socket.send(request_data.encode("utf-8"))# 等待接受從服務端應答的消息response_data = http_client_socket.recv(1024)print("http服務端應答的數據:", response_data.decode()) # 解碼輸出# 關閉套接字http_client_socket.close()if __name__ == '__main__':main()

      

    2. 簡單HTTP服務器實現

    1 import socket 2 3 4 def handle_client(client_socket): 5 """處理瀏覽器客戶端的請求""" 6 7 # 等待接收客戶端發送的消息 8 recv_data = client_socket.recv(4096) 9 10 # 解碼數據 11 request_data = recv_data.decode("utf-8") 12 13 # 顯示接收到的請求報文數據 14 print(request_data) 15 16 # 按照http 響應報文格式去回復客戶端 17 """http 響應報文格式 18 1. 響應行 : HTTP/1.1 200 OK 19 2. 響應頭 Server: mimiweb1.0 Connection: Keep-alive 20 3. 分隔符 \r\n 21 4. 響應體 very good 22 """ 23 response_line = "HTTP/1.1 200 OK\r\n" # 響應行,必須有 24 response_headers = "Server: mimiweb1.0\r\n" 25 response_headers += "Connection: Keep-alive\r\n" 26 split = "\r\n" # 請求頭與請求體的分隔符 27 response_body = "very good\r\n" 28 29 # 拼接響應報文數據 30 response_datas = response_line + response_headers + split + response_body 31 32 # 向客戶端發送響應報文數據 33 client_socket.send(response_datas.encode("utf-8")) 34 35 # 關閉套接字 36 client_socket.close() 37 38 39 def main(): 40 """程序主控制入口""" 41 42 # 創建監聽套接字 43 http_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 44 45 # 當套接字四次揮手,可立即復用地址端口 46 http_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 47 48 # 服務端綁定端口 49 http_server_socket.bind(('', 7788)) 50 51 # 開啟監聽 52 http_server_socket.listen(128) 53 54 # 等待接受瀏覽器客戶端的請求 55 while True: 56 client_socket, client_addr = http_server_socket.accept() 57 print("有新的客戶端請求,來自>>>", client_addr) 58 59 # 在函數中為客戶端提供服務 60 handle_client(client_socket) 61 62 63 if __name__ == '__main__': 64 main()

    服務器端

    客戶端

    ?

    轉載于:https://www.cnblogs.com/liuguangbiao/p/9248848.html

    總結

    以上是生活随笔為你收集整理的浅谈http协议的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。