浅谈http协议
?
1.http認(rèn)識(shí)
-
HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,用于web服務(wù)器與瀏覽器之間傳輸超文本數(shù)據(jù)的協(xié)議
-
HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML網(wǎng)頁文件, 圖片文件,視頻文件, 查詢結(jié)果等等)
html:(Hyper Text Mark-up Language)超文本標(biāo)記語言,用html來編寫網(wǎng)頁
-
通俗的講: HTTP是在網(wǎng)絡(luò)上傳輸HTML網(wǎng)頁的協(xié)議,用于瀏覽器和服務(wù)器的通信。
2. HTTP 協(xié)議的 Request/Response(請(qǐng)求/響應(yīng))模型
3. HTTP 請(qǐng)求報(bào)文格式分析
?
下面就是我們要請(qǐng)求的示例數(shù)據(jù):
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 叫做請(qǐng)求行. 里面包含3個(gè)信息, 以空格隔開
2.請(qǐng)求頭. 除了第一行之外, 剩下的所有數(shù)據(jù)的格式都是類似的.叫請(qǐng)求頭。
請(qǐng)求報(bào)文格式總結(jié)
4. HTTP 響應(yīng)報(bào)文格式分析
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 叫做響應(yīng)行, 共分成3部分, 第一部分 HTTP/1.1 表示 HTTP協(xié)議的版本, 第二部分是一個(gè)數(shù)字, 這個(gè)數(shù)字表示響應(yīng)狀態(tài)碼, 用戶向服務(wù)器發(fā)出了請(qǐng)求, 如果服務(wù)器正常返回響應(yīng)報(bào)文, 那么狀態(tài)碼一般都是200, 第三部分的 "OK" 表示原因短語, 表示對(duì)前面狀態(tài)碼的簡單描述. 這里需要說的是, 響應(yīng)的狀態(tài)碼除了 200 之外, 還有其他的狀態(tài)碼。(其他狀態(tài)碼自己百度)2.第二行下面的所有內(nèi)容, 我們叫做響應(yīng)頭.??響應(yīng)數(shù)據(jù)格式總結(jié)
?
?瀏覽器訪問網(wǎng)站的過程
基本流程如下:
TCP通信的整個(gè)過程,如下圖:
1. TCP短連接
模擬一種TCP短連接的情況:
在步驟5中,一般都是 client 先發(fā)起 close 操作。當(dāng)然也不排除有特殊的情況。
從上面的描述看,短連接一般只會(huì)在 client/server 間傳遞一次讀寫操作!
?
2. TCP長連接
再模擬一種長連接的情況:
?
3. TCP/IP協(xié)議(族)
互聯(lián)網(wǎng)協(xié)議包含了上百種協(xié)議標(biāo)準(zhǔn),但是最重要的兩個(gè)協(xié)議是TCP和IP協(xié)議,所以,大家把互聯(lián)網(wǎng)的協(xié)議簡稱TCP/IP協(xié)議(族)
常用的網(wǎng)絡(luò)協(xié)議如下圖所示:
1. 模擬瀏覽器訪問服務(wù)端
?
import socketdef main():# 1.創(chuàng)建tcp客戶端socket對(duì)象http_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 連接服務(wù)端http_client_socket.connect(('127.0.0.1', 7788))# 3. 發(fā)送http請(qǐng)求報(bào)文格式"""1. 請(qǐng)求行 : GET /index.html HTTP/1.12. 請(qǐng)求頭 : HOST:127.0.0.1:77883. 分隔符 ‘\r\n’4. 請(qǐng)求體 product_id=1001"""request_line = 'GET /index.html HTTP/1.1\r\n' # 請(qǐng)求行,必須有request_headers = 'HOST: 127.0.0.1:7788\r\n' # 請(qǐng)求頭request_headers += 'Accept: text/html\r\n'split = "\r\n" # 請(qǐng)求頭與請(qǐng)求體分隔符request_body = "product_id=1001\r\n"request_data = request_line + request_headers + split + request_body # 拼接請(qǐng)求報(bào)文數(shù)據(jù)# 發(fā)送請(qǐng)求數(shù)據(jù)到服務(wù)端,發(fā)送前需編碼http_client_socket.send(request_data.encode("utf-8"))# 等待接受從服務(wù)端應(yīng)答的消息response_data = http_client_socket.recv(1024)print("http服務(wù)端應(yīng)答的數(shù)據(jù):", response_data.decode()) # 解碼輸出# 關(guān)閉套接字http_client_socket.close()if __name__ == '__main__':main()
2. 簡單HTTP服務(wù)器實(shí)現(xiàn)
1 import socket 2 3 4 def handle_client(client_socket): 5 """處理瀏覽器客戶端的請(qǐng)求""" 6 7 # 等待接收客戶端發(fā)送的消息 8 recv_data = client_socket.recv(4096) 9 10 # 解碼數(shù)據(jù) 11 request_data = recv_data.decode("utf-8") 12 13 # 顯示接收到的請(qǐng)求報(bào)文數(shù)據(jù) 14 print(request_data) 15 16 # 按照http 響應(yīng)報(bào)文格式去回復(fù)客戶端 17 """http 響應(yīng)報(bào)文格式 18 1. 響應(yīng)行 : HTTP/1.1 200 OK 19 2. 響應(yīng)頭 Server: mimiweb1.0 Connection: Keep-alive 20 3. 分隔符 \r\n 21 4. 響應(yīng)體 very good 22 """ 23 response_line = "HTTP/1.1 200 OK\r\n" # 響應(yīng)行,必須有 24 response_headers = "Server: mimiweb1.0\r\n" 25 response_headers += "Connection: Keep-alive\r\n" 26 split = "\r\n" # 請(qǐng)求頭與請(qǐng)求體的分隔符 27 response_body = "very good\r\n" 28 29 # 拼接響應(yīng)報(bào)文數(shù)據(jù) 30 response_datas = response_line + response_headers + split + response_body 31 32 # 向客戶端發(fā)送響應(yīng)報(bào)文數(shù)據(jù) 33 client_socket.send(response_datas.encode("utf-8")) 34 35 # 關(guān)閉套接字 36 client_socket.close() 37 38 39 def main(): 40 """程序主控制入口""" 41 42 # 創(chuàng)建監(jiān)聽套接字 43 http_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 44 45 # 當(dāng)套接字四次揮手,可立即復(fù)用地址端口 46 http_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 47 48 # 服務(wù)端綁定端口 49 http_server_socket.bind(('', 7788)) 50 51 # 開啟監(jiān)聽 52 http_server_socket.listen(128) 53 54 # 等待接受瀏覽器客戶端的請(qǐng)求 55 while True: 56 client_socket, client_addr = http_server_socket.accept() 57 print("有新的客戶端請(qǐng)求,來自>>>", client_addr) 58 59 # 在函數(shù)中為客戶端提供服務(wù) 60 handle_client(client_socket) 61 62 63 if __name__ == '__main__': 64 main()服務(wù)器端
客戶端
?
轉(zhuǎn)載于:https://www.cnblogs.com/liuguangbiao/p/9248848.html
總結(jié)
- 上一篇: 面向对象的继承
- 下一篇: matlab中图像处理的基本函数(1)