【Python考试题】-网络编程

【Python考试题】-网络编程

1.UDP 总结

【Python考试题】-网络编程_第1张图片

使用 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 总结

【Python考试题】-网络编程_第2张图片

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.请简单说一下三次握手和四次挥手?

【Python考试题】-网络编程_第3张图片

三次握手过程:

(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: 应用层协议

【Python考试题】-网络编程_第4张图片

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

你可能感兴趣的:(计算机网络,python)