HTTP協(xié)議
什么是HTTP協(xié)議[1]
超文本傳輸協(xié)議(HTTP钓株,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議却紧。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。
簡(jiǎn)單來說就是一種規(guī)則惨撇,一種規(guī)定伊脓。
HTTP是基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù),默認(rèn)使用80端口魁衙。瀏覽器瀏覽網(wǎng)頁使用的就是HTTP協(xié)議报腔,也就是說你在訪問網(wǎng)頁就是在使用HTTP協(xié)議。
網(wǎng)頁瀏覽的過程分析
在瀏覽器中出入網(wǎng)址 http://blog.csdn.net/f704084109 信息會(huì)被瀏覽器發(fā)送到csdn 的服務(wù)器纺棺,服務(wù)器給出反饋,瀏覽器接收到之后對(duì)數(shù)據(jù)進(jìn)行解釋邪狞。
步驟如下
- 瀏覽器首先向服務(wù)器發(fā)送HTTP請(qǐng)求
- 服務(wù)器向?yàn)g覽器返回HTTP響應(yīng)
- 如果瀏覽器還需要繼續(xù)向服務(wù)器請(qǐng)求其他資源祷蝌,比如圖片,就再次發(fā)出HTTP請(qǐng)求帆卓,重復(fù)以上步驟
HTTP請(qǐng)求
HTTP請(qǐng)求一般包括 請(qǐng)求頭+空行+請(qǐng)求體巨朦,其中請(qǐng)求頭的第一行也可以稱為請(qǐng)求首行。
使用Python 模擬HTTP 請(qǐng)求
import socket
if __name__ == '__main__':
# 創(chuàng)建tcp客戶端socket
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接
# tcp_client_socket.connect(("115.239.210.27", 443))
tcp_client_socket.connect(("110.80.135.14", 80))
# 發(fā)送數(shù)據(jù)
# http 請(qǐng)求
# 請(qǐng)求首行 ==》請(qǐng)求方式(八種剑令,常用兩種GET and POST)
# 請(qǐng)求頭
# 空行
# 請(qǐng)求體
head = "GET / HTTP/1.1\r\n" # 請(qǐng)求方式 請(qǐng)求地址 HTTP/1.1 (請(qǐng)求首行的格式)
head += "Host: tool.chinaz.com\r\n"
head += "Connection: keep-alive\r\n"
head += "Cache-Control: max-age=0\r\n"
head += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n"
head += "Upgrade-Insecure-Requests: 1\r\n"
head += "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36\r\n"
head += "Referer: https://www.baidu.com/link?url=afpMfCo1NMtFumAHT3m3nlMewV58ME68wzSXkMYm1Mc16Mtqc3w0tP9zChcTnmx0&wd=&eqid=c3b3724400081504000000045aef27ee\r\n"
head += "Accept-Encoding: gzip, deflate, sdch\r\n"
head += "Accept-Language: zh-CN,zh;q=0.8\r\n"
head += "Cookie: qHistory=aHR0cDovL3Rvb2wuY2hpbmF6LmNvbSvnq5nplb/lt6Xlhbc=; UM_distinctid=163363420b283-0d8a48d0d369eb-3e70055f-1fa400-163363420ba2c9; CNZZDATA5082706=cnzz_eid%3D1074704039-1525620421-null%26ntime%3D1525620421; mainurl=%20\r\n"
request = head + "\r\n"
tcp_client_socket.send(request.encode("utf-8"))
# 接收數(shù)據(jù)
recv_data = tcp_client_socket.recv(1024)
# 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行解碼
recv_content = recv_data.decode("utf-8",errors="ignore")
print(recv_content)
# 關(guān)閉客戶端socket
tcp_client_socket.close()
# 運(yùn)行結(jié)果:
# HTTP/1.1 200 OK
# Cache-Control: private
# Content-Length: 6305
# Content-Type: text/html; charset=utf-8
# Content-Encoding: gzip
# Server: Microsoft-IIS/7.5
# X-AspNet-Version: 4.0.30319
# X-Powered-By: ASP.NET
# Date: Sun, 06 May 2018 16:19:27 GMT
#
# ?hC?PaF?Bk?? "xBLZ?0? ,a| ??m/N9???BG?
模擬訪問了百度糊啡,結(jié)果被限制了(;′⌒`) 吁津,換了一個(gè)網(wǎng)站 棚蓄,成功得到數(shù)據(jù)堕扶,雖然亂碼,但是也說明了梭依,模擬HTTP協(xié)議是成功的稍算。
HTTP響應(yīng)
這些返回的內(nèi)容是啥? 是服務(wù)器給出的響應(yīng),反饋役拴。
響應(yīng)有啥糊探? 響應(yīng)頭+空行+響應(yīng)體 ,響應(yīng)頭第一行也叫響應(yīng)首行或者響應(yīng)行
使用Python 模擬HTTP服務(wù)器給客戶端發(fā)送響應(yīng)
import socket
def main():
"""創(chuàng)建一個(gè)瀏覽器可以訪問的tcp服務(wù)器"""
# 創(chuàng)建tcp服務(wù)器
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 重用
tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcp_server.bind(("", 8877))
tcp_server.listen(128)
# 循環(huán)接收用戶的請(qǐng)求
while True:
client, address = tcp_server.accept()
# 接收數(shù)據(jù)
data = client.recv(1024).decode("utf-8")
print(data)
# 響應(yīng)的格式
# 響應(yīng)頭
# 空行
# 響應(yīng)體
header = "HTTP/1.1 200 OK\r\n"
header += "Content-type:text/html;charset=utf-8\r\n"
header += "Content-length:5\r\n"
body = "DragonFang 歡迎你"
content = header + "\r\n" + body
# 返回一個(gè)數(shù)據(jù)
client.send(content.encode("utf-8"))
# 關(guān)閉連接
client.close()
# 關(guān)閉
tcp_server.close()
if __name__ == '__main__':
main()
# 使用上面的客戶端訪問這個(gè)服務(wù)端
# 服務(wù)端結(jié)果: 請(qǐng)求信息
# GET / HTTP/1.1
# Host: tool.chinaz.com
# Connection: keep-alive
# Cache-Control: max-age=0
# Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
# Upgrade-Insecure-Requests: 1
# User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
# Referer: https://www.baidu.com/link?url=afpMfCo1NMtFumAHT3m3nlMewV58ME68wzSXkMYm1Mc16Mtqc3w0tP9zChcTnmx0&wd=&eqid=c3b3724400081504000000045aef27ee
# Accept-Encoding: gzip, deflate, sdch
# Accept-Language: zh-CN,zh;q=0.8
# Cookie: qHistory=aHR0cDovL3Rvb2wuY2hpbmF6LmNvbSvnq5nplb/lt6Xlhbc=; UM_distinctid=163363420b283-0d8a48d0d369eb-3e70055f-1fa400-163363420ba2c9; CNZZDATA5082706=cnzz_eid%3D1074704039-1525620421-null%26ntime%3D1525620421; mainurl=%20
# 客戶端結(jié)果: 響應(yīng)信息
# HTTP/1.1 200 OK
# Content-type:text/html;charset=utf-8
# Content-length:5
#
# DragonFang 歡迎你
記錄
HTTP協(xié)議---HTTP請(qǐng)求中的常用請(qǐng)求字段和HTTP的響應(yīng)狀態(tài)碼及響應(yīng)頭
到此結(jié)?DragonFangQy 2018.5.7