HTTP协议
什么是HTTP协议1
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。
简单来说就是一种规则,一种规定。
HTTP是基于TCP/IP通信协议来传递数据,默认使用80端口。浏览器浏览网页使用的就是HTTP协议,也就是说你在访问网页就是在使用HTTP协议。
网页浏览的过程分析
在浏览器中出入网址 http://blog.csdn.net/f704084109 信息会被浏览器发送到csdn 的服务器,服务器给出反馈,浏览器接收到之后对数据进行解释。
步骤如下
- 浏览器首先向服务器发送HTTP请求
- 服务器向浏览器返回HTTP响应
- 如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复以上步骤
HTTP请求
HTTP请求一般包括 请求头+空行+请求体,其中请求头的第一行也可以称为请求首行。
使用Python 模拟HTTP 请求
import socket
if __name__ == '__main__':
# 创建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))
# 发送数据
# http 请求
# 请求首行 ==》请求方式(八种,常用两种GET and POST)
# 请求头
# 空行
# 请求体
head = "GET / HTTP/1.1\r\n" # 请求方式 请求地址 HTTP/1.1 (请求首行的格式)
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"))
# 接收数据
recv_data = tcp_client_socket.recv(1024)
# 对二进制数据进行解码
recv_content = recv_data.decode("utf-8",errors="ignore")
print(recv_content)
# 关闭客户端socket
tcp_client_socket.close()
# 运行结果:
# 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͉PaFBk "xBLZ0 ,a| ?m/N9BG
模拟访问了百度,结果被限制了(;′⌒`) ,换了一个网站 ,成功得到数据,虽然乱码,但是也说明了,模拟HTTP协议是成功的。
HTTP响应
这些返回的内容是啥? 是服务器给出的响应,反馈。
响应有啥? 响应头+空行+响应体 ,响应头第一行也叫响应首行或者响应行
使用Python 模拟HTTP服务器给客户端发送响应
import socket
def main():
"""创建一个浏览器可以访问的tcp服务器"""
# 创建tcp服务器
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)
# 循环接收用户的请求
while True:
client, address = tcp_server.accept()
# 接收数据
data = client.recv(1024).decode("utf-8")
print(data)
# 响应的格式
# 响应头
# 空行
# 响应体
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
# 返回一个数据
client.send(content.encode("utf-8"))
# 关闭连接
client.close()
# 关闭
tcp_server.close()
if __name__ == '__main__':
main()
# 使用上面的客户端访问这个服务端
# 服务端结果: 请求信息
# 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
# 客户端结果: 响应信息
# HTTP/1.1 200 OK
# Content-type:text/html;charset=utf-8
# Content-length:5
#
# DragonFang 欢迎你
记录
HTTP协议—HTTP请求中的常用请求字段和HTTP的响应状态码及响应头
到此结 DragonFangQy 2018.5.7