python网络编程
1. 简述TCP和UDP的区别以及优缺点?
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息。
优点:UDP速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送
缺点:UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数 据是否会
正确接收,也不重复发送,不可靠。
TCP是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手
优点:TCP在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。
缺点:TCP相对于UDP速度慢一点,要求系统资源较多。
2.详述三次握手和四次挥手过程?
三次握手:
1. 建立连接时,客户端发送SYN包到服务器
2. 服务器收到请求后,会向客户端发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。
3. 客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(seq=x+1),确认号为ack(客户端)=y+1,此包发
送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手
四次挥手:
1. 首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认
2. 服务器收到这个FIN,它发送一个ACK,确认ack为收到的序号加一。
3. 关闭服务器到客户端的连接,发送一个FIN给客户端
4. 客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。客户端就进入了TIMEWAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,才进入CLOSED状态。
5. 服务器只要收到了客户端发出的确认,当前连接立即进入CLOSED状态。
3.为什么TIME_WAIT状态需要经过2*MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
4. 说说HTTP和HTTPS区别?
1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP 协议构建的可进行加密传输、 身份认证的网络协议,比http协议安全
5. Post和Get请求的区别?
1. 最直观的就是语义上的区别,get用于获取数据,post用于提交数据。
2. get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制),而post无限制
3. GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接,而POST请求会把请求的数据放置在HTTP 请求体中。
4. 更多资料,请查看post请求和get请求的区别
6. HTTP协议状态码有什么用,列出你知道的 HTTP 协议的状态码
通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。 常见的状态机器码有:
1. 100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
2. 200-299:表示服务器成功接收请求并已完成处理过程,常用200(OK请求成功)。
3. 300-399:为完成请求,客户需要进一步细化请求,如302(所有请求页面已经临时转移到新的url),304、
307(使用缓存资源)。
4. 400-499:客户端请求有错误,如常用404(服务器无法找到被请求页面),403(服务器拒绝访问,权限不
够)。
5. 500-599:服务器端出现错误,常用500(请求未完成,服务器遇到不可预知的情况)
7. HTTP常见请求头?
1. Host(主机和端口号)
2. Connection(链接类型)
3. Upgrade-Insecure-Requests(升级为HTTPS请求)
4. User-Agent(浏览器名称)
5. Accept(传输文件类型)
6. Referer(页面跳转处)
7. Accept-Encoding(文件编解码格式)
8. Cookie (Cookie)
9. x-requested-with:XMLHttpRequest (是Ajax异步请求)
8. url的形式?
形式: scheme://host[:port#]/path/…/[?query-string][#anchor]
scheme:协议(例如:http, https, ftp)
host:服务器的IP 地址或者域名
port:服务器的端口(如果是走协议默认端口,80 or 443)
path:访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)
http://localhost:4000/file/part01/1.2.html
9. 浏览器请求动态页面过程
10. WSGI的作用
web框架和服务器之间的通信协议
WSGI允许开发者将选择web框架和web服务器分开。可以混合匹配web服务器和web框架,选择一个适合的配
对。比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask。
11.如何定义WSGI接口?
WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求:
# 这是web服务器
def start_response(status, headers):
# 保存 响应头信息
self.status = status
self.headers = headers
# 当接收到浏览器的一个请求并判断是动态资源的请求时;
body = framework.application(env,start_response)
response = self.headers + bod
#这是框架
def application(environ, start_response):
"""
application是在框架中定义,在服务器中被调用
start_response 是服务器中的一个设置响应头信息的函数
"""
start_response('200 OK', [('Content-Type', 'text/html')])
# 查询数据库等操作
return 'Hello World!'
上面的 application() 函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
environ :一个包含所有HTTP请求信息的dict对象;
start_response :一个发送HTTP响应的函数。
application() 函数必须由WSGI服务器来调用