1.1 Tcp数据发送
从机器A发给机器B,
数据发送是分解成很多信息包,到机器B后,机器B会重新合成在一起;在发送过程中,要求接收方没接收到一个包,需要反馈信息,如果没有反馈,tcp会自动重新发送,一直尝试目的是为了防止某个包缺失,导致整个数据损坏;每个包都会有个序号,这样确保B端,收到所有的包后,能够重组数据。
1.2 IP地址与端口
要给B发送数据,首先要知道B电脑的地址,其次由于B电脑可能有很多个程序,比如:qq、邮件、浏览器等,你具体是要发送给哪个程序;所以有了端口这个概念,一个程序对应一个端口,端口取值范围一般是:1024~65535
1.3 内网与外网
有的时候我们在学校、公司,要用公司的电脑搭建一个服务器,然后外网客户端可以使用;那么这个时候服务器的ip地址、端口要怎么设置:需要在路由器上设置把某一端口映射到B上,由A来连接路由器的这个端口。
1.4 DNS
DNS是一个分布式数据库,超级庞大;每条记录包含了:(域名,ip地址);
1.5 浏览器
浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示想要访问的网络资源。这里资源一般是指 HTML 文档,图片等其他的类型。资源的位置由用户使用 URL(统一资源标示符)指定。
而浏览器的核心——渲染引擎便是负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。
工作流程:
1. 输入URL地址或者点击URL的一个链接
2. 浏览器根据URL地址,结合DNS,解析出URL对应的IP地址
1)浏览器通过发送一个TCP的包,要求服务器打开连接
2)服务器也通过发送一个包来应答客户端的浏览器,告诉浏览器可以发送数据给服务器
3)发送HTTP请求
4. 服务器接到请求后,返回相应的响应内容
5. 浏览器解析从服务器端返回的响应内容,并且把页面显现出来
当输入URL之后,浏览器就要知道这个URL对应的IP是什么,只有知道了IP地址,浏览器才能准备的把请求发送到指定的服务器的具体IP和端口号上面。然后服务器端把响应结果发送到客户端。这个响应结果就是html的文档,不包含什么图片,脚本,CSS等的,也就是页面的html结构。
1.6 web服务
1.6.1 客户端
可以直接采用python的Requests 模块:
r = requests.get('https://github.com/timeline.json')
r = requests.post("http://httpbin.org/post")
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
1.7 http格式
1.7.1 请求格式
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
第一行是请求方法,以及版本
后面是:头、数据(表单内容)进行请求。
1.7.2 回应格式
服务器的回应如下。
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
<body>Hello World</body>
</html>
回应的格式是"头信息 + 一个空行(\r\n) + 数据"。其中,第一行是"协议版本 + 状态码(status code) + 状态描述"。
1.8 图片文件上传
客户端:
#coding=utf-8
import requests
url = 'http://localhost:8080'
path = u'D:快盘阿狸头像.jpg'
print path
files = {'file': open(path, 'rb')}
r = requests.post(url, files=files)
print r.url,r.text
服务端:
#coding=utf-8
from BaseHTTPServer import BaseHTTPRequestHandler
import cgi
class PostHandler(BaseHTTPRequestHandler):
def do_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD':'POST',
'CONTENT_TYPE':self.headers['Content-Type'],
}
)
self.send_response(200)
self.end_headers()
self.wfile.write('Client: %sn ' % str(self.client_address) )
self.wfile.write('User-agent: %sn' % str(self.headers['user-agent']))
self.wfile.write('Path: %sn'%self.path)
self.wfile.write('Form data:n')
for field in form.keys():
field_item = form[field]
filename = field_item.filename
filevalue = field_item.value
filesize = len(filevalue)#文件大小(字节)
print len(filevalue)
with open(filename.decode('utf-8')+'a','wb') as f:
f.write(filevalue)
return
if __name__=='__main__':
from BaseHTTPServer import HTTPServer
sever = HTTPServer(('localhost',8080),PostHandler)
print 'Starting server, use <Ctrl-C> to stop'
sever.serve_forever()
参考文献:
1、http://blog.youkuaiyun.com/testcs_dn/article/details/50449106
2、http://www.ruanyifeng.com/blog/2016/08/http.html