【Python考试题】-网络编程
1.UDP 总结
使用 udp 发送/接收数据步骤:
1.创建客户端套接字
2.发送/接收数据
3.关闭套接字
1.import socket
2.def main():
3. # 1、创建 udp 套接字
4. # socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议
5. # socket.SOCK_DGRAM 数据报套接字,只要用于 udp 协议
6. udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
7.
8. # 2、准备接收方的地址
9. # 元组类型 ip 是字符串类型 端口号是整型
10. dest_addr = (‘192.168.113.111’, 8888)
11. # 要发送的数据
12. send_data = “我是要发送的数据” 13. # 3、发送数据
14. udp_socket.sendto(send_data.encode(“utf-8”), dest_addr)
15. # 4、等待接收方发送的数据 如果没有收到数据则会阻塞等待,直到收到数据
16. # 接收到的数据是一个元组 (接收到的数据, 发送方的 ip 和端口)
17. # 1024 表示本次接收的最大字节数
18. recv_data, addr = udp_socket.recvfrom(1024) 19. # 5、关闭套接字
20. udp_socket.close()
21.if name == ’ main ':
22. main()
编码的转换
str -->bytes: encode 编码 bytes–> str: decode()解码
UDP 绑定端口号:
1.创建 socket 套接字
2.绑定端口号
3.接收/发送数据
4.关闭套接字
1.import socket2.def main(): | |||
---|---|---|---|
3.4. | # 1、创建 udp 套接字# socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议 | ||
5. | # | socket.SOCK_DGRAM 数据报套接字,只要用于 udp 协议 | |
6.7.8.9.10 | . | udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2、绑定端口# 元组类型 ip 一般不写 表示本机的任何的一个 ip local_addr = (’’, 7777) udp_socket.bind(local_addr) | |
11. # 3、准备接收方的地址12. # 元组类型 ip 是字符串类型 端口号是整型13. dest_addr = (‘192.168.113.111’, 8888) |
14. # 要发送的数据
15. send_data = “我是要发送的数据” 16. # 4、发送数据
17. udp_socket.sendto(send_data.encode(“utf-8”), dest_addr)
18. # 5、等待接收方发送的数据 如果没有收到数据则会阻塞等待,直到收到数据
19. # 接收到的数据是一个元组 (接收到的数据, 发送方的 ip 和端口)
20. # 1024 表示本次接收的最大字节数
21. recv_data, addr = udp_socket.recvfrom(1024) 22. # 6、关闭套接字
23. udp_socket.close()
24.if name == ’ main ':
25. main()
注意点:绑定端口要在发送数据之前进行绑定。
2.TCP 总结
TCP 客户端的创建流程:
1.创建 TCP 的 socket 套接字
2.连接服务器
3.发送数据给服务器端
4.接收服务器端发送来的消息
5.关闭套接字
1.import socket
2.def main():
3. # 1、创建客户端的 socket
4. # socket.AF_INET 表示 IPv4 协议 AF_INET6 表示 IPv6 协议
5. # socket.SOCK_STREAM 流式套接字,只要用于 TCP 协议
6. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
7. # 2、构建目标地址
8. server_ip = input(“请输入服务器端的 IP 地址:”)
9. server_port = int(input(“请输入服务器端的端口号:”)) 10. # 3、连接服务器
11. # 参数:元组类型 ip 是字符串类型 端口号是整型 12. client_socket.connect((server_ip, server_port))
13. # 要发送给服务器端的数据
14. send_data = “我是要发送给服务器端的数据”
15. # 4、发送数据
16. client_socket.send(send_data.encode(“gbk”)) 17. # 5、接收服务器端恢复的消息, 没有消息会阻塞
18. # 1024 表示接收的最大字节数
19. recv_date= client_socket.recv(1024)
20. print(“接收到的数据是:”, recv_date.decode(‘gbk’)) 21. # 6、关闭套接字
22. client_socket.close()
23.if name == ’ main ':
24. main()
TCP 服务器端的创建流程
1.创建 TCP 服务端的 socket
2.bing 绑定 ip 地址和端口号
3.listen 使套接字变为被动套接字
4.accept 取出一个客户端连接,用于服务
5.recv/send 接收和发送消息
6.关闭套接字
1.import socket
2.
3.def main():
4. # 1、创建 tcp 服务端的 socket
5. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6.
7. # 2、绑定
8. server_socket.bind((’’, 8888)) 9.
10. # 3、listen 使套接字变为被动套接字 11. server_socket.listen(128)
12.
13. # 4、如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务 14. # client_socket 用来为这个客户端服务
15. # tcp_server_socket 就可以省下来专门等待其他新客户端的链接 16. client_socket, client_addr = server_socket.accept()
17.
18. # 5、接收客户端发来的消息
19. recv_data = client_socket.recv(1024)
20. print(“接收到客户端%s 的数据:%s” % (str(client_addr), recv_data.decode(‘gbk’))) 21.
22. # 6、回复数据给客户端
23. client_socket.send(“收到消息”.encode(‘gbk’)) 24.
25. # 7、关闭套接字 26. client_socket.close()
27. server_socket.close() 28.
29.if name == ’ main ':
30. main()
注意点:
· tcp 服务器一般都需要绑定,否则客户端找不到服务器
· tcp 客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的 ip、port 等信息就好, 本地客户端可以随机
· tcp 服务器中通过 listen 可以将 socket 创建出来的主动套接字变为被动的,这是做 tcp 服务器 时必须要做的
· 当客户端需要链接服务器时,就需要使用 connect 进行链接,udp 是不需要链接的而是直接发送,但是 tcp 必须先链接,只有链接成功才能通信
· 当一个 tcp 客户端连接服务器时,服务器端会有 1 个新的套接字,这个套接字用来标记这个客户 端,单独为这个客户端服务
· listen 后的套接字是被动套接字,用来接收新的客户端的连接请求的,而 accept 返回的新套接 字是标识这个新客户端的
· 关闭 listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之 前已经链接成功的客户端正常通信。
· 关闭 accept 返回的套接字意味着这个客户端已经服务完毕
· 当客户端的套接字调用 close 后,服务器端会 recv 解阻塞,并且返回的长度为 0,因此服务器可 以通过返回数据的长度来区别客户端是否已经下线;同理 当服务器断开 tcp 连接的时候 客户端 同样也会收到 0 字节数据。
3. 怎么实现强行关闭客户端和服务器之间的连接? (2018-3-30-lxy)
在 socket 通信过程中不断循环检测一个全局变量(开关标记变量),一旦标记变量变为关闭,则 调 用 socket 的 close 方法,循环结束,从而达到关闭连接的目的。
4. 简述 TCP 和 UDP 的区别以及优缺点? (2018-4-16-lxy)
UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息。
优点:UDP 速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送 缺点:UDP 传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数 据是否会正确接收,也不重复发送,不可靠。
TCP 是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手
优点:TCP 在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。 缺点:TCP 相对于 UDP 速度慢一点,要求系统资源较多。
5. 简述浏览器通过 WSGI 请求动态资源的过程? (2018-4-16-lxy)
1.发送 http 请求动态资源给 web 服务器
2.web 服务器收到请求后通过 WSGI 调用一个属性给应用程序框架
3.应用程序框架通过引用 WSGI 调用 web 服务器的方法,设置返回的状态和头信息。
4.调用后返回,此时 web 服务器保存了刚刚设置的信息
5.应用程序框架查询数据库,生成动态页面的 body 的信息
6.把生成的 body 信息返回给 web 服务器
7.web 服务器吧数据返回给浏览器
6. 描述用浏览器访问 *www.baidu.com* 的过程(2018-4-16-lxy)
先要解析出 baidu.com 对应的 ip 地址
· 要先使用 arp 获取默认网关的 mac 地址
· 组织数据发送给默认网关(ip 还是 dns 服务器的 ip,但是 mac 地址是默认网关的 mac 地址)
· 默认网关拥有转发数据的能力,把数据转发给路由器
· 路由器根据自己的路由协议,来选择一个合适的较快的路径转发数据给目的网关
· 目的网关(dns 服务器所在的网关),把数据转发给 dns 服务器
· dns 服务器查询解析出 baidu.com 对应的 ip 地址,并原路返回请求这个域名的 client 得到了 baidu.com 对应的 ip 地址之后,会发送 tcp 的 3 次握手,进行连接
· 使用 http 协议发送请求数据给 web 服务器
· web 服务器收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器。
· 浏览器接收到数据之后通过浏览器自己的渲染功能来显示这个网页。
· 浏览器关闭 tcp 连接,即 4 次挥手结束,完成整个访问过程
7. Post 和 Get 请求的区别?
GET 请求,请求的数据会附加在 URL 之后,以?分割 URL 和传输数据,多个参数用&连接。URL 的 编码格式采用的是 ASCII 编码,而不是 uniclde,即是说所有的非 ASCII 字符都要编码之后再传输。
POST 请求:POST 请求会把请求的数据放置在 HTTP 请求包的包体中。上面的 item=bandsaw 就 是实际的传输数据。
因此,GET 请求的数据会暴露在地址栏中,而 POST 请求则不会。 传输数据的大小:
· 在 HTTP 规范中,没有对 URL 的长度和传输的数据大小进行限制。但是在实际开发过程中,对 于 GET,特定的浏览器和服务器对 URL 的长度有限制。因此,在使用 GET 请求时,传输数据会 受到 URL 长度的限制。
· 对于 POST,由于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST 提交数据大小进行限制,Apache、IIS 都有各自的配置。
安全性:
· POST 的安全性比 GET 的高。这里的安全是指真正的安全,而不同于上面 GET 提到的安全方法 中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过 GET 请求, 用户名和密码都会暴露再 URL 上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的
历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET 请求提交的数据
还可能会造成 Cross-site request frogery 攻击。 效率:GET 比 POST 效率高。
POST 请求的过程:
(1).浏览器请求 tcp 连接(第一次握手)
(2).服务器答应进行 tcp 连接(第二次握手)
(3).浏览器确认,并发送 post 请求头(第三次握手,这个报文比较小,所以 http 会在此时进行 第一次数据发送)
(4).服务器返回 100 continue 响应 5.浏览器开始发送数据
(5).服务器返回 200 ok 响应 GET 请求的过程:
(1).浏览器请求 tcp 连接(第一次握手)
(2).服务器答应进行 tcp 连接(第二次握手)
(3).浏览器确认,并发送 get 请求头和数据(第三次握手,这个报文比较小,所以 http 会在此时 进行第一次数据发送)
(4).服务器返回 200 OK 响应
8. cookie 和 session 的区别?(2018-4-16-lxy)
(1)cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
(2)cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗考虑到安全应当使 用 session。
(3)session 会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用 cookie。
(4)单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
(5)建议: 将登陆信息等重要信息存放为 SESSION 其他信息如果需要保留,可以放在 cookie 中
9. HTTP 协议状态码有什么用,列出你知道的 HTTP 协议的状态码,然后讲出他们都 表示什么意思?(2018-4-16-lxy)
通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。 常见的状态机器码有:
100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
200-299:表示服务器成功接收请求并已完成处理过程,常用 200(OK 请求成功)。
300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的 url)。
304、307(使用缓存资源)。
400-499:客户端请求有错误,常用 404(服务器无法找到被请求页面),403(服务器拒绝访问, 权限不够)。
500-599:服务器端出现错误,常用 500(请求未完成,服务器遇到不可预知的情况)。
10.请简单说一下三次握手和四次挥手?
三次握手过程:
(1)首先客户端向服务端发送一个带有 SYN 标志,以及随机生成的序号 100(0 字节)的报文
(2)服务端收到报文后返回一个报文(SYN200(0 字节),ACk1001(字节+1))给客户端
(3)客户端再次发送带有 ACk 标志 201(字节+)序号的报文给服务端 至此三次握手过程结束,客户端开始向服务端发送数据。
1客户端向服务端发起请求:我想给你通信,你准备好了么?
2服务端收到请求后回应客户端:I’ok,你准备好了么
3客户端礼貌的再次回一下客户端:准备就绪,咱们开始通信吧!
整个过程跟打电话的过程一模一样:1 喂,你在吗 2 在,我说的你听得到不 3 恩,听得到(接下来请 开始你的表演)
补充:SYN:请求询问,ACk:回复,回应。
四次挥手过程:
由于 TCP 连接是可以双向通信的(全双工),因此每个方向都必须单独进行关闭(这句话才是 精辟,后面四个挥手过程都是其具体实现的语言描述)
四次挥手过程,客户端和服务端都可以先开始断开连接
(1)客户端发送带有 fin 标识的报文给服务端,请求通信关闭
(2)服务端收到信息后,回复 ACK 答应关闭客户端通信(连接)请求
(3)服务端发送带有 fin 标识的报文给客户端,也请求关闭通信
(4)客户端回应 ack 给服务端,答应关闭服务端的通信(连接)请求
11.说一下什么是 tcp 的 2MSL?
主动发送 fin 关闭的一方,在 4 次挥手最后一次要等待一段时间我们称这段时间为 2MSL TIME_WAIT 状态的存在有两个理由:
1.让 4 次挥手关闭流程更加可靠
2.防止丢包后对后续新建的正常连接的传输造成破坏
12.为什么客户端在 TIME-WAIT 状态必须等待 2MSL 的时间?
1、为了保证客户端发送的最后一个 ACK 报文段能够达到服务器。 这个 ACK 报文段可能丢失, 因而使处在 LAST-ACK 状态的服务器收不到确认。服务器会超时重传 FIN+ACK 报文段,客户端就 能在 2MSL 时间内收到这个重传的 FIN+ACK 报文段,接着客户端重传一次确认,重启计时器。最 好,客户端和服务器都正常进入到 CLOSED 状态。如果客户端在 TIME-WAIT 状态不等待一段时间, 而是再发送完 ACK 报文后立即释放连接,那么就无法收到服务器重传的 FIN+ACK 报文段,因而也 不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入 CLOSED 状态。
2、防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个 ACK 确认报文段 后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样 就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
13.说说 HTTP 和 HTTPS 区别?
HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安 全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer)协议用于 对 HTTP 协议传输的数据进行加密,从而就诞生了 HTTPS。简单来说,HTTPS 协议是由 SSL+HTTP 协 议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全。
HTTPS 和 HTTP 的区别主要如下:
1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、
身份认证的网络协议,比 http 协议安全。
14.谈一下 HTTP 协议以及协议头部中表示数据类型的字段?
HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。 HTTP 是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体
信息系统。它于 1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在 WWW 中 使用的是 HTTP/1.0 的第六版,HTTP/1.1 的规范化工作正在进行之中,而且 HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP 协议工作于客户端-服务端架构为上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服 务端即 WEB 服务器发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息。
表示数据类型字段: Content-Type
15.HTTP 请求方法都有什么?
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
1、 GET 请求指定的页面信息,并返回实体主体。
2、HEAD 类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头
3、POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4、PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5、DELETE 请求服务器删除指定的页面。
6、CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7、OPTIONS 允许客户端查看服务器的性能。
8、TRACE 回显服务器收到的请求,主要用于测试或诊断。
16.使用 Socket 套接字需要传入哪些参数 ?
Address Family 和 Type,分别表示套接字应用场景和类型。
family 的值可以是 AF_UNIX(Unix 域,用于同一台机器上的进程间通讯),也可以是 AF_INET(对于 IPV4 协议的 TCP 和 UDP),至于 type 参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw 套接字)。
17.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 异步请求)
18.七层模型? IP ,TCP/UDP ,HTTP ,RTSP ,FTP 分别在哪层?
IP: 网络层
TCP/UDP: 传输层
HTTP、RTSP、FTP: 应用层协议
19.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